Javafx修改";标签";在SwingUtilities.invokeLater中
我想做以下几件事:Javafx修改";标签";在SwingUtilities.invokeLater中,java,javafx,pane,swingutilities,Java,Javafx,Pane,Swingutilities,我想做以下几件事: 点击按钮 将矩形涂成红色 等待1秒钟 把长方形涂成蓝色 在以下代码中: 这是因为任何JavaFX组件都必须由JavaFX应用程序线程管理,因为它们不是线程安全的(这与任何Swing组件必须由AWT事件调度线程管理的原因完全相同),因此,您需要使用Platform.runLater(runnable)作为下一步间接修改标签: 使用Java8 Platform.runLater(() -> myLabel.setText("WORLD!")); 使用以前版本的Java
这是因为任何
JavaFX组件
都必须由JavaFX应用程序线程
管理,因为它们不是线程安全的(这与任何Swing组件
必须由AWT事件调度线程
管理的原因完全相同),因此,您需要使用Platform.runLater(runnable)
作为下一步间接修改标签:
使用Java8
Platform.runLater(() -> myLabel.setText("WORLD!"));
使用以前版本的Java
Platform.runLater(new Runnable() {
public void run() {
myLabel.setText("WORLD!");
}
}
);
我们使用SwingUtilities.invokeLater(runnable)
使AWT事件调度线程执行一些代码,这些代码将在将来某个不确定的时间修改Swing组件
,这与平台的想法相同。如果Java FX组件
,则使用runLater(runnable)
NB:仅使用Swing
组件或仅使用javafx
组件,除非没有其他选择,否则避免混合使用Swing
和JavaFX
组件。这是因为任何JavaFX组件都必须由JavaFX应用程序线程管理,因为它们不是线程安全的(这与任何Swing组件
必须由AWT事件调度线程
管理的原因完全相同),因此您需要使用平台间接修改标签。runLater(runnable)
如下:
使用Java8
Platform.runLater(() -> myLabel.setText("WORLD!"));
使用以前版本的Java
Platform.runLater(new Runnable() {
public void run() {
myLabel.setText("WORLD!");
}
}
);
我们使用SwingUtilities.invokeLater(runnable)
使AWT事件调度线程执行一些代码,这些代码将在将来某个不确定的时间修改Swing组件
,这与平台的想法相同。如果Java FX组件
,则使用runLater(runnable)
NB:只使用Swing
组件或只使用JavaFX
组件,避免混合使用Swing
和JavaFX
组件,除非你没有其他选择。永远不要暂停JFXAT,不要在它上面睡觉,你会杀死响应性,创建线程,在它上面睡觉,然后进入我们的身体e Platform.runLater更新UI
updateLbl(){
new Thread(new Runnable(){
Thread.sleep();//sleep //try catch
Platform.runLater ... //inside update ui
}).start();
}
永远不要暂停JFXAT,不要在它上面睡觉,你会终止响应,创建一个线程,在它上面睡觉,然后在它里面使用Platform.runLater更新UI
updateLbl(){
new Thread(new Runnable(){
Thread.sleep();//sleep //try catch
Platform.runLater ... //inside update ui
}).start();
}
你说“它崩溃了”。怎么做?你能发布可编译的示例吗?invokeLater
的回调在UI线程上执行代码,你不应该阻止它。没有编译时错误,但当我按下那个按钮时,我得到了这个错误。我编辑了。你说“它崩溃了”.How?你能发布可编译的示例吗?Callback forinvokeLater
在UI线程上执行代码,你不应该阻止它。没有编译时错误,但当我按下那个按钮时,我得到了这个错误。我编辑了。你就是那个人。这很有道理。我对java的GUI相当陌生,所以我对javafx和swing之类的东西非常混淆。你是这个人。这是有道理的。我对java的GUI相当陌生,所以我对javafx和swing之类的东西非常困惑。我想我明白你的意思。如果我有多个按钮都可以画东西,如果我在睡眠状态下运行其中一个按钮,它会暂停任何其他GUI更新(但仍然会像文本和printf之类的更新).有没有办法让我只暂停特定的图形?正如我说的,永远不要!让JFXAT进入睡眠状态,创建另一个使其睡眠的线程,然后在该线程上调用runLater(睡眠后)要更新UI,这样您就不会暂停UI/JFXAT线程,操作会延迟。我让它来创建一个新线程。但是,我假设每次我想睡觉时,我都需要在新创建的线程中创建一个新线程?假设我想再暂停一次,我可以再次在该线程中睡觉吗(我假设这个线程是正确的)或者我要在这个线程中创建一个新线程吗?只要你需要它,随时保持它的活动状态,一旦你不需要它,它就会被垃圾收集,所以如果你想再睡一次并更新它,只需在runLater之后再睡一次,然后再次使用runLater进行另一次更新pdate,没有必要在该线程中创建另一个线程这有什么用途?您只需要一个线程就可以从JFXAT转义,如果您的方法是在JFXAT上调用的,请记住不要将该sleep()最后,AT在JFXAT中代表什么?我想我明白你的意思了。如果我有多个按钮都画了什么,如果我在睡眠状态下运行其中一个按钮,它会暂停任何其他GUI更新(但仍然会像文本和printf一样更新).有没有办法让我只暂停特定的图形?正如我说的,永远不要!让JFXAT进入睡眠状态,创建另一个使其睡眠的线程,然后在该线程上调用runLater(睡眠后)要更新UI,这样您就不会暂停UI/JFXAT线程,操作会延迟。我让它来创建一个新线程。但是,我假设每次我想睡觉时,我都需要在新创建的线程中创建一个新线程?假设我想再暂停一次,我可以再次在该线程中睡觉吗(我假设这个线程是正确的)或者我要在这个线程中创建一个新线程吗?只要你需要它,随时保持它的活动状态,一旦你不需要它,它就会被垃圾收集,所以如果你想再睡一次并更新它,只需在runLater之后再睡一次,然后再次使用runLater进行另一次更新pdate,不需要在该线程中创建另一个线程,这有什么用途?您只需要一个线程来转义fr