【问题标题】:Can't set different values for my TableColumn in JavaFX无法在 JavaFX 中为我的 TableColumn 设置不同的值
【发布时间】:2016-09-06 13:42:05
【问题描述】:

我尝试在TableView 列中设置Button,但我没有成功设置不同的按钮。它在所有列上显示相同的按钮。

这个想法是正确设置了名称,但我的问题是当我设置cellValueFactory 时。这是我的代码:

for (int i = 0; i < listaPatchuriPerBaza.length; i++) {

    if (listaPatchuriPerBaza[i].contains(".sql")) {
        k = i;
        pozitie = poz;
        Patch pt = new Patch(listaPatchuriPerBaza[i], "Run" + " " + listaPatchuriPerBaza[i]);
        listaPatchuri.add(pt);
        masterData.add(pt);
        patchColumn.setCellValueFactory(new PropertyValueFactory<Patch, String>("denumire"));
        runColumn.setCellValueFactory(new PropertyValueFactory<Patch, String>("btnText"));
        runColumn.setCellFactory(new Callback<TableColumn<Patch, String>, TableCell<Patch, String>>() {

            @Override
            public TableCell<Patch, String> call(TableColumn<Patch, String> param) {

                Button btn = new Button(pt.getBtnText());

                //Set up the Table
                TableCell<Patch, String> cell = new TableCell<Patch, String>() {
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        if (item != null) {
                            //actioneaza butonul de run
                            btn.setOnAction((ActionEvent event) -> {
                                btn.setDisable(true);
                                Tooltip tool = new Tooltip("Running");
                                setTooltip(tool);
                                System.out.println("ruleaza");
                                try {
                                    SmbFile script = new SmbFile(path + pt.getDenumire(), userCred);

                                } catch (MalformedURLException e1) {
                                    // TODO Auto-generated catch block
                                    e1.printStackTrace();
                                }
                                try {

                                    SmbFile smbFromFile = new SmbFile(path + pt.getDenumire(), userCred);
                                    SmbFile smbToFile = new SmbFile(path + "Aplicate/" + pt.getDenumire(), userCred);
                                    smbFromFile.renameTo(smbToFile);
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            });
                            setGraphic(btn);

                        }
                    }

                };

                return cell;
            }
        });

    }

    tableView.setItems(masterData);

}

【问题讨论】:

  • 我不明白这里的for 循环:您是否要为表格中的每一行设置一次单元格值工厂和单元格工厂?
  • @James_D 是的,我想为列表中的每个元素设置,但我无法设置按钮。名字没问题。
  • 这没有意义。该列只有一个工厂用于值和一个工厂用于单元格。所以你只是在循环的每次迭代中替换它们。它们是工厂:即,它们被调用来根据需要创建对象。
  • @James_D 你能在我错的地方修改我的代码吗?
  • 在 Windows 中截屏的正确方法是:按住 Alt 并按一次 PrintScreen 键;按开始按钮,输入paint,回车;当画图窗口出现时,按住 Ctrl 并输入v;然后保存文件(PNG格式,应该是默认的)。

标签: java javafx tableview tablecolumn


【解决方案1】:

为表格中的每一行设置一次单元格值工厂和单元格工厂是没有意义的:您所做的就是在每次迭代循环时替换工厂。这些是工厂:即创建其他对象的对象。表格列将根据需要调用他们的call 方法来创建多个单元格等。

所以只需设置一次并在updateItem() 方法中更新按钮的文本。按钮需要是 cell 的属性(这样每个单元格都有自己的按钮,有自己的文本),而不是 cell factory 的属性(因为只有整个列的一个单元工厂)。

runColumn.setCellValueFactory(new PropertyValueFactory<Patch, String>("btnText"));
runColumn.setCellFactory(column -> new TableCell<Patch, String>() {
    Button btn = new Button();

    {
        btn.setOnAction(e -> {
            Patch pt = getTableView().getItems().get(getIndex());
            btn.setDisable(true);
            Tooltip tool = new Tooltip("Running");
            setTooltip(tool);
            System.out.println("ruleaza");
            try {
                SmbFile script = new SmbFile(path + pt.getDenumire(), userCred);

            } catch (MalformedURLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {

                SmbFile smbFromFile = new SmbFile(path + pt.getDenumire(), userCred);
                SmbFile smbToFile = new SmbFile(path + "Aplicate/" + pt.getDenumire(), userCred);
                smbFromFile.renameTo(smbToFile);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        });
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (item == null) {
            setGraphic(null);
        } else {
            btn.setText(item);
            setGraphic(btn);
        }
    }
});

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2017-01-29
    • 2019-05-27
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2018-05-04
    相关资源
    最近更新 更多