javafx 中具有不同单元格值的 TableView

2024-02-12

在下面的代码中有 4 列。在“特定值”列中,可以添加不同类型的数据,如字符串、整数、日期等。但我想在同一列中在该单元格中输入的值旁边添加一个按钮,前提是该值是字符串。

像这样的东西:

名字|姓氏|年龄|特别价值

詹姆斯 |史密斯| 10 | 10 10

雅各布|威斯利 | 20 | abc(按钮)

安娜|萨毛尔 | 15 | 15 45.5

如何仅针对特定单元格(即包含字符串值)在同一列中添加按钮?

package application;

import java.time.LocalDateTime;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.stage.Stage;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;

public class Main extends Application {

    private final TableView<Person<?>> tableView = new TableView<>();

    private Person<Integer> person1 = new Person<>("Jacob", "Smith", 28, 4);
    private Person<Integer> person2 = new Person<>("Isabella", "Johnson", 19, 5);
    private Person<String> person3 = new Person<>("Bob", "The Sponge", 13, "Say Hi!");
    private Person<LocalDateTime> person4 = new Person<>("Time", "Is Money", 45, LocalDateTime.now());
    private Person<Double> person5 = new Person<>("John", "Doe", 32, 457.89);

    private final ObservableList<Person<?>> data = FXCollections.observableArrayList(person1, person2, person3, person4,
            person5);

    @SuppressWarnings("unchecked")
    @Override
    public void start(Stage primaryStage) {

        TableColumn<Person<?>, String> firstNameCol = new TableColumn<>("First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));

        TableColumn<Person<?>, String> lastNameCol = new TableColumn<>("Last Name");
        lastNameCol.setMinWidth(100);
        lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));

        TableColumn<Person<?>, Integer> ageCol = new TableColumn<>("Age");
        ageCol.setMinWidth(50);
        ageCol.setCellValueFactory(new PropertyValueFactory<>("age"));

        TableColumn<Person<?>, ?> particularValueCol = new TableColumn<>("Particular Value");
        particularValueCol.setMinWidth(200);
        particularValueCol.setCellValueFactory(new PropertyValueFactory<>("particularValue"));

        tableView.setItems(data);

        // Type safety: A generic array of Table... is created for a varargs
        // parameter
        // -> @SuppressWarnings("unchecked") to start method!
        tableView.getColumns().addAll(firstNameCol, lastNameCol, ageCol, particularValueCol);

        // Output in console the selected table view's cell value/class to check
        // that the data type is correct.
        SystemOutTableViewSelectedCell.set(tableView);

        // To check that table view is correctly refreshed on data changed..
        final Button agePlusOneButton = new Button("Age +1");
        agePlusOneButton.setOnAction((ActionEvent e) -> {
            Person<?> person = tableView.getSelectionModel().getSelectedItem();
            try {
                person.setAge(person.getAge() + 1);
            } catch (NullPointerException npe) {
                //
            }
        });

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(tableView, agePlusOneButton);

        Scene scene = new Scene(new Group());
        ((Group) scene.getRoot()).getChildren().addAll(vbox);

        primaryStage.setWidth(600);
        primaryStage.setHeight(750);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    public static class Person<T> {

        private final StringProperty firstName;
        private final StringProperty lastName;
        private final IntegerProperty age;
        private final ObjectProperty<T> particularValue;

        private Person(String firstName, String lastName, Integer age, T particularValue) {
            this.firstName = new SimpleStringProperty(firstName);
            this.lastName = new SimpleStringProperty(lastName);
            this.age = new SimpleIntegerProperty(age);
            this.particularValue = new SimpleObjectProperty<T>(particularValue);
        }

        public String getFirstName() {
            return firstName.get();
        }

        public void setFirstName(String firstName) {
            this.firstName.set(firstName);
        }

        public StringProperty firstNameProperty() {
            return firstName;
        }

        public String getLastName() {
            return lastName.get();
        }

        public void setLastName(String lastName) {
            this.lastName.set(lastName);
        }

        public StringProperty lastNameProperty() {
            return lastName;
        }

        public Integer getAge() {
            return age.get();
        }

        public void setAge(Integer age) {
            this.age.set(age);
        }

        public IntegerProperty ageProperty() {
            return age;
        }

        public T getParticularValue() {
            return particularValue.get();
        }

        public void setParticularValue(T particularValue) {
            this.particularValue.set(particularValue);
        }

        public ObjectProperty<T> particularValueProperty() {
            return particularValue;
        }
    }

    public static final class SystemOutTableViewSelectedCell {
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public static void set(TableView tableView) {

            tableView.getSelectionModel().setCellSelectionEnabled(true);

            ObservableList selectedCells = tableView.getSelectionModel().getSelectedCells();

            selectedCells.addListener(new ListChangeListener() {
                @Override
                public void onChanged(Change c) {
                    TablePosition tablePosition = (TablePosition) selectedCells.get(0);
                    Object val = tablePosition.getTableColumn().getCellData(tablePosition.getRow());
                    System.out.println("Selected Cell (Row: " + tablePosition.getRow() + " / Col: "
                            + tablePosition.getColumn() + ") Value: " + val + " / " + val.getClass());
                }
            });
        }
    }

}

你可以做:

TableColumn<Person<?>, Object> particularValueCol = new TableColumn<>("Particular Value");
particularValueCol.setMinWidth(200);
particularValueCol.setCellValueFactory(new PropertyValueFactory<>("particularValue"));

particularValueCol.setCellFactory(tc -> new TableCell<Person<?>, Object>() {
    private Button button = new Button("A button");

    @Override
    protected void updateItem(Object item, boolean empty) {
        super.updateItem(item, empty) ;
        if (empty || item == null) {
            setText(null);
            setGraphic(null);
        } else {
            setText(item.toString());
            if (item instanceof String) {
                setGraphic(button);
            } else {
                setGraphic(null);
            }
        }
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javafx 中具有不同单元格值的 TableView 的相关文章

  • Gluon 移动 iOS 音频播放器

    由于 JavaFx Media 尚未移植到移动平台 任何人都可以帮助我使用本机 iOS APi 来播放声音 mp3 文件 该文件将存储在我的 gluon 项目的 main resources 文件夹中 在 Android 上 我们可以轻松地
  • 复选框选择与 TableView 绑定

    How to bind with TableView selection model with checkbox isSelected in table view In manually using mouse multiple selec
  • JavaFX 中的自定义双向绑定

    我正在尝试实现一个涉及 2 个字段计算的 GUI 我的模型有 2 个属性和 1 个绑定 ObjectProperty
  • 错误:无法初始化主类 FileChooser_1 原因:java.lang.NoClassDefFoundError:阶段 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在这里编写了以下代码 我无法运行该程序 并且不断出现下面提到的错误 我尝试了很多可能的解决方案 但都是徒劳 import java
  • 当线程完成这项工作时,我是否需要使用 JavaFX 中的线程和任务在后台运行某些内容?

    我正在使用一个线程定期运行三秒的背景动画 我改编了用 Swing 编写的线程演示示例中的相关代码并使用 它取代了一个不太工作的早期版本 该版本同时使用了线程和任务 我的程序在播放视频或运行动画时停止 挂起线程 并在结束视频或动画时启动新线程
  • 更改在不同场景中输入的新场景中的标签文本(javafx)

    我正在尝试更改标签中的文本 该文本是在不同场景的文本字段中输入的文本 我制作了 2 个 FXML 文件 第一个包含一个文本字段和 确定 按钮 第二个包含一个标签 带有文本 标签 我的目标是在文本字段中输入文本 当我按 确定 gt 打开新场景
  • 如何将 AdMob 广告添加到 UITableView

    我正在尝试将 AdMob 广告添加到表格视图中 我希望它出现在每 10 个单元格中 例如 如果您有 Reddit 应用程序的免费版本 就像它一样 我尝试遵循 AdMob 文档 但没有任何运气 而且我确信我遗漏了一些东西 任何人都可以阐明一种
  • JavaFX 模块对于 VM 不可见

    我使用 Intellij Idea 作为我的 IDE 由于我需要使用 css 文件 因此我安装了 Intellij Ultimate 现在 javaFx 不适用于它们 抛出异常 boot层初始化时出错 java lang module Fi
  • 在 Javafx 中单击内部时,透明舞台不应最小化

    我正在学习在 JavaFx 中创建屏幕录制应用程序 我希望用户调整矩形的大小来决定屏幕捕获区域 我已将舞台和场景设为透明primaryStage initStyle StageStyle TRANSPARENT and scene setF
  • JavaFX:setWrapText(true) (WordWrap) 在 ListView 中不起作用

    在 ListView Cell 中激活 WordWrap 时 文本不会换行 这是一个例子 public class ListBug extends Application public static void main String arg
  • 如何调整Javafx未装饰阶段的大小?

    我是JavaFX技术的新手 目前我正在开发javafx应用程序 其中有未装饰的阶段 我能够使用下面的代码将其移动到屏幕上 但我是无法从右下角调整此窗口的大小 任何人都可以建议我解决方案 public void loadPanel final
  • 如何将 CSS 样式表附加到 FXML?

    遵循 Oracle 教程http docs oracle com javafx 2 get started fxml tutorial htm http docs oracle com javafx 2 get started fxml t
  • JavaFX 多线程 - 连接线程不会更新 UI

    我正在尝试创建一个加载程序对话框 用户可以在其中知道程序正在加载所请求的内容并且程序正在按预期运行 但正因为如此 我需要join 解析器线程和之前继续主线程 这使得对话框空白 解析器任务 java public class ParserTa
  • 无法启动使用 Apache POI 的 JavaFX 应用程序

    我有一个按预期工作的 JavaFX 应用程序 我需要使用 Apache POI 来读取和写入 excel 文件 以下是我已采取的步骤 添加了所需的依赖 implementation org apache poi poi ooxml 5 2
  • JavaFx GridPane布局如何为行中的元素设置边距?

    我正在使用 GridPane 布局在我的应用程序中定位事物 我想知道如何为 row 中的元素设置边距 GridPane setConstraints chip5 1 1 1 1 HPos RIGHT VPos TOP I want to s
  • JavaFX 按钮不会禁用

    我有一个可能需要几秒钟到几分钟的任务 当我单击按钮执行该任务时 它会运行该任务但并不总是禁用按钮A和启用按钮B 这是我正在使用的代码 FXML public void onExecute ActionEvent event btnExecu
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • 绘制圆和连接这些圆的曲线

    我需要绘制一些圆圈和连接这些圆圈的曲线 圆圈必须以行和列的方式绘制 所以我想使用 GridPane 将是一个不错的选择 但是 绘制完所有圆圈后 如何添加曲线来连接属于此 GridPane 上不同列的圆圈 我无法将 GridPane add
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android

随机推荐

  • 仅解析包含字符串和值的 JSON 对象

    我在尝试解析最小值以在 Android 中进行映射时遇到问题 有一些示例 JSON 格式 其中包含更多信息 例如 id 1 name sql id 2 name android id 3 name mvc 这是最常用且易于使用的示例 只需使
  • ConcurrentHashmap 同时进行写入和获取操作

    我有一个关于 ConcurrentHashMap 的问题 假设我有 2 个线程 线程 A 尝试从共享 ConcurrentHashMap 中获取对象 线程B清除共享映射 如果线程 A 和线程 B 同时访问共享资源 会发生什么情况 我搜索了文
  • 从按下的按钮获取文本

    如何从按下的按钮获取文本 安卓 我可以从按钮获取文本 String buttonText button getText 我可以从按下的按钮获取 id int buttinID view getId 目前我不知道如何获取按下的按钮上的文本 p
  • 规划网络应用程序

    我即将开始建立新的初创公司 因此我需要您的一些指导 规划网站的最佳方法是什么 我不认为 首先设计 然后数据库关系 然后开始开发 而是 如何规划应用程序的工作方式 是否有一些经过验证的方法 例如制作网站 蓝图 的最佳方法 例如使用某种工具或其
  • Docker php:fpm—安装 php 扩展

    我用的是官方的php fpmdocker 镜像作为我的应用程序容器的基础 所以Dockerfile像这样开始 FROM php fpm 稍后在文件中我希望有类似的内容 RUN apt get install y php7 0 gd 但这告诉
  • 连续分数

    我对连续分数的理解是它总是以分数形式表示小数 我认为连续分数总是返回小于或等于小数的值 不幸的是 我的代码有时会返回大于十进制输入的小数值 我对连续分数的理解正确吗 如果是这样 请解释一下我的代码中的错误所在 public static R
  • JavaScript 获取样式

    是否可以使用 JavaScript 获取对象的所有样式 就像是 main css myLayer position absolute width 200px height 100px color 0000ff main js var ob
  • 在 ASP.NET MVC 5 中从 Facebook v2.4 API 访问 OAuthExternalLoginCallback 中的电子邮件地址[重复]

    这个问题在这里已经有答案了 对于 Facebook API v2 3 如果设置了以下内容 用户的电子邮件地址将在回调中返回ExternalLoginCallback app UseFacebookAuthentication new Fac
  • Apache Tomcat 8 不工作。抛出 HTTP 状态 500 - java.lang.ClassNotFoundException: org.apache.jsp.index_jsp

    我正在使用 Apache Tomcat 8 和 JDK 1 7 运行 startup bat 后 Tomcat 开始运行 但当我尝试跑步时 http localhost 8080 它显示一个错误 HTTP 状态 500 java lang
  • 提交到 Web 服务器的希伯来语字符串未收到希伯来语版本

    我从我的应用程序向网络服务器提交注册表单 EditText email EditText findViewById R id email EditText password EditText findViewById R id passwo
  • 使用 cin 检查空行

    我想检查是否有空行作为输入来执行特定操作 我尝试使用 cin peek 并检查它是否等于 n 但它没有意义 a b c 空行 在这里 我想执行我的操作 a 我试过这段代码 char a b c cin gt gt a cin gt gt b
  • MS Access 中的一对一关系

    我在 MS Access 中的两个表之间创建一对一关系时遇到问题 当我创建关系时 它默认为 多对一 并且我没有看到更改它的选项 有没有办法做到这一点 Access没有这样的概念 您可以将两个表合并为一个表 也可以在两个表上为公共字段放置唯一
  • Tomcat 访问日志中的 HTTP 状态代码 500 ClientAbortException / 管道损坏

    我们使用 Kibana 设置了一些仪表板和可视化 以监控 tomcat 为 Spring Boot Web 应用程序生成的访问日志 我们特别关注状态代码为 5xx 的请求 事实证明 如果客户端请求资源 并且在请求正在进行时取消该请求 使用C
  • 在 vb.net 中关闭数据读取器的正确点

    我在 vb net 中有这段代码 reader myCommand ExecuteReader If reader HasRows Then While reader read End While End If 我应该在之后使用 reade
  • 闪亮:动态更改选项卡名称

    我正在开发一个应该处理多种语言的闪亮应用程序 我设法动态翻译应用程序的几乎所有元素 具体取决于selectInput选择语言 然而 困难的事情 仍然是navbarPage选项卡以及tabPanels在我的页面内 我不能改变他们的名字 我尝试
  • 美丽的汤和表抓取 - lxml 与 html 解析器

    我正在尝试使用 BeautifulSoup 从网页中提取表格的 HTML 代码 table class facts label table 我想知道为什么下面的代码适用于 html parser 并打印回来none如果我改变 html pa
  • 什么是顶点数组对象?

    我今天刚刚开始从本教程学习 OpenGL http openglbook com the book http openglbook com the book 我读到了第二章 画了一个三角形 除了 VAO 这个缩写可以吗 之外 我理解了所有内
  • iOS 7/8 UITableView Cell:两个具有动态高度的 UILabel,具有可变行高的自动布局

    因此 当我只有一个标签可以根据字符串的长度更改高度时 我可以使用自动布局设置动态高度大小 我的问题是 如果我添加另一个应该执行相同操作的 UILabel 事情就不会成功 我将内容拥抱优先级和压缩阻力都设置为 1000 我收到歧义警告 如果我
  • INNER JOIN 独特 ID

    我有以下代码 FROM CTE Order cte INNER JOIN tblOrders o ON cte OrderId o Id INNER JOIN tblOrderUnits ou ON o id ou OrderId INNE
  • javafx 中具有不同单元格值的 TableView

    在下面的代码中有 4 列 在 特定值 列中 可以添加不同类型的数据 如字符串 整数 日期等 但我想在同一列中在该单元格中输入的值旁边添加一个按钮 前提是该值是字符串 像这样的东西 名字 姓氏 年龄 特别价值 詹姆斯 史密斯 10 10 10