【问题标题】:No WindowEvent on closing a JDialog关闭 JDialog 时没有 WindowEvent
【发布时间】:2012-03-01 16:01:06
【问题描述】:

我在 JFrame 中显示一个 JDialog。这个 JDialog 对 dispose 没有任何作用。我想捕捉关闭事件并显示一个弹出窗口,但没有任何反应。

我找不到错误。你能告诉我问题出在哪里吗?

非常感谢!

import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Window;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;


@SuppressWarnings("serial")
public class JFrameTest extends JFrame {

    public JFrameTest() {
        setLayout(new FlowLayout());
        setSize(300, 300);
        add(new JTextArea("This is a text"));
        setDefaultCloseOperation(JFrameTest.EXIT_ON_CLOSE);
        getContentPane().setPreferredSize(getSize());
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        JDialogTest dialog = new JDialogTest(this, Dialog.ModalityType.APPLICATION_MODAL);
        dialog.setVisible(true);
    }

    public static void main(String[] args) {
        new JFrameTest();
    }

    private class JDialogTest extends JDialog implements WindowListener {

        public JDialogTest(Window parent, ModalityType modalityType) {
            super(parent, modalityType);

            setLayout(new FlowLayout());
            add(new JLabel("This is another text"));
            setSize(200, 50);

            setDefaultCloseOperation(JDialogTest.DO_NOTHING_ON_CLOSE);
            setLocationRelativeTo(null);
            getContentPane().setPreferredSize(getSize());
            pack();
            setVisible(true);
        }

        @Override
        public void windowActivated(WindowEvent e) {}

        @Override
        public void windowClosed(WindowEvent e) {}

        @Override
        public void windowClosing(WindowEvent e) {
            JOptionPane.showMessageDialog(this, "A popup message!");
        }

        @Override
        public void windowDeactivated(WindowEvent e) {}

        @Override
        public void windowDeiconified(WindowEvent e) {}

        @Override
        public void windowIconified(WindowEvent e) {}

        @Override
        public void windowOpened(WindowEvent e) {}
    }
}

【问题讨论】:

    标签: java swing jdialog windowlistener


    【解决方案1】:

    您忘记将WindowListener 添加到您的JDialogTest 类,以捕捉WINDOW CLOSING 事件。像这样:

    addWindowListener(this);
    

    此外,您在 JDialogTest 类中调用 setVisible(true) 一次,另一次在 JFrameTest 类中创建 JDialogTest 类的对象时调用。

    请不要在 Swing 中使用任何 setXXXSize(...) 方法,让布局管理器担心这部分。此外,最好使用setLocationByPlatform(true) 而不是setLocationRelativeTo(null)。 @Andrew Thompson 在How to best position Swing GUI's 的这个线程中给出了一个很好的例子来说明为什么应该使用前者而不是后者。

    【讨论】:

    • 非常感谢您的帮助!是的,我忘了 addWindowListener(this);其余的,只是一个SSCCE 向您展示我的问题。但无论如何,谢谢你的建议。
    • @user902025 : 欢迎您并保持微笑 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多