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)