我正在处理一些奇怪的遗留代码。他们有一个实现JPanel的自定义对象。这个< code>JPanel对象是主应用程序中的第二个弹出屏幕。我遇到的问题是检测辅助弹出屏幕何时关闭。
我尝试为该类实现一个WindowListener
,但是当我尝试添加它时,没有与此对象关联的JFrame
。我假设这是因为他们正在使用一个自定义对象,它是一个嵌入式弹出屏幕。
我尝试使用以下命令检索JFrame
:
JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
这在空点异常
上失败。我不知道为什么在这个页面上检测右上角的“x”关闭按钮如此困难!我应该提到,他们能够将鼠标和按键侦听器添加到嵌入在JPanel
中的表中。但是整个窗口的外部听众给我带来了麻烦。
(请耐心等待,这是我的第一篇堆栈溢出帖子,我是Swing的新手。
非常感谢!!
对于这个答案,我做了一个小小的假设,即空指针没有被抛到您提到的行,而是在您尝试将WindowListener添加到父帧时抛出。这很可能是因为您正在调用
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;
}
}
无法理解为什么在以下位置获得“NullPointerException”:
JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
在两种情况下会发生这种情况:
JFrame parentFrame = (JFrame) SwingUtilities.getWindowAncestor(null);
在您的情况下,这是不可能的,因为您已经将它用作参数。
其次,你是否在上面的代码行中做了一些其他的操作,比如:
JFrame parentFrame = ((JFrame) SwingUtilities.getWindowAncestor(this)).someOperation();
在这种情况下,如果您的this对象代表顶部窗口,那么您应该得到“NullPointerException”,因为顶部父级的祖先返回为“null”。在其他情况下,我怀疑你会得到这个异常。
你能在出现异常的地方发布一段代码吗?
尝试为那个奇怪的面板调用getParent()。它应该返回父GUI组件。如果这仍然不是你的框架,而是一些中间面板,那么也可以调用getParent()。顶层组件返回null。
Component p = strangePanel;
while ( p != null && ! (p instanceof Window))
p = p.getParent();
((Window) p ).addWindowListener(..);
问题内容: 我有一个带有许多不同复选框和文本字段的JPanel,我有一个已禁用的按钮,并且在设置特定配置时需要将其启用。我需要的是整个JPanel上的侦听器,以在发生任何更改时查找事件。我相信我需要一个动作监听器,但找不到任何东西可以将动作监听器与JPanel桥接 我认为我可以将代码复制和粘贴很多次到面板中的每个侦听器中,但这对我来说似乎是不好的编码习惯。 问题答案: 首先在他的@Sage提意见一
问题内容: 我希望能够在用户单击按钮时触发一个事件,然后将其按住1000到1500毫秒。 是否有jQuery核心功能或已经启用了此功能的插件? 我应该自己滚吗?我应该从哪里开始? 问题答案: 编辑 :每个AndyE的更正…谢谢! 编辑2 :现在为每个gnarf对具有相同处理程序的两个事件使用bind
问题内容: 我做了一个时间转换器,您可以通过单击按钮来增加或减少时间。但是,我希望当我单击并按住按钮时,时间的价值将继续攀升。 因此,当前,如果您每次单击向上按钮时都看到我的Plunkr,则该值会增加,但是我希望这样做,因此当我按住按钮时,该值会增加,直到释放按钮为止。 我怎样才能实现这样的目标? 问题答案: 演示 将ng-mouseDown和ng-mouseup指令与$ interval一起使用
我有一个基本回收适配器,如下所示: : 基本视图保持架为: 假设ViewHolder有两个视图,一个TextView和一个ImageView。如何对ViewHolder的itemview中的所有项目实现ClickListener
我试图用我的键控制火箭动画,并尝试使用KeyListener方法,然而,我的程序对我的按键没有反应。我尝试将keylistener添加到我的JFrame,但它没有调用它,因为JFrame是一个单独的静态方法。如果你运行它,你将没有图像,但是,如果你运行,请替换为矩形。你能说出我的错误吗。提前谢了。 下面是我的代码:
问题内容: MongoDB建议,处理安全性的简单方法是在受信任的环境中运行安全性,因为“在这种配置中,必须确保只有受信任的计算机才能访问数据库TCP端口。” 这样做的最佳方法是什么?mongodb是否有办法仅本地监听localhost? 我正在使用Ubuntu 10.10 问题答案: 将以下行添加到: 正如@Josh Rickard在评论中所述:不要忘记在更新配置文件后重新启动进程: