【问题标题】:JavaFX 2 - Tableview Checkbox not showing valueJavaFX 2 - Tableview 复选框未显示值
【发布时间】:2016-04-19 18:23:11
【问题描述】:

我终于设法在我的 GUI 中的复选框上发生点击时进行跟踪。但现在它不会将 CheckBox 的正确值加载到 gui 中。谁能看到可能出了什么问题? :)

roadtrainCol.setCellValueFactory(
            new Callback<CellDataFeatures<Spot,Boolean>,ObservableValue<Boolean>>()
            {
                public ObservableValue<Boolean> call(CellDataFeatures<Spot, Boolean> param) {
                    return param.getValue().getRoadtrain();
                }   
            });
    roadtrainCol.setCellFactory(col -> {
        CheckBoxTableCell<Spot, Boolean> cell = new CheckBoxTableCell<>(index -> {
            BooleanProperty active = new SimpleBooleanProperty();
            active.addListener((obs, wasActive, isNowActive) -> {
                System.out.println("del");
                rettedeSpots(tableViewId.getItems().get(index).getId());
            });
            return active ;
        });
        return cell ;
    });

【问题讨论】:

    标签: java checkbox javafx properties tableview


    【解决方案1】:

    您正在创建 BooleanPropertys。这些属性将始终使用false 进行初始化。

    cellFactory 不是添加侦听器的地方。改为向项目添加侦听器。

    roadtrainCol.setCellValueFactory(
            new Callback<CellDataFeatures<Spot, Boolean>, ObservableValue<Boolean>>() {
                public ObservableValue<Boolean> call(CellDataFeatures<Spot, Boolean> param) {
                    return param.getValue().getRoadtrain();
                }
            });
    
    roadtrainCol.setCellFactory(CheckBoxTableCell.forTableColumn(roadtrainCol));
    
    ChangeListener<Boolean> roadTrainChangeListener = (observable, oldValue, newValue) -> {
        Spot spot = (Spot) ((ReadOnlyProperty) observable).getBean();
        System.out.println("del");
        rettedeSpots(spot.getId());
    };
    
    // add/remove listeners when Spots are added to/removed from the list
    tableViewId.getItems().addListener((ListChangeListener.Change<? extends Spot> c) -> {
        while (c.next()) {
            for (Spot s : c.getRemoved()) {
                s.getRoadtrain().removeListener(roadTrainChangeListener);
            }
            for (Spot s : c.getAddedSubList()) {
                s.getRoadtrain().addListener(roadTrainChangeListener);
            }
        }
    });
    
    // add listeners to items already in the list
    for (Spot s : tableViewId.getItems()) {
        s.getRoadtrain().addListener(roadTrainChangeListener);
    }
    

    请注意,这仅在您将包含SimpleBooleanPropertySpot 实例分配为bean 时才有效,例如

    Spot() {
         this.roadtrain = new SimpleBooleanProperty(this, "roadtrain");
    }
    

    Spot(boolean roadtrain) {
         this.roadtrain = new SimpleBooleanProperty(this, "roadtrain", roadtrain);
    }
    

    我只是使用bean 来避免为每个项目创建新的侦听器。

    还要考虑遵循 JavaFX 属性的命名约定:

    • 属性获取器被命名为&lt;propertyName&gt;Property(不是get&lt;capitalFirstLetterPropertyName&gt;
    • 属性值的getter被命名为get&lt;capitalFirstLetterPropertyName&gt;
    • 属性值的设置器被命名为set&lt;capitalFirstLetterPropertyName&gt;

    【讨论】:

    • 非常感谢您的回复。我会尽快尝试,希望我可以让它发挥作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多