Javafx tableview 上的复选框取消选中,禁用同一行但不同列上的按钮

标签 java javafx javafx-tableview

下图解释了我如何填充表格: enter image description here

如您所见,一旦取消选中相关行的 Collected 列复选框,我就需要禁用 Installments 列按钮,反之亦然。

到目前为止,这是我的方法:

colected_column.setCellValueFactory((TableColumn.CellDataFeatures<Member, CheckBox> param) -> {
        Member mRow = param.getValue(); // type objects contained within the TableView
        CheckBox checkBox = new CheckBox();
        checkBox.selectedProperty().addListener((ov, old_val, new_val) -> {

            // javafx.scene.control.Button typed ObservableValue returns as cell value
            Button button = installments_column.getCellData(mRow);
            button.setDisable(!new_val);
        });

      ...
      return new SimpleObjectProperty<>(checkBox);
}

但是这种方式不符合要求,按钮一直保持启用状态。任何帮助将不胜感激。谢谢。

enter image description here

最佳答案

不要将节点放入项目类中。这样一来,您就破坏了 TableView 的主要优点:将节点数量限制为显示内容所需的数量。

您最好在 Member 对象中使用 BooleanProperty,使用 CheckBoxTableCell 显示 CheckBoxes 和使用自定义单元格作为分期付款列:

TableColumn<Member, Boolean> colected_column = ...;

colected_column.setCellValueFactory((TableColumn.CellDataFeatures<Member, Boolean> param) -> {
    Member mRow = param.getValue(); // type objects contained within the TableView
    return nRow.collectedProperty();
});
colected_column.setCellFactory(CheckBoxTableCell.forTableColumn(colected_column));
TableColumn<Member, Boolean> installmentsColumn = ...;
installmentsColumn.setCellValueFactory(cd -> cd.getValue().collectedProperty());
installmentsColumn.setCellFactory(column -> new TableCell<Member, Boolean>() {

    private final Button button = new Button("View Info");

    {
        button.setOnAction(evt -> {
            Member member = (Member) getTableRow().getItem();

            // TODO: handle button click
        });
    }

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

        if (empty || item == null) {
            setGraphic(null);
        } else {
            setGraphic(button);
            button.setDisable(!item);
        }
    }
});
public class Member {
    private final BooleanProperty collected = new SimpleBooleanProperty(true);

    public void setCollected(boolean value) {
        collected.set(value);
    }

    public boolean isCollected() {
        return collected.get();
    }

    public BooleanProperty collectedProperty() {
        return collected;
    }

    ...
}

关于Javafx tableview 上的复选框取消选中,禁用同一行但不同列上的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50093818/

相关文章:

java - 如何在 TableView javafx 中使用 ComboBoxTableCell 或 ChoiceBoxTableCell 选择多个值

java - 无法使用 Java 运行 linux 命令

java - 获取 Java boolean 值的倒数的最简洁方法是什么?

java - 如何将信息从 java 发送到 windows 任务栏到 javafx

JavaFX TableView : Rapid change in items list not reflected

Javafx tableview 将 cellValueFactory 内的更改绑定(bind)到表 observablelist

java - Python 的 Numpy np.random.choice 的 Java 等价物是什么?

java - 单元测试、调试和运行模式下的模拟对象

忘记了标签的 Java FX 颜色

JavaFX 重复@FXML 标签解决方法