java - 无法在 JavaFX 中为我的 TableColumn 设置不同的值

标签 java javafx tableview tablecolumn

我尝试在 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);

}

最佳答案

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

因此只需设置一次并在 updateItem() 方法中更新按钮的文本即可。该按钮需要是单元格的属性(以便每个单元格都有自己的按钮和自己的文本),而不是单元格工厂的属性(因为只有整个柱的一个细胞工厂)。

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);
        }
    }
});

关于java - 无法在 JavaFX 中为我的 TableColumn 设置不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39350534/

相关文章:

ios - 错误: Use the unresolved identifier 'indexPath' in prepareForSeque function

java - javafx 中的标签未随线程自动更新

iOS7 searchDisplayController 隐藏 tableview 索引

java - 代码抛出 IndexOutOfBoundsException?

Java:面向对象设计;链表和栈

java - 正确取消启动 ExecutorService 的 JavaFX 任务

java - 哪些平台支持/将支持 JavaFX?

ios - TableViewcell 与内部 tableView 的高度

java - 在哪里放置配置文件?

java - 逐行在属性文件中添加注释