Нет WindowEvent при закрытии JDialog - PullRequest
4 голосов
/ 01 марта 2012

Я отображаю JDialog в JFrame.Этот JDialog ничего не делает по утилизации.Я хотел бы поймать событие закрытия и отобразить всплывающее окно, но ничего не происходит.

Я не могу найти ошибку.Не могли бы вы сказать мне, где проблема?

Большое спасибо!

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

1 Ответ

7 голосов
/ 01 марта 2012

Вы забыли добавитьWindowListener в свой класс JDialogTest, чтобы перехватить событие WINDOW CLOSING.Примерно так:

addWindowListener(this);

Более того, вы вызываете setVisible(true) один раз внутри вашего класса JDialogTest, а другой раз при создании объекта класса JDialogTest внутри класса JFrameTest.

Пожалуйста, никогда не используйтелюбой метод setXXXSize (...) в Swing, пусть Layout Manager беспокоится об этой части.Более того, будет разумно использовать setLocationByPlatform(true) вместо setLocationRelativeTo(null).Очень хороший пример того, почему следует использовать первый вместо второго, приведен @Andrew Thompson в этой теме для Как лучше позиционировать Swing GUI

...