JDialog WindowOpened事件只触发一次

时间:2013-02-28 16:26:24

标签: java swing jdialog windowlistener

我正在尝试从WindowOpened获取JDialog事件,但它只被触发一次。 为什么windowClosing正常工作而WindowOpened只能使用一次?有没有办法每次都为JDialog解雇公开赛事?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;

public class NewClass extends JDialog {

    public void init() {
        setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
        setModal(true);
        setSize(100,100);
        setLocationRelativeTo(null);
    }

    public void addListener() {
        addWindowListener(
            new java.awt.event.WindowAdapter() {
            public void windowOpened(WindowEvent e) {
                System.out.println("Invoking WindowOpened from JDialog");
            }
            public void windowClosing(WindowEvent e) {
                System.out.println("Invoking WindowClosing from JDialog");
                dispose();
            }
        });
    }

    public static void main( String args[]) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(200,70);

        final NewClass d = new NewClass();
        d.init();
        d.addListener();

        JButton b = new JButton("Show Dialog");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                d.setVisible(true);
            }
        });

        f.getContentPane().add(b);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:2)

addWindowListener(new WindowAdapter() {
            @Override
            public void windowActivated(WindowEvent e) {
                // TODO Auto-generated method stub
                super.windowActivated(e);
            }
        });

答案 1 :(得分:2)

ComponentListener#componentShown(ComponentEvent e)只要您的窗口可见就会被触发。

我不相信WindowActivated是一个不错的选择(就像其他人说的那样),因为它可以在其他一些情况下解雇。例如,如果您的Dialog不是模态的,只要窗口重新获得焦点,就会触发WindowActivated。