通过线程更新Javafx阶段标题

时间:2016-11-13 15:03:27

标签: java multithreading javafx

试图制作一个基于文本的小游戏,但我无法在一个主题内更新JavaFX舞台的标题。相关代码如下。标题显示时间,这就是必须每秒通过一个帖子更新的原因。

主要方法

    public static void main(String args[]) {
    if(checkVersion() == true) {
        launch(args);
    } else {
        System.exit(0);
    }
}

包含main方法“Warmth”的类扩展了 Application ,实现了 Runnable 。这是代码是由于 launch(); 在main中执行的(以防你将其解释为 .start(); 来自 Thread

    public void start(Stage primaryStage) throws Exception {
    Warmth warmth = new Warmth();
    warmth.isAlive = true;
    setUserAgentStylesheet(STYLESHEET_MODENA);
    warmth.display = Display.createDisplay(title, width, height);
    (warmth.game = new Thread(warmth)).start();
}

Display 类中的代码如下

private Display(String title, Dimension size) {
    dimensions = size;
    primaryStage = new Stage();
    primaryStage.setTitle(title);
    logtextArea = new TextArea();
    logtextArea.setEditable(false);
    logtextArea.setText("text area");



    primaryLayout = new BorderPane();
    rightSideLayout = new VBox(20);
    middlelayout = new StackPane();

    middlelayout.getChildren().add(logtextArea);

    rightSideLayout.setMargin(label1, new Insets(20,20,20,100));
    rightSideLayout.getChildren().add(label1);

    primaryLayout.setRight(rightSideLayout);
    primaryLayout.setCenter(middlelayout);

    baseScene = new Scene(primaryLayout, dimensions.width, dimensions.height);

    primaryStage.setScene(baseScene);
    primaryStage.show();
}

public void setTitle(String title) {
    primaryStage.setTitle(title);
}

public static Display createDisplay(String title, int width, int height) {
    Dimension size = new Dimension(width, height);
    return new Display(title, size);
}

最后,这是由 Thread.start()

生成的 run()方法
public void run() {
    while(isAlive) {
        long currentTime = System.currentTimeMillis();
        updateTime();
        title = ("WARMTH | "+hour+":"+minute+":"+second);
        display.setTitle(title);
        long lastTime = System.currentTimeMillis();
        delta+= (currentTime - lastTime);
    }
}

我不确定问题,但我有几个猜测。看起来我只是用不并行运行的线程打结。或者尝试从一个不可能或无法访问的线程中做事。我已经尝试重新安排服务器的次数,几乎所有的运行时错误都是应用程序在线程相关的异常上引发的。

我从来没有遇到使用摆动组件(JFrame)做这样的事情的问题但是,我对整个FX事物都很新。如果你想要消除任何有用的光。另外......原谅可怕的代码。

修改 在运行时抛出异常......

Exception in thread "Thread-4" java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = Thread-4
    at com.sun.glass.ui.Application.checkEventThread(Application.java:443)
    at com.sun.glass.ui.Window.setTitle(Window.java:829)
    at com.sun.javafx.tk.quantum.WindowStage.setTitle(WindowStage.java:475)
    at javafx.stage.Stage$5.invalidated(Stage.java:736)
    at javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:109)
    at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:144)
    at javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:49)
    at javafx.stage.Stage.setTitle(Stage.java:722)
    at warmth.design.Display.setTitle(Display.java:58)
    at warmth.Warmth.run(Warmth.java:52)
    at java.lang.Thread.run(Thread.java:745)

0 个答案:

没有答案