2016-10-28 4 views
-1

Мой табличный вид имеет 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 неправильно. Вам нужно

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

Тогда ваше значение ячейки завод может быть

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

и отображать выпадающий вам нужен мобильный завод:

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

Вы могли бы найти очиститель реорганизовать модель, чтобы вы перевернули список и выбранный элемент в новом классе:

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

Добро пожаловать. См. Обновление для немного другого подхода. –

+0

Джеймс, я не понимаю, как я мог бы заполнить infoList, поскольку в вашем новом примере нет сеттера. Вы пропустили это, или это я, у которого что-то отсутствует? :) (Выбираемые варианты задаются динамически с помощью другого метода) – pror21

Смежные вопросы