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

JavaFXTableView禁用复选框

贡俊
2023-03-14

我创建了一个TableView,其中包含一个复选框列(isSelected)和三个信息列(姓名、姓氏、职务)。我想根据用户信息禁用一些复选框。例如,如果用户名为“Peter”,则Peter旁边的复选框将被禁用。但我不能。以下是我的一些代码:

人JAVA

public class Person {

private final SimpleStringProperty name;
private final SimpleStringProperty surname;
private final SimpleStringProperty job;
private final BooleanProperty isSelected;

public Person(SimpleStringProperty name, SimpleStringProperty surname, SimpleStringProperty job,
        BooleanProperty isSelected) {
    super();
    this.name = name;
    this.surname = surname;
    this.job = job;
    this.isSelected = isSelected;
}

public SimpleStringProperty getName() {
    return name;
}

public SimpleStringProperty getSurname() {
    return surname;
}

public SimpleStringProperty getJob() {
    return job;
}

public BooleanProperty getIsSelected() {
    return isSelected;
}



}

控制器。JAVA

public class Controller {

@FXML
private final TableView<Person> fxPersonTableView;

@FXML
private final TableColumn<Person, Boolean> fxSelectColumnCheckbox;

@FXML
private final TableColumn<Person, String> fxNameTableColumn;

@FXML
private final TableColumn<Person, String> fxSurnameTableColumn;

@FXML
private final TableColumn<Person, String> fxJobTableColumn;

private ObservableList<Person> persons;

private void createTableView(){

    fxSelectColumnCheckbox.setCellValueFactory(c -> c.getValue().getIsSelected());

    fxSelectColumnCheckbox.setCellFactory(CheckBoxTableCell.forTableColumn(c -> {
    //I guess here I will put some control like as name check and disable 
    //the checkbox in this row. But I can't reach the checkbox individually.
        return persons.get(c).getIsSelected();
    }));

    fxNameTableColumn.setCellValueFactory(c -> persons.get(c).getName());
    fxSurnameTableColumn.setCellValueFactory(c -> persons.get(c).getSurname());
    fxJobTableColumn.setCellValueFactory(c -> persons.get(c).getJob());
    fxPersonTableView.getSelectionModel.setSelectionMode(SelectionMode.MULTIPLE);
    fxPersonTableView.setItems(persons);


}



}

共有2个答案

滕无尘
2023-03-14

这将为您工作。

fxNameTableColumn.setCellFactory(column -> {
                return new TableCell<Person, String>() {
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        // Iterating through Table rows
                        TableRow<Person> currentRow = getTableRow();
                        if (item != null && !empty) {
                            if (item.equals("Peter")) {
                                // a row containing Peter name is found
                                // disable your check box  
                                setStyle(fxPersonTableView.getStyle());
                            } 
                        } else {
                            setStyle(fxPersonTableView.getStyle());
                        }
                    }
                };
            });
许彭祖
2023-03-14

谢谢@Ammar,我已经这样解决了,利用你的答案:

fxSelectColumnCheckbox.setCellFactory(column -> {
        return new CheckBoxTableCell<Person, Boolean>() {
            @Override
            public void updateItem(Boolean item, boolean empty) {
                super.updateItem(item, empty);

                TableRow<Person> currentRow = getTableRow();
                this.setDisable(false); // it is required to fit default state
                if (currentRow.getItem() != null && !empty) {
                    if (currentRow.getItem().getName().equals("Peter")) {
                        this.setDisable(true);
                        setStyle(fxPersonTableView.getStyle());
                    }
                } else {

                    setStyle(fxPersonTableView.getStyle());
                }
            }
        };
    });
 类似资料:
  • 这是不同的,因为它不是一个窗体,这个问题没有得到回答,因为没有for循环。

  • 问题内容: 我有一个JTable,我想用自定义渲染器尝试检查isEnabled()的所有禁用的复选框单元变灰,然后更改背景颜色,但仍然无法使用。有什么建议么?谢谢!!! 问题答案: 如“ 概念:编辑器和渲染器 ”中所述,“通常使用单个单元格渲染器来绘制包含相同类型数据的所有单元格。” 您需要维护表模型中的enabled状态。 附录:作为一个具体示例,此示例中的数据模型是一组简单的Date实例。ge

  • 选中“第一键”复选框时,我想选中并禁用“第二键”复选框 html代码 为复选框键入脚本代码 } 通过使用此代码,key 2复选框被选中并禁用。但是key 2复选框的布尔值仍然是假的。当我单击key 1复选框时,关于如何将key 2复选框的布尔值更改为true的任何建议我正在使用Angular 8及其反应式形式模块。我是角度新手。

  • 我正在创建复选框listview,下面是 它的工作but for循环是check1是falseexecute。但是数组列表的最后值为true执行 现在我想要arraylist复选框是获取“false”按钮是启用的。或“true”获取按钮被禁用如何编写条件帮助我

  • 我有一组单选按钮,如果选中“no”,它会显示一个包含6个复选框(不同的名称/ID)的DIV。如果选中“none”,我需要禁用其他复选框(如果不选中“none”,则再次启用)。我还需要标签将类添加到禁用的复选框中,就像我在下面的“添加到笔记本电脑的代码”复选框中所做的那样。 下面是我的演示: null null 我怎样才能把这个和我在这里面的其他脚本结合起来呢?

  • 问题内容: 如何在我的HTML表单中启用“提交”按钮,以及如果未选中此复选框则如何禁用? 此代码有什么问题? 复选框 问题答案: 将您的HTML更改为此: 原因不起作用:您没有传递任何函数。实际上,由于您没有在函数名称中使用括号,因此根本就没有调用函数。在HTML事件属性的上下文中传递它意味着您正在传递对该元素的DOM对象的引用,从而使您可以访问其属性。