Java 在方法中创建包含ActionListeners的GUI

Java 在方法中创建包含ActionListeners的GUI,java,swing,user-interface,actionlistener,windowlistener,Java,Swing,User Interface,Actionlistener,Windowlistener,我在Java应用程序的一个类中有一个方法,它可以生成Swing GUI,并有自己的动作监听器——这很好。但是,当窗口关闭时,我需要返回字符串[]数组的方法;这是导致问题的部分 我在方法的末尾添加了一个简单的return语句,但是很明显,Java并不等待动作监听器,并且认为一旦添加了动作监听器,方法就完成了。那么,有没有什么方法可以“保留”一个方法,然后在我准备好的时候恢复它——或者甚至是对我的问题采用不同的解决方案 提前感谢请尝试使用,以便在关闭窗口时发送阵列 例如: public class

我在Java应用程序的一个类中有一个方法,它可以生成Swing GUI,并有自己的动作监听器——这很好。但是,当窗口关闭时,我需要返回
字符串[]
数组的方法;这是导致问题的部分

我在方法的末尾添加了一个简单的
return
语句,但是很明显,Java并不等待动作监听器,并且认为一旦添加了动作监听器,方法就完成了。那么,有没有什么方法可以“保留”一个方法,然后在我准备好的时候恢复它——或者甚至是对我的问题采用不同的解决方案

提前感谢

请尝试使用,以便在关闭窗口时发送阵列

例如:

public class YourClass{
    ...
    window.addWindowListener(new NameOfListener());
    ...

    class NameOfListener() extends WindowAdapter{
        @Override
        public void windowClosed(final WindowEvent e)
        {
            // send your array
            anInstanceYouWish.setArrayXY(yourStringArray);
        }
    }
}


您可以向
JFrame
实例中添加一个,并重写该方法。在这里,您可以实现自己的行为。

使用模态
JDialog
JOptionPane
。打开它的代码将在此点暂停-直到模态组件从屏幕上消失。

嗨,安迪,你能发布你的代码吗?它可能会让我们更好地了解您正在尝试做什么?如果我理解正确,您不会希望在这里“保留”一个方法,而是保留一个状态。然后,正如其他人在下面的好答案中所指出的,在WindowListener中获取这种状态。我将尝试重申。我真正需要做的是停止方法返回(即完成),直到调用了一个操作侦听器来填充要返回的数组!请重写第二段。这对我来说毫无意义。顺便说一句,帮助解释问题的一个好方法是发布一个。它可能不包含程序员为什么选择这种方法的信息,但会回答许多其他问题(包括“代码现在做什么?”)。顶级容器不仅适用于JFrame+1@mKorbel+1,我做了一个假设,但你是对的-这适用于所有顶级容器。什么是WindowsClosing或WindowsClosing更好?@mre:正如我对Neifen所说的,这样做的问题是return语句不适用于父方法。另外,添加操作/窗口侦听器后,该方法仍将继续。我想我真正需要的是一种暂停实际方法的方法,这样当信息准备好时,动作监听器就可以恢复它。。。有什么方法可以做到这一点吗?对于整个JVM实例,这个WindowListener只声明一次,并返回顶级及其事件,您是否期望得到更多…很抱歉回复太慢,谢谢您的回答。不幸的是,由于以下几个原因,您的解决方案对我不起作用。1) 它是一个创建GUI而不是类的方法,2)我确实有一个窗口侦听器,但每当我尝试使用它返回数组时,我的IDE只是告诉我从
void
更改返回类型,因此return语句实际上不适用于父方法。1)如何在方法中创建GUI?2) 侦听器不能有return语句。因此,您必须在需要数组的地方创建一个set方法。我在该方法中创建GUI,就像您通常做的那样:创建一个包含一些JComponents的JPanel,添加操作侦听器,并将JPanel设置为JFrame中的内容窗格!不过我认为你对我的处境理解不正确。假设我有一个名为“Return”的按钮,它附带了一个动作侦听器。我只想返回数组,并在按下该按钮时完成该方法…您还必须小心同步,因为设置数组值的方法正在GUI线程中运行,但将读取的方法正在主线程中运行。有关获取最新JavaDocs链接的提示,请参阅。不要忘记使用
setModal(true)设置JDialog模式@Neifen+1,但如果可能的话,我更喜欢在中指定模态。如果只是因为它少了一行代码就好了。;)@安德鲁·汤普森:非常抱歉延迟回复,非常感谢您的回复。模态JDialog正是我所需要的……不客气。:-)就回复时间而言,(耸耸肩)72小时在国际海事组织更像是一个“延迟回复”——我问了一些问题,得到的答案比我回答任何进一步评论之前都要长