Java 确保在同一(EDT)事件调度线程中

Java 确保在同一(EDT)事件调度线程中,java,swing,Java,Swing,我有一门主课: public class Main extends JFrame { public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { public void run() { Main m = new Main(); m.initGUI(); } }); public void initGUI() { /

我有一门主课:

public class Main extends JFrame {
  public static void main(String args[]) {
 SwingUtilities.invokeLater(new Runnable() {
       public void run() {
       Main m = new Main();
       m.initGUI(); 
      }
 }); 
 public void initGUI() {
   //add components for this JFrame
   //add JPanel with table
   //etc..
   this.pack();
   this.setLocationRelativeTo(null);
   this.setVisible(true);
  }
}

然后我有一个扩展JPanel的类:

class CTable extends JPanel {
  JTable table;
   public void initGUI() {
  //add components, table to JPanel etc...
  //action listeners to table
 }
 public void handleTableRowOnClick(String data) { 
   InfoDialog d = new InfoDialog(data);
   //HERE IS MY PROBLEM
   //do something else here (THIS SHOULD EXECUTE BUT IT DOESN'T) such as:
   String test = "test"
   //(IT ONLY EXECUTES AFTER I CLOSE THE DIALOG)
    //and I need the ModalityType.APPLICATION_MODAL functionality
 } 
}
然后我还有一节课:

class InfoDialog extends JDialog {
  JComboBox cb;
  String data;
   public void initGUI() { 
    //add components such as JComboBox
    //etc...
    this.setModalityType(ModalityType.APPLICATION_MODAL);
    this.setTitle("test");
    this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    this.pack();
    this.setLocationRelativeTo(null);
    this.setVisible(true);
  }
  public InfoDialog(String data) {
   this.data = data;
   this.initGUI();
  }

}
我的问题是,在这种情况下,确保InfoDialog实例位于同一事件调度线程(EDT)中的最佳方法是什么


感谢您的回复。

最好的解决方案是在创建对话框之前检查
EventQueue.isDispatchingThread

public void handleTableRowOnClick(final String data) { 
    Runnable runner = new Runnable() {
        public void run() {
            InfoDialog d = new InfoDialog(data);
        }
    }
    if (EventQueue.isDispatchingThread()) {
        runner.run();
    } else {
        EventQueue.invokeLater(runner);
    }
} 

正如我在前面的问题中所说的,调用者应该负责确保代码正确执行,而不是组件。

同一事件调度线程是什么意思?只有一个EDT。(或者我误解了你的真实问题)我的意思是,对于InfoDialog,我不是在它的initGUI中调用SwingUtilities.invokeLater。在这种情况下我需要吗?我知道只有一个EDT,如何确保InfoDialog在同一个EDT中。在花了这么多时间调试之后,我现在一定是疯了。我已经在handleTableRowOnClick()方法中更新了我的问题,它导致了我所有的问题。请查看该方法中的注释。再次感谢你的帮助。谢谢你的回答。我会试试这个。不幸的是,我已经试过了,但它不起作用。它仍然挂起对话框并阻止后续执行。@lcplusplus然后在显示对话框之前将对话框设置为非模态:
dialog.setModal(false)
,并确保在构造函数中提供适当的“父”
窗口以避免“落后”效果。嗨,Guilloume,谢谢我尝试了你的方法,它工作正常。但是,问题是,即使JDialog保持在前端,我仍然可以使用父框架中的控件(一次只能访问一个对话框)。如果你能解决这个问题,我很乐意听你这么说。但是,如果打开下一个对话框,我将关闭当前的JDialog。再次感谢。