JavaFX 2 - Tableview复选框未显示值

时间:2016-04-19 07:33:53

标签: java checkbox javafx properties tableview

我终于设法在我的GUI中的复选框上发生单击时进行跟踪。但是现在它不会将CheckBox的正确值加载到gui中。任何人都可以看到可能出错的地方? :)

sourceSets

1 个答案:

答案 0 :(得分:1)

您正在创建 BooleanProperty。这些属性将始终使用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);
}

请注意,只有将SpotSimpleBooleanProperty实例分配为bean时才会有效,例如

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

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

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

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

  • 属性getter的名称为<propertyName>Property(不是get<capitalFirstLetterPropertyName>
  • 该属性值的getter名为get<capitalFirstLetterPropertyName>
  • 属性值的setter名为set<capitalFirstLetterPropertyName>