我正在使用一些奇怪的遗留代码。他们有一个实现JPanel的自定义对象。此JPanel
对象是主应用程序中的辅助弹出屏幕。我遇到的问题是检测辅助弹出屏幕何时关闭。
我尝试为该类实现WindowListener
,但是当我尝试添加它时,没有与此对象关联的JFrame
。我假设这是因为他们使用自定义对象,它是一个嵌入式弹出屏幕。
我尝试使用
检索JFrame
JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
在NullPointerException
失败。我不知道为什么在这个页面上检测右手角“x”关闭按钮是如此困难!我应该提一下,他们能够将鼠标和键监听器添加到JPanel
中嵌入的表中。但整个窗口的外部听众给我带来了麻烦。
(请耐心等待,这是我的第一篇stackoverflow帖子,我是Swing的新手。)
非常感谢!!
答案 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;
}
}