当前位置: 首页 > 知识库问答 >
问题:

如何根据表中的布尔属性启用/禁用按钮

司马奇希
2023-03-14

正如标题所述,我正在尝试根据表行数据中的布尔值启用/禁用表行中的按钮。到目前为止,这是我的代码:

col.setCellFactory(new Callback<TableColumn<ExampleRow, String>, TableCell<ExampleRow, String>>() {
        @Override
        public TableCell call(final TableColumn<ExampleRow, String> param){
            final Button btn = new Button("Save");
            final TableCell<ExampleRow, String> cell = new TableCell<ExampleRow, String>(){

                @Override
                public void updateItem(String item, boolean empty){
                    super.updateItem(item, empty);
                    if(empty){
                        setGraphic(null);
                        setText(null);
                    } else {
                        btn.setPrefWidth(col.getWidth());
                        btn.setPadding(Insets.EMPTY);
                        btn.setOnAction(event -> {

                        });
                        setGraphic(btn);
                        setText(null);
                    }
                }
            };
            ExampleRow row = (ExampleRow)cell.getTableRow().getItem(); //NPE here
            btn.setDisable(!row.hasChanged());
            return cell;
        }
    });

不幸的是,我的代码在底线的第五行中断。如果我排除该行并将下面的行更改为btn.setDisable(true),它会非常有效。我可以根据按钮所在的数据禁用此按钮吗?

共有1个答案

呼延才俊
2023-03-14

您无论如何都不会使用该项,因此可以将其设置为布尔值,并使用更改的属性的值。这允许您启用/禁用updateItem方法中的按钮:

例子:

public static class Item {
    private final BooleanProperty changed = new SimpleBooleanProperty();

    public final boolean isChanged() {
        return this.changed.get();
    }

    public final void setChanged(boolean value) {
        this.changed.set(value);
    }

    public final BooleanProperty changedProperty() {
        return this.changed;
    }

}

@Override
public void start(Stage primaryStage) {
    TableView<Item> table = new TableView();
    table.getItems().addAll(new Item(), new Item(), new Item());

    TableColumn<Item, Boolean> column = new TableColumn<>();
    column.setCellValueFactory(cd -> cd.getValue().changedProperty());
    column.setCellFactory(col -> new TableCell<Item, Boolean>() {

        final Button btn = new Button("Save");

        {
            btn.setOnAction(evt -> {
                Item item = (Item) getTableRow().getItem();
                item.setChanged(false);
            });
        }

        @Override
        protected void updateItem(Boolean item, boolean empty) {
            super.updateItem(item, empty);

            if (empty || item == null) {
                setGraphic(null);
            } else {
                btn.setDisable(!item);
                setGraphic(btn);
            }
        }

    });

    table.getColumns().add(column);

    Button btn = new Button("change");
    btn.setOnAction((ActionEvent event) -> {
        Item item = table.getSelectionModel().getSelectedItem();
        if (item != null) {
            item.setChanged(true);
        }
    });

    VBox root = new VBox(btn, table);

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}

顺便说一句:TableView使用cellFactory创建单元格。表行属性稍后更新。因此,在cellFactory调用方法本身中检索任何这些值都没有意义,因为当时没有分配任何这些值。

 类似资料:
  • 由于这里的答案,我拥有了当前的设置。如何根据是否按下父按钮禁用子按钮?例如,Button2当前被禁用,但当我按下Button1时,我现在可以按下Button2,如果我按下Button2,Button3和Button4将被启用,现在可以按下。到目前为止,我的做法如下:声明一个布尔值: 单击按钮时将Enable从false更改为true: } 禁用除第一个按钮外的所有其他按钮,并且在按下按钮之前,由于

  • 问题内容: 我在表中列出了用户列表。 活动用户应在非活动用户上方排序。 我正在尝试使用lodash 函数进行此操作,但未成功。 这里是如何的外观: 这是带有用户数组和sortBy loadsh函数代码的代码笔:https ://codepen.io/nikolatrajkovicq/pen/pGXdpM?editors = 1112 任何地方都欢迎。 问题答案: 您可以这样使用: 您可以只减去中的

  • 问题内容: 我想启用/禁用没有jQuery的按钮。这是我的代码: 作品。但这不是-按钮保持禁用状态: 问题答案: 是一个布尔属性,仅它的存在就会导致元素被禁用,无论该属性的值实际是多少。这就是为什么您可以通过将属性设置为来禁用JavaScript中的元素的原因,您可以将其设置为任何值(这就是为什么将其设置为禁用状态的原因)。 在HTML中,您甚至根本不需要为属性设置一个值: 但是,建议使用布尔属性

  • 问题内容: 我有一个值列表,需要根据给定的布尔值列表中的值进行过滤: 我使用以下行生成一个新的过滤列表: 结果是: 这条线工作正常,但是(对我而言)看起来有点过大了,我想知道是否有更简单的方法来实现这一目标。 忠告 以下答案提供了两个好的建议: 1-不要像我一样命名列表,因为它是内置函数。 2-不要比较像我做的事情,因为这是不必要的。只需使用就足够了。 问题答案: 您正在寻找: 时序比较(py3.

  • 问题内容: 我想禁用Fieldset内的所有元素,但要启用其中的几个按钮。 演示: 问题答案: 试试这个: HTML: 脚本:

  • 我是检票口开发的初学者。我有一个关于弹出对话框的问题。当我点击按钮时会触发此对话框。 此对话框包含一个复选框(Accept terms)和下面的几个单选按钮,以及两个按钮,一个是cancel,另一个是Accept。 我的问题是,我需要确保,我选择了复选框和一个无线电来设置按钮“Accept”以启用状态,否则它应该被密封(enabled=false)。 问题是单选按钮位于不同的文件中(它们位于其他文