java – 在另一个线程中创建一个阶段时出现IllegalStateException
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在另一个线程中创建一个阶段时出现IllegalStateException,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2708字,纯文字阅读大概需要4分钟。
内容图文
![java – 在另一个线程中创建一个阶段时出现IllegalStateException](/upload/InfoBanner/zyjiaocheng/748/3cc3ef4f279b4abba2c4f6f0fbdb97a5.jpg)
我在另一个线程中再打开一个阶段时遇到问题.如果我在同一个线程中打开此阶段,则不会出现异常.
void hashMapDeclaration(){
actions2methods.put("NEW", new Runnable() {@Override public void run() { newNetCreation(); }});
actions2methods.put("LOAD", new Runnable() {@Override public void run() { loadNetState(); }});
...... //other hashes
}
HBox buttonBuilder(double spacing,double layoutX,String... bNames){
HBox lBar = new HBox(10);
.... //some code
for(final String text : bNames){ //in my case text variable value is "NEW" so it should run method newNetCreation
Button newButton = new Button();
newButton.setText(text);
.... //code
newButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent paramT) {
Thread t;
EventQueue.isDispatchThread();
t = new Thread(actions2methods.get(text));
t.start(); // Start the thread
System.out.println("button pressed");
}
});
lBar.getChildren().add(newButton);
}
return lBar;
}
void newNetCreation(){
final Stage dialogStage = new Stage();
final TextField textField;
dialogStage.initOwner(stage);
dialogStage.initModality(Modality.WINDOW_MODAL);
dialogStage.setFullScreen(false);
dialogStage.setResizable(false);
dialogStage.setScene(SceneBuilder
.create()
.fill(Color.web("#dddddd"))
.root(textField = TextFieldBuilder
.create()
.promptText("Enter user name")
.prefColumnCount(16)
.build()
)
.build()
);
textField.textProperty().addListener(new ChangeListener() {
public void changed(ObservableValue ov, Object oldValue, Object newValue) {
System.out.println("TextField text is: " + textField.getText());
}
});
dialogStage.show();
System.out.println("new net");
}
方法newNetCreation是导致问题的方法.我程序中的所有操作都存储在HashMap中.方法buttonBuilder创建新线程,并应根据变量值启动方法,在我的情况下,他必须调用newNetCreation方法,但是当他尝试时,会发生以下异常:
Exception in thread "Thread-3" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
at javafx.stage.Stage.<init>(Unknown Source)
at javafx.stage.Stage.<init>(Unknown Source)
at projavafx.starterapp.ui.StarterAppMain.newNetCreation(StarterAppMain.java:400)
at projavafx.starterapp.ui.StarterAppMain$7.run(StarterAppMain.java:354)
at java.lang.Thread.run(Thread.java:722)
解决方法:
JavaFX的所有UI操作都应在FX应用程序线程上执行.
这是你的代码:
Thread t;
t = new Thread(actions2methods.get(text));
t.start(); // Start the thread
t是您运行方法的线程.它显然不是你提供的日志中所述的FX线程:java.lang.IllegalStateException:不在FX应用程序线程上; currentThread = Thread-3
如果要在FX线程上运行Runnable,请使用下一个代码:
Platform.runLater(actions2methods.get(text));
内容总结
以上是互联网集市为您收集整理的java – 在另一个线程中创建一个阶段时出现IllegalStateException全部内容,希望文章能够帮你解决java – 在另一个线程中创建一个阶段时出现IllegalStateException所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。