Java 维护JInternalFrame的单个实例?
我有一个打开多个JIF的应用程序,但我只想创建一个JIF实例,所以我使用这些函数来检查,并在按下一个键(JDesktopPane.getSelectedFrame().dispose())后使用dispose关闭JIF。然而,在连续2-3次处置后,它不会创建新的JIF吗?我在这里做错什么了吗Java 维护JInternalFrame的单个实例?,java,swing,jinternalframe,Java,Swing,Jinternalframe,我有一个打开多个JIF的应用程序,但我只想创建一个JIF实例,所以我使用这些函数来检查,并在按下一个键(JDesktopPane.getSelectedFrame().dispose())后使用dispose关闭JIF。然而,在连续2-3次处置后,它不会创建新的JIF吗?我在这里做错什么了吗 public static void setInternalFrame(final JInternalFrame internalFrame) { log.debug("CurActiveInter
public static void setInternalFrame(final JInternalFrame internalFrame) {
log.debug("CurActiveInternalFrame " + ShoppyPOSApp.getCurrentActiveInternalFrame(), null);
log.debug("Incoming internalFrame " + internalFrame, null);
boolean isFrameFound = false;
try {
// Have a check whether the DesktopPane contains the internal Frame
// If yes bring it to front and set the focus
for (int i = 0; i < ShoppyPOSApp.frame.mainDesktopPane.getAllFrames().length; i++) {
if (ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i].getClass() == internalFrame.getClass()) {
isFrameFound = true;
}
}
if (!isFrameFound) {
internalFrame.setVisible(true);
internalFrame.setLocation(
ShoppyPOSApp.frame.mainDesktopPane.getWidth()/ 2 - internalFrame.getWidth() / 2,
ShoppyPOSApp.frame.mainDesktopPane.getHeight() / 2 - internalFrame.getHeight() / 2
);
ShoppyPOSApp.frame.mainDesktopPane.add(internalFrame);
}
internalFrame.setSelected(true);
} catch (Exception e) {
log.debug(e.toString(), null);
}
}
publicstaticvoidsetinternalframe(最终JInternalFrame internalFrame){
log.debug(“CurActiveInternalFrame”+ShoppyPOSApp.getCurrentActiveInternalFrame(),null);
log.debug(“传入的internalFrame”+internalFrame,null);
布尔值isFrameFound=false;
试一试{
//检查桌面是否包含内部框架
//如果是,则将其置于前面并设置焦点
对于(int i=0;i
我认为dispose
并不是在做你想让它做的事情dispose
清除框架中的操作系统“peer”。但如果你打算再次展示这个框架,那么你不应该丢掉它的基础
我会在JIF上使用
setVisible(false)
来隐藏它。然后,您可以使用setVisible(true)
重新激活它。您正在比较for循环中输入参数的类和桌面内部帧。这将始终是真的,因为您的参数是JInternalFrame的实例,并且getAllFrames方法返回JInternalFrames数组。为什么不定期进行比较呢
ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i] == internalFrame
我建议在帧上使用HIDE\u ON\u CLOSE
,在关键侦听器中使用setVisible(false)
而不是dispose()
。当框架被释放时,它们将被关闭,您不应该在框架关闭后尝试重用框架。如果只是隐藏框架,它仍然是桌面窗格的子级,因此当在setInternalFrame
方法中找到框架时,应该添加对setVisible(true)
的调用
听起来你的行为不一致(你说两到三次处置后就失败了)。这向我表明您有一个事件线程问题。是否在事件线程上调用setInternalFrame?您是否熟悉并正确使用了