Java 如何在EDT中运行swing输入对话框并获取返回值?

Java 如何在EDT中运行swing输入对话框并获取返回值?,java,multithreading,swing,Java,Multithreading,Swing,好的,我有以下问题,我为一个聊天应用程序编写了一个简单的GUI客户端,我需要借助JOptionPaneInputDialog向用户询问它的用户名。现在,当服务器发送特定通知时,应该会出现此对话框。因此,对话框将从第二个线程开始,而不是从EDT线程开始 我现在试图通过执行 EventQueue.invokeAndWait(new Runnable() { @Override public void run() { JOptionPane.showInputDialo

好的,我有以下问题,我为一个聊天应用程序编写了一个简单的GUI客户端,我需要借助
JOptionPane
InputDialog向用户询问它的用户名。现在,当服务器发送特定通知时,应该会出现此对话框。因此,对话框将从第二个线程开始,而不是从EDT线程开始

我现在试图通过执行

EventQueue.invokeAndWait(new Runnable()
{
    @Override public void run()
    {
        JOptionPane.showInputDialog(null, "Choose a username:",
            "Username selection", JOptionPane.PLAIN_MESSAGE);
    }
});
包含给定代码的my函数的标题,应返回用户输入:

public String showNameInputDialog()

我的问题是,我无法从对话框接收用户输入(不能使用局部变量),因为我是在内部类中启动它的。因此,我的问题是,是否有一个选项可以接收用户输入并在EDT中运行对话框?

您可以使用容器变量来捕获结果:

final String[] resultContainer = new String[1];
EventQueue.invokeAndWait(new Runnable()
{
    @Override public void run()
    {
        resultContainer[0] = JOptionPane.showInputDialog(null, "Choose a username:",
            "Username selection", JOptionPane.PLAIN_MESSAGE);
    }
});
String result = resultContainer[0];
// ... do something with result.