2016-04-19 82 views
0

我终于设法跟踪每次点击发生在我的GUI复选框。但是现在它不会将CheckBox的正确值加载到gui中。任何人都可以看到什么可能是错的? :)JavaFX 2 - Tableview复选框未显示值

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 ; 
    }); 

回答

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); 
} 

请注意,这仅适用,如果您分配包含Spot实例SimpleBooleanPropertybean,例如

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

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

我只是用bean以避免寿为每个项目创造新的听众。

还要考虑以下JavaFX的性质的命名约定:

  • 属性getter被命名为<propertyName>Property(不get<capitalFirstLetterPropertyName>
  • 的属性值,吸气名为get<capitalFirstLetterPropertyName>
  • 的setter的属性值被命名为set<capitalFirstLetterPropertyName>
+0

非常感谢您的回复。我会尽快让我的手,并希望我能得到它的工作。 – Jacob