2017-01-06 2 views
0

У меня есть TableView и столбцы для этого я создаю так:JavaFX: TableView - отвязать все свойства

TableColumn<Foo,String> fieldColumn=new TableColumn("field"); 
fieldColumn.setCellValueFactory(data->data.getValue().getFieldProperty()); 
tableView.add(fieldColumn); 

Теперь я хочу, чтобы уничтожить мой tableView, но я хочу продолжать использовать все foos. Вот почему я хочу отключить свойства foos 'из таблицы/столбца. Как это сделать?

ответ

1

Если вы удалите TableColumn s, слушатели будут удалены во время следующего прохода макета. Это позволяет удалить слушатель добавленных TableView очистив столбцы и вызова layout():

Item класса для позволяющих получить число слушателей к свойству

public class Item { 

    private final Set<Object> listeners = new HashSet<>(); 

    public Item(String value) { 
     this.value.set(value); 
    } 

    private final StringProperty value = new SimpleStringProperty() { 

     @Override 
     public void removeListener(ChangeListener<? super String> listener) { 
      super.removeListener(listener); 
      listeners.remove(listener); 
     } 

     @Override 
     public void addListener(ChangeListener<? super String> listener) { 
      super.addListener(listener); 
      listeners.add(listener); 
     } 

     @Override 
     public void removeListener(InvalidationListener listener) { 
      super.removeListener(listener); 
      listeners.remove(listener); 
     } 

     @Override 
     public void addListener(InvalidationListener listener) { 
      super.addListener(listener); 
      listeners.add(listener); 
     } 

    }; 

    public final StringProperty valueProperty() { 
     return this.value; 
    } 

    public int getListenerCount() { 
     return listeners.size(); 
    } 

} 

Текст Application

private void printListenerCount(String message) { 
    System.out.println(message + tableView.getItems().stream().mapToInt(Item::getListenerCount).sum()); 
} 

private TableView<Item> tableView; 

@Override 
public void start(Stage primaryStage) { 
    tableView = new TableView<>(); 
    tableView.getItems().addAll(new Item("a"), new Item("b"), new Item("c")); 

    TableColumn<Item, String> column = new TableColumn<>(); 
    column.setCellValueFactory(cd -> cd.getValue().valueProperty()); 

    tableView.getColumns().add(column); 

    Button btn = new Button("print listener count"); 
    btn.setOnAction((ActionEvent event) -> { 
     printListenerCount("listeners: "); 
    }); 

    Button btn2 = new Button("clear columns"); 
    btn2.setOnAction(evt -> { 
     tableView.getColumns().clear(); 

     // do layout to remove the listeners added for the columns 
     tableView.layout(); 

     printListenerCount("after clear columns: "); 
    }); 

    Scene scene = new Scene(new VBox(tableView, btn, btn2)); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

Нажатие кнопки print listener count, а затем кнопки clear columns приведет к следующему выходу:

listeners: 3 
after clear columns: 0 
Смежные вопросы