我有一个打开多个JIF的应用程序,但我只想创建一个JIF实例,所以我使用这些函数来检查它,并在按下一个键后使用dispose来关闭JIF(JDesktopPane。 getSelectedFrame()。Dispose()方法)。但是,经过2-3次连续处理后,它不会创建新的JIF?我在这做错了吗?
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);
}
}
答案 0 :(得分:1)
我认为dispose
没有按照你的意思去做。 dispose
摆脱了框架的操作系统“peer”。但是如果你打算再次显示那个框架,那么你就不应该抛弃它的基础!
我会在JIF上使用setVisible(false)
来隐藏它。然后,您可以使用setVisible(true)
重新激活它。
答案 1 :(得分:1)
您正在比较for循环中输入参数的类和桌面内部框架。这将始终为true,因为您的参数是JInternalFrame的实例,而getAllFrames方法返回JInternalFrames的数组。为什么不进行定期比较? :
ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i] == internalFrame
我建议您在框架上使用HIDE_ON_CLOSE
作为default close operation,并在关键监听器中使用setVisible(false)
而不是dispose()
。当框架被丢弃时,它们被关闭,你不应该在关闭框架后重复使用框架。如果您只是隐藏框架,它仍然是桌面窗格的子项,那么当您在setVisible(true)
方法中找到框架时,您应该向setInternalFrame
添加一个电话。
听起来你的行为不一致(你说它在两三次处理后失败了)。这告诉我你有一个事件线程问题。你的setInternalFrame是在事件线程上调用的吗?您熟悉Event Dispatch Thread并且正确使用它吗?