2016-04-19 116 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