2013-07-14 2 views
0

im застрял в какой-то проблеме, нужно руководство! У меня есть TableView, у которого есть 2 ComboBoxTableCells, мое требование - обновить список в поле со списком 2-й ячейки при изменении первого.Java FX: как обновить ComboTableCell при смене другого

Я пробовал это следующим образом, пока не повезло.

public class Test{ 
    private StringProperty name; 
    private StringProperty city; 

    public Test(String name, String city){ 
     this.name = new SimpleStringProperty(name); 
     this.city = new SimpleStringProperty(city); 
    } 

    public String getName() { 
     return name.get(); 
    } 

    public void setName(String name) { 
     this.name.setValue(name); 
    } 

    public String getCity() { 
     return city.get(); 
    } 

    public void setCity(String city) { 
     this.city.setValue(city); 
    } 

    public StringProperty nameProperty() {return name;} 
    public StringProperty cityProperty() {return city;} 
} 


    TableView _table= new TableView(); 
    final ObservableList list = FXCollections.observableArrayList(); 
    list.add("name 1"); 
    list.add("name 2"); 
    list.add("name 3"); 
    list.add("name 4"); 

    final ObservableList list2 = FXCollections.observableArrayList(); 
    list2.add("city 1"); 
    list2.add("city 2"); 
    list2.add("city 3"); 
    list2.add("city 4"); 

    TableColumn firstNameCol = new TableColumn("First Name"); 
    firstNameCol.setMinWidth(100); 
    firstNameCol.setCellValueFactory(new PropertyValueFactory<Test, String>("name")); 
    firstNameCol.setCellFactory(ComboBoxTableCell.forTableColumn(list)); 

    firstNameCol.setOnEditCommit(
     new EventHandler<CellEditEvent<Test, String>>() { 
      @Override 
      public void handle(CellEditEvent<Test, String> t) { 
    ((Test) t.getTableView().getItems().get(t.getTablePosition().getRow())).setName(t.getNewValue()); 

       System.out.println(t.getTableColumn().getCellData(t.getTablePosition().getRow())); 

я думаю, что нужно сделать что-то здесь, попробовал следующую строку, чтобы увидеть влияние на соответствующую ячейку
list2.clear();
обновленные данные для всего столбца, я просто хочу, чтобы он обновлялся только для соответствующей ячейки.

  } 
     } 
    ); 


    TableColumn lastNameCol = new TableColumn("City"); 
    lastNameCol.setMinWidth(100); 
    lastNameCol.setCellValueFactory(
     new PropertyValueFactory<Test, String>("city")); 
    lastNameCol.setCellFactory(ComboBoxTableCell.forTableColumn(list2)); 
    lastNameCol.setOnEditCommit(
     new EventHandler<CellEditEvent<Test, String>>() { 
      @Override 
      public void handle(CellEditEvent<Test, String> t) { 
       ((Test) t.getTableView().getItems().get(
         t.getTablePosition().getRow()) 
         ).setName(t.getNewValue()); 
      } 
     } 
    ); 

    _table.setEditable(true); 
    _table.getColumns().addAll(firstNameCol,lastNameCol); 

    ObservableList listItems = FXCollections.observableArrayList(); 
    listItems.add(new Test("name 4", "city 2")); 
    listItems.add(new Test("name 2", "city 3")); 
    table.getTableView().setItems(listItems); 
    _table.setItems(listItems); 

любая помощь будет высоко оценен. благодаря

ответ

0

Вот Hacky подход, который я не проверял:

  1. Добавить фиктивный (булево?) свойство на элементы данных, которые будут использоваться для обмена данными между firstNameCol и lastNameCol
  2. В обработчике onEditCommit для firstNameCol измените значение свойства dummy. Убедитесь, что он изменился.
  3. Имейте lastNameCol как столбец для свойства фиктивного типа. Регистрация фабрики ячеек для lastNameCol, который возвращает TableCell с перекрываться updateItem() метод (псевдо-код ниже)

    lastNameCol.setCellFactory(new Callback() { 
        @Override 
        public TableCell call(TableColumn col) { 
         return new TableCell() { 
          @Override 
          public void updateItem(Boolean item, boolean empty) { 
           if (!empty) { 
            // Don't care about the value of item 
            // Just look up the value of firstNameCol using 
            // getTablePosition(), then create and populate 
            // a ComboBox with the appropriate items and set 
            // it as the graphic for this cell via this.setGraphic() 
            // Add handler to ComboBox control to update data item when 
            // selection changes 
           }             
          } 
         }; 
        } 
    }); 
    
Смежные вопросы