【问题标题】:Customizing a TableView to have an "Add" button自定义 TableView 以具有“添加”按钮
【发布时间】:2016-12-25 19:54:40
【问题描述】:

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

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

为此,我可以在我的视图中添加一个带有动作侦听器和 yadda yadda 的按钮。

但这有点不连贯,我更喜欢直接在我的 TableView 上添加按钮。最好在右侧的“标题栏”之类的地方。

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

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

【问题讨论】:

  • 您是否尝试过使用BorderPaneVBox 执行此操作,将所有内容放在布局中(TableView, Buttons),遵循索引或默认行号以及行所在的状态是(空/填充)? (这只是一个建议)!
  • 你想要一个列单元格中的按钮吗?
  • @BoHalim 这基本上不是我正在寻找的解决方案。我可以那样做,但这不是我想要的
  • @LukeMelaia 这不是问题的重点。我有,但我已经在运行了。我想要整个 TableView 的“标题”和“菜单”,基本上

标签: java javafx tableview


【解决方案1】:

这个答案是基于这个gist

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

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

对于每一行中的-按钮,您需要自定义TableCell类的updateItem方法以允许每一行中的按钮。为了处理每一行按钮的操作,我们使用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);
    }
}

结果:

【讨论】:

    猜你喜欢
    • 2012-12-10
    • 2017-11-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多