加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 等待jdialog关闭

发布时间:2020-12-15 02:51:31 所属栏目:Java 来源:网络整理
导读:我有一个类FilePathDialog,它扩展了JDialog,并且该类是从某个类X调用的.这是X类中的一个方法 projectDialog = new FilePathDialog(); projectDialog.setVisible(true); projectDialog.addWindowListener(new WindowAdapter() { public void windowClosing(Wi
我有一个类FilePathDialog,它扩展了JDialog,并且该类是从某个类X调用的.这是X类中的一个方法
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,但这没有帮助.

解决方法

同样,关键是对话模式与否?

如果它是模态的,则不需要WindowListener,因为您将知道对话框已被处理,因为代码将在对话框的setVisible(true)调用之后立即恢复.即,这应该工作:

projectDialog = new FilePathDialog();   
projectDialog.setVisible(true);
doWork(); // will not be called until the dialog is no longer visible

另一方面,如果它没有模式,则WindowListener应该可以工作,并且您可能在此处未显示的代码中遇到另一个问题,并且您将要发布sscce以供我们分析,运行和修改.

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

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);
   }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读