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

我想做以下几件事:

  • 点击按钮
  • 将矩形涂成红色
  • 等待1秒钟
  • 把长方形涂成蓝色
  • 在以下代码中:



    这是因为任何
    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 for
    invokeLater
    在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