Java 向TableView添加不同的按钮

Java 向TableView添加不同的按钮,java,uitableview,javafx,Java,Uitableview,Javafx,我发现了如何在行的TableView中插入按钮,但我不确定如何为该按钮添加不同的值: column .setCellFactory(new Callback<TableColumn<GuiObject, Boolean>, TableCell<GuiObject, Boolean>>() { @Override public TableCell<GuiObject,

我发现了如何在行的TableView中插入按钮,但我不确定如何为该按钮添加不同的值:

column
    .setCellFactory(new Callback<TableColumn<GuiObject, Boolean>, TableCell<GuiObject, Boolean>>() {
                    @Override
                    public TableCell<GuiObject, Boolean> call(
                            TableColumn<GuiObject, Boolean> p) {

                        return new ButtonCell();
                    }

                });
列
.setCellFactory(新回调函数(){
@凌驾
公用电话(
表2(第p列){
返回新的ButtonCell();
}
});

其中ButtonCell是用于
TableCell
的自实现按钮,但我希望能够根据插入的行动态插入不同的按钮

如果您从java访问TableView,如下所示:

@FXML
TableView myTable;

@Override
public void initialize(URL url, ResourceBundle rb) {
    TableColumn<Item, String> firstColumn = new TableColumn<>("First Column");
    firstColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Item, String>, ObservableValue<String>>() {
        @Override
        public ObservableValue<String> call(TableColumn.CellDataFeatures<Item, String> p) {
            return new ReadOnlyObjectWrapper(p.getValue().column1);
        }
    });

    TableColumn<Item, String> secondColumn = new TableColumn<>("Second Column");
    secondColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Item, String>, ObservableValue<String>>() {
        @Override
        public ObservableValue<String> call(TableColumn.CellDataFeatures<Item, String> p) {
            return new ReadOnlyObjectWrapper(p.getValue().column2);
        }
    });

    TableColumn<Item, Button> buttonCol = new TableColumn<>("ButtonColumn");
    buttonCol.setSortable(false);
    buttonCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Item, Button>, ObservableValue<Button>>() {
        @Override
        public ObservableValue<Button> call(TableColumn.CellDataFeatures<Item, Button> features) {
            return new ReadOnlyObjectWrapper(features.getValue().button);
        }
    });
    myTable.getColumns().add(buttonCol);
    myTable.getColumns().add(firstColumn);
    myTable.getColumns().add(secondColumn);
    myTable.getItems().add(new Item("Test 1", "Test 1", new Button("Test 1"), new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent t) {
            //ON ACTION CODE HERE
            System.out.println("TEST 1 CLICKED!");
        }
    }));
    myTable.getItems().add(new Item("Test 2", "Test 2", new Button("Test 2"), new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent t) {
            //ON ACTION CODE HERE
            System.out.println("TEST 2 BUTTON CLICKED");
        }
    }));
}
证明它有效:

多亏了Cobbles的代码,我修复了最后一期。我只是添加了一个方法
addbutton()
,它为新行添加了一个按钮,并为Item类型的现有对象提供了功能:

private void addAddButton() {
        Button b = new Button(" + ");
        final Item item = new Item(="<new>",
                "<new>", b);
        b.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent t) {
                Button deleteButton = new Button(" - ");
                deleteButton.setOnAction(new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent t) {
                        selectedItems.remove(item); // a predefined list of selected items
                        myTable.getItems().clear();
                        for (Item current : selectedItems) {
                            myTable.getItems().add(current);
                        }
                        addAddButton();
                    }
                });
                item.setButton(deleteButton);
                selectedItems.add(item);

                myTable.getItems().clear();
                for (Item current : selectedItems) {
                    myTable.getItems().add(current);
                }
                addAddButton();
            }
        });

        tableAvailabilites.getItems().add(ga1);
    }
private void addbutton(){
按钮b=新按钮(“+”);
最终项目=新项目(“”,
“(b);
b、 setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent t){
按钮deleteButton=新按钮(“-”);
deleteButton.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent t){
selectedItems.remove(item);//所选项目的预定义列表
myTable.getItems().clear();
对于(当前项目:selectedItems){
myTable.getItems().add(当前);
}
addButton();
}
});
item.setButton(删除按钮);
选择编辑项。添加(项);
myTable.getItems().clear();
对于(当前项目:selectedItems){
myTable.getItems().add(当前);
}
addButton();
}
});
tableAvailabilites.getItems().add(ga1);
}

它还不是超级高效,但它正在工作

对不起,我的错,按钮扩展了
TableCell
,而不是
TableColumn
我添加了很多额外的代码,在第三列添加了一个按钮。我从另一个问题中借用了一些代码不,有两件事我不懂。首先,什么是频率表?第二,在哪里设置参数传递的按钮?您有一个StackPane,但没有将其附加到任何东西上。而且您从未为addButton分配新值。它应该是这样的:我希望基本上在每一行旁边都有一个delete按钮,这样我就可以从表中删除该行,然后在底部用“”填充一行对于每一个字段和这一行旁边,我想有一个添加按钮,这样我就可以将这一行添加到列表中。看看更新的答案,我特别为你写了一些新的东西,我希望它能起作用。这对我来说绝对有效
private void addAddButton() {
        Button b = new Button(" + ");
        final Item item = new Item(="<new>",
                "<new>", b);
        b.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent t) {
                Button deleteButton = new Button(" - ");
                deleteButton.setOnAction(new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent t) {
                        selectedItems.remove(item); // a predefined list of selected items
                        myTable.getItems().clear();
                        for (Item current : selectedItems) {
                            myTable.getItems().add(current);
                        }
                        addAddButton();
                    }
                });
                item.setButton(deleteButton);
                selectedItems.add(item);

                myTable.getItems().clear();
                for (Item current : selectedItems) {
                    myTable.getItems().add(current);
                }
                addAddButton();
            }
        });

        tableAvailabilites.getItems().add(ga1);
    }