【问题标题】:java - swing - windowlistenerjava-swing-windowlistener
【发布时间】:2011-09-02 20:50:37
【问题描述】:

如果我正在创建一个类,并且我将在我的 JFrame 中加载该类的一个对象(该类基本上是一个带有按钮和文本对象的面板,但这并不重要),直到我的 public static void main(String[] args) { (在类代码下方),我如何将 WindowListener 和其他侦听器关联到该 JFrame,因为它不属于原始类?

通常,当我遇到此问题时,Eclipse 会告诉我将该 JFrame 或其他对象设为静态并对其进行通用调用,但我尝试过,但我认为它不适用于 JFrame 的实例。

我已经阅读了http://download.oracle.com/javase/tutorial/uiswing/events/windowlistener.html 和其他教程,但我想要一个一般性的答案,就像我的应用程序的这个特定问题的答案一样,因为我经常遇到这个问题。

感谢任何可以提供帮助或阅读本文的人!

【问题讨论】:

  • 一些说明你的困惑的代码会有所帮助。
  • 代码示例会很好!

标签: java swing jframe windowlistener


【解决方案1】:

向我们展示您现有的代码将使您更清楚您要做什么,但听起来好像您有一个既代表您的面板又包含您的main 方法的类。这是可能的,但我不推荐它,因为它会掩盖应用程序的结构,尽管它是教程中的一种流行技术,因为它使所有内容都可以放入一个文件中。

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

这是一个非常简单的例子,我希望能说明这些概念。让我们创建一个类来表示包含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 ...
}

然后我们需要一个主程序来实例化我们的一个面板并将其显示在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
    }
}

【讨论】:

  • 非常感谢您花时间回答这个问题。这为我回答了各种各样的问题——当我了解到你可以将你的类和主类结合起来时,我对我的 Java 类很感兴趣,但是你应该将它们分开是有道理的。我将为此编辑我的代码。干杯。
猜你喜欢
  • 2011-04-16
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 2012-05-16
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多