Java FX动态添加的嵌套列标题未呈现
当我在创建表后动态添加嵌套列时,它们不会呈现。下面是重现问题的代码。我使用的是JDK1.8.0121 但是,如果我内联添加嵌套列,则所有内容都会按预期显示Java FX动态添加的嵌套列标题未呈现,java,javafx,nested,treetableview,Java,Javafx,Nested,Treetableview,当我在创建表后动态添加嵌套列时,它们不会呈现。下面是重现问题的代码。我使用的是JDK1.8.0121 但是,如果我内联添加嵌套列,则所有内容都会按预期显示 package hellofx; import javafx.application.*; import javafx.application.*; import javafx.geometry.*; import javafx.scene.*; import javafx.scene.control.*; import javafx.sc
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();
}
}
这是一个适合我的解决办法 在生成表时添加一个虚拟列内联
emailCol.getColumns().add( new TreeTableColumn("DummyColumn"));
稍后在添加实际列时删除它
emailCol.getColumns().remove(0)
这是一个适合我的解决办法 在生成表时添加一个虚拟列内联
emailCol.getColumns().add( new TreeTableColumn("DummyColumn"));
稍后在添加实际列时删除它
emailCol.getColumns().remove(0)
@VGR的评论是正确的。正如你在评论@user2635530中所说的那样
在表呈现时,嵌套列的数量未知,具体取决于列将更改的传入提要
应在侦听器代码中调用
Platform.runLater()
,而不是在start()
方法中调用。为因传入提要而发生的事件添加一个侦听器,并在该侦听器中更改TreeTableView
@VGR的注释位于正确轨道上的列。正如你在评论@user2635530中所说的那样
在表呈现时,嵌套列的数量未知,具体取决于列将更改的传入提要
应在侦听器代码中调用
Platform.runLater()
,而不是在start()
方法中调用。为因传入提要而发生的事件添加一个侦听器,并在该侦听器中更改TreeTableView
中的列,即sleep(100)
不会执行您认为它会执行的操作。它不等待任何事件发生;相反,它暂时阻止处理任何事件。如果你的目标是在舞台展示后让事情发生,那么使用stage.setOnShown
@VGR你当然是对的;然而,我使用一个PauseTransition
来测试OP的代码,以创建延迟,但它也不能以这种方式工作。表标题可能无法重新计算高度,或者无法以某种方式进行布局。在表呈现时,嵌套列的数量未知,具体取决于列将更改的传入提要。这种延迟只是一种演示目的。这将是一个现实世界中的事件,导致该段代码执行。@BiswaDas提出的观点是,延迟实际上没有做任何事情,因为它阻塞了UI线程(因此对于所有目的来说,它相当于它根本不在那里,您可以很容易地验证)。Platform.runLater()。如果你摆脱了这个错误,你的例子会更好,更可信,因为它会分散任何想帮忙的人的注意力。你的变通方法不会在所有情况下都有效。True消除了分心…睡眠(100)
不会做你认为它会做的事。它不等待任何事件发生;相反,它暂时阻止处理任何事件。如果你的目标是在舞台展示后让事情发生,那么使用stage.setOnShown
@VGR你当然是对的;然而,我使用一个PauseTransition
来测试OP的代码,以创建延迟,但它也不能以这种方式工作。表标题可能无法重新计算高度,或者无法以某种方式进行布局。在表呈现时,嵌套列的数量未知,具体取决于列将更改的传入提要。这种延迟只是一种演示目的。这将是一个现实世界中的事件,导致该段代码执行。@BiswaDas提出的观点是,延迟实际上没有做任何事情,因为它阻塞了UI线程(因此对于所有目的来说,它相当于它根本不在那里,您可以很容易地验证)。Platform.runLater()。如果你摆脱了这个错误,你的例子会更好,更可信,因为它会分散任何想帮忙的人的注意力。你的变通方法不会在所有情况下都有效。真的消除了分心。。。