我有一个简单的Groovy脚本,该脚本从其执行的主线程需要向用户显示一些对话框。

我的挥杆知识有限且生疏,但我回想起曾经读过的有关谨慎将GUI内容保留在事件调度线程(EDT)上的知识。

如果我只是从主线程调用静态JOptionPane.showMessageDialog方法,那我是否正确,认为这违反了将GUI内容保留在EDT上的正确做法?

我是否应该像下面的示例代码中那样实际使用swing.utils.invokeAndWait方法?


void showHelloThereDialog()
        throws Exception {
    Runnable showModalDialog = new
      Runnable() {
        public void run() {
            JOptionPane.showMessageDialog(
               myMainFrame, "Hello There");
        }
    };
    SwingUtilities.invokeAndWait
       (showModalDialog);
}


现在,除了invokeAndWait完成后的消息对话框之外,以上内容不执行任何操作来使值可用。

大概的事实是,时髦的“闭包”实现了Runnable将使代码比上面更简单。

是否需要invokeAndWait?如果可以的话,请提供正确实现的示例,以使用groovy获得诸如confirmDialog之类的结果?

最佳答案

看一下groovy.swing.SwingBuilder,它封装了invokeAndWait和invokeLater。您的示例可以写成:

import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*

def swing = new SwingBuilder()
def myMainFrame = new Frame()

swing.edt {
    JOptionPane.showMessageDialog(
        myMainFrame, "Hello There");
}

07-24 14:29