package bugs.table.RT25338;
import com.sun.javafx.collections.ObservableListWrapper;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
import javafx.util.Callback;
import java.util.ArrayList;
import java.util.List;
public class TableViewLeaksMemory extends Application {
TableView tableView = new TableView();
SimpleFactory factory = new SimpleFactory();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
final FlowPane pane = new FlowPane(Orientation.VERTICAL);
createItems(tableView);
Button addButton = createButton();
Button dropTable = new Button("Drop Table");
dropTable.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent o) {
pane.getChildren().remove(tableView);
tableView = null;
}
});
pane.getChildren().add(tableView);
pane.getChildren().add(addButton);
pane.getChildren().add(dropTable);
stage.setScene(new Scene(pane));
stage.setHeight(500);
stage.show();
}
private void createItems(TableView tableView) {
List items = new ArrayList();
for (int i = 0; i < 6; i++) {
items.add(new Object());
}
tableView.setItems(new ObservableListWrapper(items));
}
private Button createButton() {
Button addButton = new Button("Replace Columns");
addButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
tableView.getColumns().setAll(createColumns());
}
});
return addButton;
}
private List<TableColumn> createColumns() {
ArrayList<TableColumn> list = new ArrayList<>();
for (int i = 0; i < 30; i++) {
TableColumn<Object, String> column = new TableColumn<>();
column.setCellValueFactory(factory);
list.add(column);
}
return list;
}
private static class SimpleFactory implements Callback<TableColumn.CellDataFeatures<Object, String>, ObservableValue<String>> {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Object, String> namedProfileCellDataFeatures) {
return new SimpleStringProperty("X");
}
}
}