JavaFX:如何从其他类访问UI线程组件

时间:2014-08-04 13:53:44

标签: java multithreading javafx worker

我是JavaFX的新手,我正在努力做到以下几点:

我有UI的主要课程,重要的部分是

public class Main extends Application {

    ...

    scene = new Scene(new Group()); 

    final Label label = new Label("Device name");
    label.setFont(new Font("Arial", 20));
    label.setId("label");

    DeviceConnector connector = new DeviceConnector(scene);
}

其他文件中的课程中,我有一些链式线程。最后一个如果每个成功(他们连接到蓝牙)读取设备名称。这就是我想在上面的标签上显示的内容。

不幸的是,我没有找到任何其他(相当优雅)的解决方案:

public class DeviceConnector {

    Scene mScene;

    public DeviceConnector(Scene scene) {

        mScene = scene;
    }

    private void ReadDeviceName {

        this.deviceName = device.GetName();

        Platform.runLater(new Runnable() {

            @Override
            public void run() {

                Label label = (Label) mScene.lookup("#label");
                label.setText(deviceName);
            }
        });
    }
}

是否有任何正确的方法来访问JavaFX GUI中的组件(类似Mediator模式)?

谢谢。

1 个答案:

答案 0 :(得分:2)

JavaFX中的大多数元素都有一个可观察的属性,它表示值。 如果是标签,则为textProperty(),您可以对其进行提取和编辑。对StringProperty(由textProperty()方法返回的类型)的所有修改都将显示在相关标签中。

请参阅http://docs.oracle.com/javafx/2/api/javafx/scene/control/Labeled.html#textProperty%28%29

我建议使用获取StringProperty的方法,将其作为MVC结构中的模型处理,并将其存储在全局可访问的模型存储库中。 在您的逻辑线程中,获取设备名称并将结果写入模型aka StringProperty,您的标签将通过更改通知并显示获取的值。