Почему в Java FX TreeTableView происходит утечка памяти, когда включен TableMenuButton?

Я испытываю утечки памяти с TreeTableView, когда TableMenu включен. Шаги воспроизвести просто. Я провел некоторое исследование, почему это происходит, но оставлю это на усмотрение экспертов.

Запустите встроенный код с параметром -Xmx 256m, чтобы сократить время ожидания. Я работаю с JDK 1.8.0_121

Оба шага должны выполняться последовательно.

  1. Нажмите кнопку "Меню таблицы" в правом верхнем углу (+), чтобы выбрать пункт меню.
  2. Затем нажмите (X) на колонке ДИНАМИЧНЫЙ (дайте ОМС за несколько секунд)

        package hellofx;
    
        import javafx.application.Application;
        import javafx.application.Platform;
        import javafx.scene.Scene;
        import javafx.scene.control.Button;
        import javafx.scene.control.TreeItem;
        import javafx.scene.control.TreeTableCell;
        import javafx.scene.control.TreeTableColumn;
        import javafx.scene.control.TreeTableView;
        import javafx.stage.Stage;
    
        public class TreeTableMemoryLeak extends Application {
            public static void main(String[] args) {
                launch(args);
            }
    
            @Override
            public void start(Stage stage) {
                TreeTableView<Object> otable = buildTableView();
                Platform.runLater(()->{
                    Scene scene = new Scene(otable,otable.getWidth(),otable.getHeight());
                    stage.setScene(scene);
                    stage.show();
                });
            }
    
            private TreeTableView<Object> buildTableView() {
                TreeTableView<Object> table = new TreeTableView<>();
                TreeTableColumn<Object, String> indexCol = new TreeTableColumn<>("Index");
                indexCol.setCellFactory(column -> {
                    return new TreeTableCell<Object, String>() {
                        @Override
                        protected void updateItem(String item, boolean empty) {
                            setText(String.valueOf(getIndex()));
                        }
                    };
                });
                TreeTableColumn<Object, String> dynCol = new TreeTableColumn<>("DYNAMIC");
                dynCol.setGraphic(new Button("X"){
                    {
                        //ATTENTION 3 (On click of X remove all columns except first column)
                        setOnAction((e)->dynCol.getColumns().removeIf(c->c!=dynCol.getColumns().get(0)));
                    }
                });
                //ATTENTION 1
                table.setTableMenuButtonVisible(true);
    
                //ATTENTION 2 (39 is the magic number anything higher it will OOM on my device I have total 6G physical.)
                for(int i=0;i<39;i++){
                    dynCol.getColumns().add(new TreeTableColumn<>(String.valueOf(i)));
                }
                table.getColumns().addAll(indexCol,dynCol);
                table.setEditable(true);
                table.setRoot(new TreeItem<Object>());
                return table;
            }
        }
    

    Запуск образа приложения

0 ответов

Другие вопросы по тегам