Java 使用invokeLater或invokeAndWait等待来自另一个GUI的响应

Java 使用invokeLater或invokeAndWait等待来自另一个GUI的响应,java,swing,swingx,Java,Swing,Swingx,这种方法应该是将词汇表中单个条目的两个定义合并在一起。它创建GlossaryEntryMergeUI类(JFrame的扩展)的一个实例,引导用户完成合并过程。用户单击按钮提交,窗口关闭。merge方法提取合并的定义并返回合并的词汇表条目 让合并方法等待来自MergeUI的响应的最佳方法是什么?我尝试使用InvokeAndWait,但我不知道如何使它工作 public GlossaryEntry merge(GlossaryEntry otherEntry){ //First, merge

这种方法应该是将词汇表中单个条目的两个定义合并在一起。它创建GlossaryEntryMergeUI类(JFrame的扩展)的一个实例,引导用户完成合并过程。用户单击按钮提交,窗口关闭。merge方法提取合并的定义并返回合并的词汇表条目

让合并方法等待来自MergeUI的响应的最佳方法是什么?我尝试使用InvokeAndWait,但我不知道如何使它工作

public GlossaryEntry merge(GlossaryEntry otherEntry){
    //First, merge the definitions
    GlossaryEntryMergeUI thisMerge = new GlossaryEntryMergeUI(this,otherEntry,mergeSignal);
    thisMerge.setVisible(true);
    thisMerge.setAlwaysOnTop(true);

    GlossaryEntry combined = new GlossaryEntry(word);
    combined.addDefinitions(thisMerge.getDefinitions());

    return combined;
}
  • 考虑在两个或多个窗口之间寻找而不是切换

  • 如果有Serializable或Observate,那么最好将代码包装到invokeAndWait()中,因为两个窗口之间的简单切换就是invokeLater()了

  • 我建议不要同时使用两个JFrame,一个JFrame和另一个窗口将是JDialod或JWindow,因为(例如,如果有背景任务)有时很难将焦点从一个JFrame切换到另一个JFrame,而不是将JFrame移动到Front()


这与invokeAndWait或invokeLater的使用无关,而与在一个线程上侦听另一个线程中的响应有关。如果您不使用一个模态对话框,例如JopTunPANE(这是非常容易使用的,并且如果需要的话,它可以保存一个非常复杂的GUI),考虑使用一个侦听器或者其他被称为观测器设计模式来在GUI被作用时通知非GUI组件。
此外,GlossaryEntryMergeUI是用户接触的唯一GUI吗?或者它是从另一个GUI(可能是“父”GUI)调用而来的?如果是后者,那么应该使用模态对话框,而不是JFrame。编辑:或根据mKorbel的优秀答案制作卡片布局。

有趣,现在这个问题让我明白了