Java FX Динамически добавленный вложенный заголовок столбца не отображается

Когда я добавляю вложенный столбец динамически после создания таблицы, вложенные заголовки столбцов НЕ отображаются. Вот код, воспроизводящий проблему. Я использую JDK 1.8.0_121

Однако, если я добавлю вложенные столбцы встроенными, то все будет выглядеть как положено

package hellofx;

import javafx.application.*;
import javafx.application.*;
import javafx.geometry.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.text.*;
import javafx.stage.*;

public class TableViewSample extends Application {

private TreeTableView table = new TreeTableView();

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage stage) {
    Scene scene = new Scene(new Group());
    stage.setTitle("Table View Sample");
    stage.setWidth(600);
    stage.setHeight(500);

    final Label label = new Label("Address Book");
    label.setFont(new Font("Arial", 20));

    table.setEditable(true);

    TreeTableColumn firstNameCol = new TreeTableColumn("First Name");
    TreeTableColumn lastNameCol = new TreeTableColumn("Last Name");
    TreeTableColumn emailCol = new TreeTableColumn("Email");

    //Simulate adding nested columns after stage is set.
    Platform.runLater(() -> {
        TreeTableColumn firstEmailCol = new TreeTableColumn("Primary");
        TreeTableColumn secondEmailCol = new TreeTableColumn("Secondary");

        emailCol.getColumns().addAll(firstEmailCol, secondEmailCol);
    });
    table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);

    final VBox vbox = new VBox();
    vbox.setSpacing(5);
    vbox.setPadding(new Insets(10, 0, 0, 10));
    vbox.getChildren().addAll(label, table);

    ((Group) scene.getRoot()).getChildren().addAll(vbox);

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

1 ответ

Комментарий @VGR на правильном пути. Как вы сказали в своем комментарии @user2635530

Количество вложенных столбцов неизвестно во время рендеринга таблицы, в зависимости от входящего канала столбцы будут меняться.

Platform.runLater() должен вызываться в коде слушателя, а не в start() метод. Добавьте прослушиватель для события, которое происходит из-за входящего канала, и в этом прослушивателе измените столбцы в TreeTableView,

Вот обходной путь, работающий для меня.

Добавьте фиктивный столбец при построении таблицы.

    emailCol.getColumns().add( new TreeTableColumn("DummyColumn"));

Удалите его позже при добавлении реальных столбцов.

    emailCol.getColumns().remove(0)
Другие вопросы по тегам