0

我需要设置一个监听器,它可以在每次show()调用方法来显示窗口时调用一个方法。我怎样才能做到这一点?

4

3 回答 3

7

你可能会对WindowListener.

教程“如何编写窗口侦听器”中

以下窗口活动或状态可以在窗口事件之前:

  • 打开一个窗口——第一次显示一个窗口。
  • 关闭窗口 — 从屏幕上移除窗口。
  • 图标化窗口 — 将窗口缩小为桌面上的图标。
  • 取消图标化窗口 — 将窗口恢复到其原始大小。
  • 焦点窗口 — 包含“焦点所有者”的窗口。
  • 激活的窗口(框架或对话框)——这个窗口要么是焦点窗口,要么拥有焦点窗口。
  • 已停用的窗口 - 此窗口已失去焦点。有关焦点的更多信息,请参阅 AWT 焦点子系统规范。

如果您不想实现所有这些,可以使用 a WindowAdapter,如下所示:

myFrame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowOpened(WindowEvent we) {
        System.out.println("this window was opened for the first time");
    }

    @Override
    public void windowActivated(WindowEvent we) {
        System.out.println("this window or a subframe was focused");
    }
});
于 2013-03-18T04:48:56.667 回答
3

添加ComponentListener并检查componentShown事件。请注意, aWindowListener只会在第一次打开窗口时触发,而每次ComponentListener都会触发。

有关详细信息,请参阅如何编写组件侦听器

此源演示了两个侦听器。

import java.awt.*;
import java.awt.event.*;
import java.util.logging.*;
import javax.swing.*;
import javax.swing.event.*;

class DetectVisibility {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JPanel gui = new JPanel(new BorderLayout());
                final Logger log = Logger.getAnonymousLogger();

                ComponentListener cl = new ComponentListener() {

                    @Override
                    public void componentResized(ComponentEvent e) {
                        log.log(Level.INFO, e.toString());
                    }

                    @Override
                    public void componentMoved(ComponentEvent e) {
                        log.log(Level.INFO, e.toString());
                    }

                    @Override
                    public void componentShown(ComponentEvent e) {
                        log.log(Level.INFO, e.toString());
                    }

                    @Override
                    public void componentHidden(ComponentEvent e) {
                        log.log(Level.INFO, e.toString());
                    }
                };

                WindowListener we = new WindowListener() {

                    @Override
                    public void windowOpened(WindowEvent e) {
                        log.log(Level.INFO, e.toString());
                    }

                    @Override
                    public void windowClosing(WindowEvent e) {
                        log.log(Level.INFO, e.toString());
                    }

                    @Override
                    public void windowClosed(WindowEvent e) {
                        log.log(Level.INFO, e.toString());
                    }

                    @Override
                    public void windowIconified(WindowEvent e) {
                        log.log(Level.INFO, e.toString());
                    }

                    @Override
                    public void windowDeiconified(WindowEvent e) {
                        log.log(Level.INFO, e.toString());
                    }

                    @Override
                    public void windowActivated(WindowEvent e) {
                        log.log(Level.INFO, e.toString());
                    }

                    @Override
                    public void windowDeactivated(WindowEvent e) {
                        log.log(Level.INFO, e.toString());
                    }
                };

                final JWindow w = new JWindow();
                w.setSize(100,100);
                w.setLocation(10,10);
                w.addComponentListener(cl);
                w.addWindowListener(we);

                final JCheckBox show = new JCheckBox("Show Window");
                ChangeListener chl = new ChangeListener() {

                    @Override
                    public void stateChanged(ChangeEvent e) {
                        w.setVisible(show.isSelected());
                    }
                };
                show.addChangeListener(chl);
                gui.add(show);

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}
于 2013-03-18T05:43:17.383 回答
2

有一个名为WindowListener的接口,这是一个在打开窗口时触发的事件。您可以在第一个链接中找到所有事件。

编辑 :

WindowListener 只工作一次。根据@Andrew Thompson 的帖子,我们应该使用 ComponentListener。当然是最好的答案

于 2013-03-18T04:48:59.767 回答