如何在JPanel中收听关闭

时间:2013-01-18 06:15:32

标签: swing jpanel windowlistener

我正在使用一些奇怪的遗留代码。他们有一个实现JPanel的自定义对象。此JPanel对象是主应用程序中的辅助弹出屏幕。我遇到的问题是检测辅助弹出屏幕何时关闭。

我尝试为该类实现WindowListener,但是当我尝试添加它时,没有与此对象关联的JFrame。我假设这是因为他们使用自定义对象,它是一个嵌入式弹出屏幕。

我尝试使用

检索JFrame
JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);

NullPointerException失败。我不知道为什么在这个页面上检测右手角“x”关闭按钮是如此困难!我应该提一下,他们能够将鼠标和键监听器添加到JPanel中嵌入的表中。但整个窗口的外部听众给我带来了麻烦。

(请耐心等待,这是我的第一篇stackoverflow帖子,我是Swing的新手。)

非常感谢!!

3 个答案:

答案 0 :(得分:4)

尝试为那个奇怪的小组打电话getParent()。它应该返回父GUI组件。如果这仍然不是你的框架而是一些中间面板,那么也要调用它的getParent()。顶级组件返回null。

   Component p = strangePanel;
   while ( p != null && ! (p instanceof Window))
     p = p.getParent();

   ((Window) p ).addWindowListener(..);

答案 1 :(得分:0)

无法理解为什么你会在

获得“NullPointerException”
JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);

在两种情况下,这可能发生:

JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(null);

在您的情况下,这是不可能的,因为您已使用作为参数。

其次,您是否正在上面的代码行中执行其他操作,例如:

JFrame parentFrame = ((JFrame) SwingUtilities.getWindowAncestor(this)).someOperation();

在这种情况下,如果您的 this 对象代表顶部窗口,那么您应该得到“NullPointerException”,因为顶级父级的祖先返回为“null”。在其他情况下,我怀疑你会得到这个例外。

你可以发布一个代码块来获得异常。

答案 2 :(得分:0)

对于这个答案,我做了一个小小的假设,即Nullpointer没有被抛出你提到的那一行,而是当你试图将WindowListener添加到parentFrame时。这很可能是因为你正在打电话

JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
在将JPanel添加到JFrame层次结构之前

这是一个关于如何解决这个问题的代码示例。以为它等待面板被通知它已经附加到其层次结构中某处的JFrame。

package test;

import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class HierarchyTest extends JPanel {

    protected static void loadApp() {
        HierarchyTest test = new HierarchyTest();
        JFrame frame = new JFrame();
        frame.add(test);
        frame.setSize(200, 200);
        frame.setVisible(true);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                loadApp();

            }
        });

    }

    public HierarchyTest() {
        this.addHierarchyListener(new HierarchyListener() {

            @Override
            public void hierarchyChanged(HierarchyEvent e) {
                // This can be optimized by checking the right flags, but I leave that up to you to look into
                boolean connected = setupListenersWhenConnected();

                if (connected) {
                    HierarchyTest.this.removeHierarchyListener(this);
                }
            }
        });
    }

    protected boolean setupListenersWhenConnected() {
        JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
        if (parentFrame == null) {
            return false;
        }
        parentFrame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                // Implementation here
                System.out.println("This window is closing!");
            }
        });
        return true;
    }
}