Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FX动态添加的嵌套列标题未呈现_Java_Javafx_Nested_Treetableview - Fatal编程技术网

Java FX动态添加的嵌套列标题未呈现

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

当我在创建表后动态添加嵌套列时,它们不会呈现。下面是重现问题的代码。我使用的是JDK1.8.0121

但是,如果我内联添加嵌套列,则所有内容都会按预期显示

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()。如果你摆脱了这个错误,你的例子会更好,更可信,因为它会分散任何想帮忙的人的注意力。你的变通方法不会在所有情况下都有效。真的消除了分心。。。