2016-10-28 9 views
-1

テーブルビューには2つの列があります。最初のものには私のオブジェクトの名前があり、2番目には私のオブジェクト属性リストの値を持つComboBoxがあります。テーブルの列セルにComboBoxを設定して観察するにはどうすればよいですか?

ComboBoxを変更すると、選択した属性がユーザーが選択したリスト要素で変更されます。例えば

| Name   | Choices   | 
|---------------|-------------------| 
| Object 1 Name | Object 1 ComboBox | 
| Object 2 Name | Object 2 ComboBox | 

は、これまでのところ、私は名前を移入するために管理してきましたが、私は選択肢欄でこだわっています。

MyObjectにモデル

public class MyObject { 

    // Objects name is the filename 
    private File file; 
    // Selection from the ComboBox that is populated with infoList elements 
    private SomeInfo selectedInfo; 

    private List<SomeInfo > infoList; 

    ... getter/setter 

コントローラー

@FXML 
private TableView<MyObject> myObjectTableView; 
@FXML 
private TableColumn<MyObject, String> myObjectNameTableColumn, myObjectChoicesTableColumn; 

private void populateTableView(List<MyObject> myObjectList) { 
    ObservableList<MyObject> myObjectObservableList = FXCollections.observableList(myObjectList); 
    myObjectTableView.setItems(myObjectObservableList); 
    myObjectNameTableColumn.setCellValueFactory(c -> new SimpleStringProperty(c.getValue().getFile().getName())); 
} 

答えて

1

あなた​​の種類が間違っています。あなたはそれがクリーンリファクタリングするかもしれません

myObjectChoicesTableColumn.setCellFactory(col -> { 

    ComboBox<SomeInfo> combo ; 

    TableCell<MyObject, List<SomeInfo>> cell = new TableCell<MyObject, List<SomeInfo>>() { 
     @Override 
     protected void updateItem(List<SomeInfo> info, boolean empty) { 
      super.updateItem(info, empty); 
      if (empty) { 
       setGraphic(null); 
      } else { 
       MyObject rowItem = myObjectTableView.getItems().get(getIndex()); 
       combo.getItems().setAll(info); 
       combo.setValue(rowItem.getSelectedInfo()); 
       setGraphic(combo); 
      } 
     } 
    }; 

    combo.valueProperty().addListener((obs, oldValue, newValue) -> 
     myObjectTableView.getItems().get(cell.getIndex()).setSelectedInfo(newValue)); 

    return cell ; 
} 

:次に、あなたのセル値の工場が

myObjectChoicesTableColumn.setCellValueFactory(cellData -> 
    new SimpleObjectProperty<>(cellData.getValue().getInfoList())); 

することができ、あなたは、セル工場を必要とするコンボボックスを表示するために

@FXML 
private TableColumn<MyObject, List<SomeInfo>> myObjectChoicesTableColumn ; 

が必要モデルを使用すると、リストと選択したアイテムを新しいクラスにラップすることができます。

public class SelectableInfo { 
    private final ObservableList<SomeInfo> infoList = FXCollections.observableArrayList() ; 

    private SomeInfo selectedInfo ; 

    public ObservableList<SomeInfo> getInfoList() { 
     return infoList ; 
    } 

    public SomeInfo getSelectedInfo() { 
     return selectedInfo ; 
    } 

    public void setSelectedInfo(SomeInfo info) { 
     selectedInfo = info ; 
    } 
} 

public class MyObject { 
    private File file ; 
    private SelectableInfo selectableInfo ; 

    // getters and setters... 
} 

その後、あなたは単純を持っているでしょう:

@FXML 
private TableColumn<MyObject, SelectableInfo> myObjectChoicesTableColumn ; 

myObjectChoicesTableColumn.setCellValueFactory(cellData -> new SimpleObjectProperty<>(cellData.getValue().getSelectableInfo()); 

myObjectChoicesTableColumn.setCellFactory(col -> { 
    ComboBox<SomeInfo> combo = new ComboBox<>(); 
    TableCell<MyObject, SelectableInfo> cell = new TableCell<MyObject, SelectableInfo>() { 
     @Override 
     protected void updateItem(SelectableInfo info, boolean empty) { 
      super.updateItem(info, empty) ; 
      if (empty) { 
       setGraphic(null); 
      } else { 
       combo.setItems(info.getInfoList()); 
       combo.setValue(info.getSelectedInfo()); 
       setGraphic(combo); 
      } 
     } 
    }; 
    combo.valueProperty().addListener((obs, oldValue, newValue) -> 
     cell.getItem().setSelectedInfo(newValue)); 
    return cell ; 
}); 
+0

はあなたにジェームスをありがとう! – pror21

+0

ようこそ。わずかに異なるアプローチについては、updateを参照してください。 –

+0

ジェームスあなたの新しい例にはセッターがないので、私はinfoListをどのように埋めることができるのか分かりません。あなたはそれを逃したのか、それとも何かを欠いている私のものですか? :) (選択可能な選択肢は別のメソッドから動的に与えられます) – pror21

関連する問題