自定义TableView以获得"添加"按键

时间:2016-12-25 19:54:40

标签: java javafx tableview

我的fxml中有一个TableView作为复杂POJO的容器。

我已经成功定制了显示,为我所说的复杂POJO的每个实例提供了一个漂亮的窗格,但现在我想编辑基础集合。

为此,我可以在我的视图中添加一个Button,其中包含一个动作监听器和yadda yadda。

但这有点不连贯,我更喜欢直接在我的TableView上添加按钮。最好是像标题栏"在右侧。

我使用GridPane做了类似的事情,但并不想完全重构我的代码,所以这里是我想要实现的效果的屏幕保护程序:

最上面一行是表格标题,因此风格稍有不同。我错过了一些非常简单的东西吗?

1 个答案:

答案 0 :(得分:1)

此答案基于此gist

对于标题中的+按钮,您只需创建一个TableColumn并将其图形设置为一个按钮。

Button addButton = new Button("+"); 
TableColumn<Person, Object> buttonColumn = new TableColumn<>();
buttonColumn.setGraphic(addButton);

对于每行中的-按钮,您需要自定义updateItem类的TableCell方法以允许每行中的按钮。为了处理每一行的按钮操作,我们使用CallBack

public class ButtonTableCell<S,T> extends TableCell<S,T> {

    private Button button;

    public ButtonTableCell(final Callback<Integer, Void> pressedCallback) {
        this(pressedCallback, null, null);
    }

    public ButtonTableCell(final Callback<Integer, Void> pressedCallback, String buttonText, Node buttonGraphic) {
        this.button = new Button(buttonText, buttonGraphic);
        this.button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                pressedCallback.call(getTableRow().getIndex());
            }
        });
    }

    @Override
    protected void updateItem(T item, boolean empty) {
        super.updateItem(item, empty);
        if(empty) {
            setGraphic(null);
        } else {
            setGraphic(button);
            button.disableProperty().bind(Bindings.not(
                    getTableView().editableProperty().and(
                    getTableColumn().editableProperty()).and(
                    editableProperty())
                ));
        }
    }
}

然后使按钮列CellFactory使用此修改后的TableCell

public class TableViewWithButtonColumnDemo extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        TableView<Person> tableview = new TableView<>(
            FXCollections.observableArrayList(
                new Person("Person", "1"),
                new Person("Person", "2"),
                new Person("Person", "3")));

        TableColumn<Person, String> firstNameColumn = new TableColumn<>("First Name");
        firstNameColumn.setCellValueFactory(new PropertyValueFactory("firstName"));
        TableColumn<Person, String> lastNameColumn = new TableColumn<>("Last Name");
        lastNameColumn.setCellValueFactory(new PropertyValueFactory("lastName"));

        Button addButton = new Button("+");
        addButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                tableview.getItems().add(new Person("person", String.valueOf(tableview.getItems().size()+1)));
            }
        });

        TableColumn<Person, Object> buttonColumn = new TableColumn<>();
        buttonColumn.setGraphic(addButton);
        buttonColumn.setCellFactory(new Callback<TableColumn<Person,Object>, TableCell<Person,Object>>() {
            @Override
            public TableCell<Person, Object> call(TableColumn<Person, Object> param) {
                Callback<Integer, Void> pressedCallback = new Callback<Integer, Void>() {
                    @Override
                    public Void call(Integer index) {
                        Person buttonPressedPerson = tableview.getItems().get(index);
                        tableview.getItems().remove(buttonPressedPerson);
                        return null;
                    }
                };
                return new ButtonTableCell<>(pressedCallback, "-", null);
            }
        });

        tableview.setEditable(true);
        tableview.getColumns().addAll(firstNameColumn, lastNameColumn, buttonColumn);

        primaryStage.setScene(new Scene(tableview));
        primaryStage.show();
    }

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

结果:

enter image description here