首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待jdialog关闭

等待jdialog关闭
EN

Stack Overflow用户
提问于 2011-10-22 04:59:33
回答 3查看 14.5K关注 0票数 7

我有一个扩展JDialog的类FilePathDialog,这个类是从某个类X调用的。

代码语言:javascript
复制
    projectDialog = new FilePathDialog();   
    projectDialog.setVisible(true);

    projectDialog.addWindowListener(new WindowAdapter() {            
        public void windowClosing(WindowEvent e) {
            System.out.println("Window closing");
            try {
                doWork();
            } catch (Throwable t) {
                t.printStackTrace();
            }                
        }

        public void windowClosed(WindowEvent e) {
            System.out.println("Window closed");
            try {
                doWork();
            } catch (Throwable t) {
                t.printStackTrace();
            }                
        }
    });     

当JDialog窗口关闭时,永远不会调用doWork。我所要做的就是等待JDialog关闭,然后再继续执行该方法。我也尝试过使用SwingWorker和Runnable,但都没有用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-22 05:26:34

再说一次,关键是是对话模式还是不是

如果它是模态的,那么就不需要WindowListener了,因为你会知道对话框已经被处理了,因为代码将在你调用对话框上的setVisible(true)之后立即恢复。也就是说,这应该是可行的:

代码语言:javascript
复制
projectDialog = new FilePathDialog();   
projectDialog.setVisible(true);
doWork(); // will not be called until the dialog is no longer visible

另一方面,如果它是无模式的,那么WindowListener应该可以工作,并且您可能在此处未显示的代码中遇到了另一个问题,并且您将希望发布一个sscce以便我们分析、运行和修改。

gpeche的编辑

请查看此SSCCE,其中显示了3种类型的默认关闭参数将触发窗口监听器:

代码语言:javascript
复制
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DialogClosing {
   private static void createAndShowGui() {
      JFrame frame = new JFrame("DialogClosing");

      JPanel mainPanel = new JPanel();
      mainPanel.add(new JButton(new MyAction(frame, JDialog.DISPOSE_ON_CLOSE, "DISPOSE_ON_CLOSE")));
      mainPanel.add(new JButton(new MyAction(frame, JDialog.HIDE_ON_CLOSE, "HIDE_ON_CLOSE")));
      mainPanel.add(new JButton(new MyAction(frame, JDialog.DO_NOTHING_ON_CLOSE, "DO_NOTHING_ON_CLOSE")));

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyAction extends AbstractAction {
   private JDialog dialog;
   private String title;

   public MyAction(JFrame frame, int defaultCloseOp, final String title) {
      super(title);
      dialog = new JDialog(frame, title, false);
      dialog.setDefaultCloseOperation(defaultCloseOp);
      dialog.setPreferredSize(new Dimension(300, 200));
      dialog.pack();
      dialog.addWindowListener(new WindowAdapter() {
         @Override
         public void windowClosed(WindowEvent e) {
            System.out.println(title + " window closed");
         }
         @Override
         public void windowClosing(WindowEvent e) {
            System.out.println(title + " window closing");
         }
      });

      this.title = title;
   }

   @Override
   public void actionPerformed(ActionEvent arg0) {
      dialog.setVisible(true);
   }
}
票数 18
EN

Stack Overflow用户

发布于 2011-10-22 05:26:47

用于WindowListener.windowClosed()的Javadoc

当窗口由于在窗口上调用dispose而关闭时调用。

而对于JDialog.setDefaultCloseOperation()

设置当用户在此对话框上启动“关闭”时将默认发生的操作。可能的选择包括:

  • DO_NOTHING_ON_CLOSE -不做任何事情-要求程序处理已注册对象的object.
  • HIDE_ON_CLOSE方法中的操作-调用任何已注册的WindowListener对象后自动隐藏对话框-调用任何已注册的object.
  • HIDE_ON_CLOSE

后自动隐藏和释放对话框

默认情况下,该值设置为HIDE_ON_CLOSE。

这表明您应该在实例化FilePathDialog之后调用projectDialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

票数 3
EN

Stack Overflow用户

发布于 2011-10-22 07:08:14

回答你的问题

在发生windowClosing事件时,将WindowListener添加到JDialog (JDialog.DO_NOTHING_ON_CLOSE)以尝试运行代码,如果成功,则调用dispose()setVisible(false)

我不同意你的想法,另一个变通办法

使用WindowListener仅创建一个JDialog (JDialog.DO_NOTHING_ON_CLOSE),并将其重用于另一个Action,最终操作将始终为setVisible(false),如果您的代码以成功结束,则从JDialog中删除子项,则您的JDialog已为另一个作业做好准备

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7855227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档