试图制作一个基于文本的小游戏,但我无法在一个主题内更新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)