javafx - 当选择一个时 TableView 中的复选框,行中的其他复选框被禁用

标签 java javafx tableview

我有一个包含 3 列和复选框的表格 View 。当选中一个复选框时,行中的其他复选框将被禁用。我有一个带有 3 个 BooleanProperty 的模型类(Pizza),它们与这些复选框链接。 我编写了这段代码,但它是错误的,因为当选择一个复选框时它会禁用一行并且无法撤消它。加上 observableList 以及来自 tableview 的模型项。代码:

private ObservableList<Pizza> finalizePizzaOb =  FXCollections.observableArrayList();                   cl_lowSize.setCellFactory(CheckBoxTableCell.forTableColumn(param -> {
                    if (finalizePizzaOb.get(param).isLowSize()) {
                        row.disableProperty().bind(finalizePizzaOb.get(param).lowSizeProperty().isNotEqualTo(finalizePizzaOb.get(param).mediumSizeProperty().or(
                                finalizePizzaOb.get(param).largeSizeProperty())));

                    }
                    return finalizePizzaOb.get(param).lowSizeProperty();
                }));

                cl_mediumSize.setCellFactory(CheckBoxTableCell.forTableColumn(param -> {
                    if (finalizePizzaOb.get(param).isMediumSize()) {
                        row.disableProperty().bind(finalizePizzaOb.get(param).mediumSizeProperty().isNotEqualTo(finalizePizzaOb.get(param).lowSizeProperty().or(
                                finalizePizzaOb.get(param).largeSizeProperty())));
                    }
                    return finalizePizzaOb.get(param).mediumSizeProperty();
                }));

                cl_largeSize.setCellFactory(CheckBoxTableCell.forTableColumn(param -> {
                    if (finalizePizzaOb.get(param).isLargeSize()) {
                        row.disableProperty().bind(finalizePizzaOb.get(param).largeSizeProperty().isNotEqualTo(finalizePizzaOb.get(param).mediumSizeProperty().or(
                                finalizePizzaOb.get(param).lowSizeProperty())));
                    }
                    return finalizePizzaOb.get(param).largeSizeProperty();
                }));

谢谢!!

最佳答案

此示例应用程序有一个包含三列的表格 View - 其中两列是复选框。当某一列中的复选框被选中时,另一列中的复选框将被取消选中,反之亦然。根据发布的问题,这可以应用于带有复选框的三个或更多列。

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.control.*;
import javafx.scene.control.cell.*;
import javafx.geometry.Insets;
import javafx.collections.*;
import java.util.*;
import javafx.beans.property.*;
public class TableCheckboxesExample extends Application {
    @Override public void start(Stage primaryStage) {
        TableView<Pizza> table = new TableView<>();
        table.setEditable(true);
        table.setItems(getDataRoutine());
        TableColumn<Pizza, String> titleCol = new TableColumn<Pizza, String>("Title");
        titleCol.setCellValueFactory(new PropertyValueFactory<Pizza, String>("title"));
        TableColumn<Pizza, Boolean> meatCol = new TableColumn<Pizza, Boolean>("Meat");
        meatCol.setEditable(true);
        meatCol.setCellValueFactory(new PropertyValueFactory<Pizza, Boolean>("meat"));
        meatCol.setCellFactory(CheckBoxTableCell.forTableColumn(meatCol));
        TableColumn<Pizza, Boolean> vegCol = new TableColumn<Pizza, Boolean>("Veg");
        vegCol.setEditable(true);
        vegCol.setCellValueFactory(new PropertyValueFactory<Pizza, Boolean>("veg"));
        vegCol.setCellFactory(CheckBoxTableCell.forTableColumn(vegCol));
        table.getColumns().addAll(titleCol, meatCol, vegCol);
        VBox vbox = new VBox();
        vbox.setPadding(new Insets(25, 25, 25, 25));
        vbox.getChildren().addAll(table);
        Scene scene = new Scene(vbox, 350, 300);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Pizza table with checkboxes");
        primaryStage.show();
        table.getSelectionModel().select(0);
    }

    private ObservableList<Pizza> getDataRoutine() {
        List<Pizza> pizzas = Arrays.asList(new Pizza("Meat lover"),
                new Pizza("Veggie lover"), new Pizza("Meditarranean"),
                new Pizza("Italian"));
        ObservableList<Pizza> data = FXCollections.observableArrayList();
        data.addAll(pizzas);
        // Add listeners to boolean properties
        for (Pizza pizza : data) {
            pizza.meatProperty().addListener((obs, wasSelected, isSelected) -> {
                pizza.setVeg(wasSelected);
            });
            pizza.vegProperty().addListener((obs, wasSelected, isSelected) -> {
                pizza.setMeat(wasSelected);
            });
        }
        return data;
    }

    public static void main(String[] args) {
        launch(args);
    }

    public class Pizza {
        private SimpleBooleanProperty veg;
        private SimpleBooleanProperty meat;
        private SimpleStringProperty title;
        public Pizza(String title) {
            this.veg = new SimpleBooleanProperty(false);
            this.meat = new SimpleBooleanProperty(false);
            this.title = new SimpleStringProperty(title);
        }
        public boolean isVeg() {
            return veg.get();
        }
        public void setVeg(boolean value) {
            veg.set(value);
        }
        public SimpleBooleanProperty vegProperty() {
            return veg;
        }
        public boolean isMeat() {
            return meat.get();
        }
        public void setMeat(boolean value) {
            meat.set(value);
        }
        public SimpleBooleanProperty meatProperty() {
            return meat;
        }
        public String getTitle() {
            return title.get();
        }
        public void setTitle(String value) {
            this.title.set(value);
        }
        public SimpleStringProperty titleProperty() {
            return title;
        }
    }
}

关于javafx - 当选择一个时 TableView 中的复选框,行中的其他复选框被禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51294612/

相关文章:

Java SAX 解析 : Can't override DefauldHandler's startElement()

java - 如何在 JavaFX 中创建 Sprite 运行周期?

swift - iOS8 Swift - 动态调整 tableview 单元格大小的问题

java - 如何让hbox适合列标题?

TableView 上的 JavaFx CheckBox 在选中/未选中时不会更新模型

java - 从 TableView 内的按钮列中删除行 [Java]

java - 设置 JPanel 中没有组件时的大小

java - 无法将已编译的Java Avro文件导入Scala代码库

java - 如何安全地运行不受信任的 Java 应用程序?

JavaFX、OS X、: es2, sw 的图形设备初始化失败