java - swing - windowlistener

har*_*ech 2 java swing jframe windowlistener

如果我正在创建一个类,我将在我的JFrame中加载该类的对象(该类基本上是一个包含按钮和文本对象的面板,但这并不重要),直到我的公共静态才会实例化void main(String [] args){(在类代码下面),如何将WindowListener和其他侦听器关联到该JFrame,因为它不是原始类的一部分?

通常,当我遇到这个问题时,Eclipse会告诉我将JFrame或其他对象设置为静态并通用它,但我尝试了这个并且我认为它不适用于JFrame的实例.

我已经阅读了http://download.oracle.com/javase/tutorial/uiswing/events/windowlistener.html和其他教程,但我想要一个通用的答案,以及对我的应用程序的这个特定问题的答案,因为我遇到这个问题很多.

感谢任何可以提供帮助的人或任何阅读此内容的人!

Ben*_*Ben 5

向我们展示您现有的代码会让您更清楚自己想要做什么,但听起来好像您有一个类代表您的面板并且还包含您的main方法.这是可能的,但我不推荐它,因为它模糊了应用程序的结构,虽然它是教程中的一种流行技术,因为它使一切都适合一个文件.

A WindowListener表示需要响应窗口事件的任何对象,即窗口状态的变化(JFrame在这种情况下为a),当它被激活,图标化等时.监听器也可以表示图形组件,但不需要这样做.

这是一个非常简单的例子,我希望能够说明这些概念.让我们创建一个表示一种面板类的类,它包含一个JLabel将显示到目前为止发生的窗口事件数.它还将实现,WindowListener以便可以在每次发生时通知它们并递增计数器.

您应该能够按原样编译和运行此代码,然后在最小化/最大化窗口时查看计数器更改,单击其他窗口等等.

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

public class TestPanel extends JPanel implements WindowListener {
    private JLabel label = new JLabel("No window events yet");
    private int numEvents = 0;

    public TestPanel() {this.add(label);}

    private void update() {
        label.setText(String.format("%d events",numEvents));
    }

    public void windowOpened(WindowEvent e) {
        numEvents++;
        update();
    }

    // ... similar implementations of the other WindowListener methods ...
}
Run Code Online (Sandbox Code Playgroud)

然后我们需要一个主程序来实例化我们的一个面板并将其显示在一个面板中JFrame.

import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndDisplayGui();
            }
        });
    }

    private static void createAndDisplayGui() {
        JFrame frame = new JFrame("Test Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        TestPanel panel = new TestPanel();
        frame.add(panel);               // add the panel as a component in the frame
        frame.addWindowListener(panel); // add the panel as a listener to the frame
        frame.pack();                   // lay out and size the frame
        frame.setVisible(true);         // display the frame
    }
}
Run Code Online (Sandbox Code Playgroud)