打开窗口时运行的Java方法

时间:2013-03-18 04:45:26

标签: java swing user-interface jframe show

我需要设置一个侦听器,每次调用show()方法来显示窗口时都可以调用该方法。我怎么能这样做?

3 个答案:

答案 0 :(得分:6)

您可能对WindowListener感兴趣。

来自the tutorial, "How to Write Window Listeners"

  

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

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

如果您不想实施所有这些内容,可以使用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");
    }
});

答案 1 :(得分:3)

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

有关详细信息,请参阅How to Write a Component Listener

此源演示了两个侦听器。

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

答案 2 :(得分:2)

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

编辑:

WindowListener只能运行一次。正如Per @Andrew Thompson所说,我们应该使用ComponentListener。当然最好的答案