如何在表格列中启用Check-Box启用禁用在JavaFX中,如果我选择一个复选框,我需要禁用剩余的复选框

问题描述 投票:0回答:1

如何在Table-Column中启用Check-Box enable禁用在JavaFX中,如果我选择一个复选框,我需要禁用剩余的复选框。

如果我选中一个复选框,我需要在JavaFx中禁用表视图中的剩余复选框。

colSelect.setCellFactory(new Callback<TableColumn<LogVoiceBroadCast, Boolean>, TableCell<LogVoiceBroadCast, Boolean>>()
{
   @Override
    public TableCell<LogVoiceBroadCast, Boolean> call(TableColumn<LogVoiceBroadCast, Boolean> param) {
        final TableCell<LogVoiceBroadCast, Boolean> cell = new TableCell<LogVoiceBroadCast, Boolean>() {
            @Override
            public void updateItem(Boolean value, boolean empty) {
                super.updateItem(value, empty);

                if (!empty || value != null) {

                    CheckBox checkBox = new CheckBox();
                    checkBox.setSelected(false);

                    checkBox.addEventHandler(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
                        @Override
                        public void handle(MouseEvent mouseEvent) {
                            if (!checkBox.isSelected()) {
                                LogVoiceBroadCast item = (LogVoiceBroadCast) getTableRow().getItem();
                                voiceFiles.add(item);

                            } else {
                                LogVoiceBroadCast item = (LogVoiceBroadCast) getTableRow().getItem();
                                voiceFiles.remove(item);

                            }

                        }
                    });

                    final HBox hbox = new HBox(checkBox);
                    hbox.setAlignment(Pos.CENTER);
                    hbox.setSpacing(12);
                    setGraphic(hbox);
                } else {
                    setGraphic(null);
                }
            }
        };
        cell.setAlignment(Pos.CENTER);
        return cell;
    }
});
javafx javafx-8 javafx-2
1个回答
0
投票

您不应该使用for输入事件来触发监听CheckBox状态的更改。而是添加一个监听器到CheckBox.selected属性。

此外,您需要实现一种恢复CheckBox状态的方法,因为不同的TableCells可用于“检查行”。使用一些可观察的数据结构来存储这种信息并使用监听器来更新CheckBoxes的状态:

TableView<Integer> table = new TableView<>();

for (int i = 0; i < 100; i++) {
    table.getItems().add(i);
}

TableColumn<Integer, Number> column = new TableColumn<>();
column.setCellValueFactory(cd -> new SimpleIntegerProperty(cd.getValue()));

// property to store the checked row item or null, if no row is checked
final ObjectProperty<Integer> selectedValue = new SimpleObjectProperty<>();

TableColumn<Integer, Void> checkBoxColumn = new TableColumn<>();
checkBoxColumn.setCellFactory(col -> new TableCell<Integer, Void>() {
    private final CheckBox checkBox = new CheckBox();

    private final ChangeListener<Boolean> selectionListener = (o, oldValue, newValue) -> {
        if (newValue) {
            // use the row item as selected item, when checkbox is selected
            selectedValue.set((Integer) getTableRow().getItem());
        } else {
            // clear selected item, when checkbox is unselected
            selectedValue.set(null);
        }
    };

    private final ChangeListener<Integer> listener = (o, oldValue, newValue) -> {
        if (!isEmpty()) {
            // update state without triggering the listener
            checkBox.selectedProperty().removeListener(selectionListener);
            if (newValue == null) {
                checkBox.setSelected(false);
                checkBox.setDisable(false);
            } else {
                boolean match = newValue.equals(getTableView().getItems().get(getIndex()));
                checkBox.setSelected(match);
                checkBox.setDisable(!match);
            }
            checkBox.selectedProperty().addListener(selectionListener);
        }
    };

    {
        // listener should not prevent garbage collection of cell
        selectedValue.addListener(new WeakChangeListener<>(listener));

        checkBox.selectedProperty().addListener(selectionListener);
        setAlignment(Pos.CENTER);
    }

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

        if (empty) {
            setGraphic(null);
        } else {
            setGraphic(checkBox);
            listener.changed(null, null, selectedValue.get());
        }
    }

});

table.getColumns().addAll(column, checkBoxColumn);
© www.soinside.com 2019 - 2024. All rights reserved.