更新JavaFX Label不适用于DataBinding

时间:2015-06-26 18:55:17

标签: java javafx label

我试图在一个标签中写下我自己的“日志”,我遇到了一个问题,我用一个天真的解决方案来更新标签。

所以在谷歌搜索后我在这里查看了这个解决方案: Displaying changing values in JavaFx Label

我不知道我是否做得对,但不幸的是这个解决方案对我不起作用。

final static Label logLabel = new Label();
final static SimpleStringProperty logString = new SimpleStringProperty("test");
...
...
     public void start(Stage primaryStage) {


    TabPane tabPane = new TabPane();
    tabPane.getTabs().add(createSettingsTab());
    tabPane.getTabs().add(createParticipantTab());
    tabPane.getTabs().add(createSpectatorTab());
    tabPane.getTabs().add(createOverviewTab());
    tabPane.getTabs().add(createTournamentTab());
    tabPane.getTabs().add(createLogTab());
    tabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);


    Scene scene = new Scene(tabPane, 1200, 800);

    primaryStage.setScene(scene);
    primaryStage.setResizable(true);




    primaryStage.show();
}


private Tab createLogTab() {
// TODO Auto-generated method stub
            logLabel.textProperty().bind(logString);    
            Tab tab = new Tab("Log");
            tab.setContent(logLabel);
            return tab;
        }

我用这行来初始化Label并设置新文本我这样做:

logString.set(logString.get() + "foo");

日志标签保持空白...

我很感激任何帮助!谢谢!

编辑//这是我能想到的唯一有用的mcve。正如我所说,创建其他标签的其他创建方法没有使用标签或SimpleStringProperty

这是与标签无关的按钮。

    buttonLoadConfig.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent e) {
                    System.out.println("test");
                    logString.set(logString.get() + "\ttest");

                    FileChooser fileChooser = new FileChooser();
                    fileChooser.setTitle("Choose Config");
                    File config = fileChooser.showOpenDialog(new Stage());
    }
});

1 个答案:

答案 0 :(得分:1)

使用静态成员通常不是一个好主意,可能会导致您的问题。

您当前编写的代码可以包含多个选项卡,但只有一个标签。您正尝试将相同的标签添加到多个选项卡。但是,当您这样做时,标签将从之前的选项卡中删除,因为有关JavaFX场景图如何工作的规则。

请参阅Node documentation

  

如果程序将子节点添加到Parent(包括Group,Region等)并且该节点已经是不同Parent的子节点或Scene的根节点,则该节点将自动(并静默地)从其节点中删除前父母。

因此绑定工作正常,但是,由于上述规则以及编写其余代码的方式,整个程序可能无法按预期或希望工作。

如果您仍然遇到问题,请使用mcve更新您的问题。