维护JInternalFrame的单个实例?

时间:2009-11-15 06:39:54

标签: java swing jinternalframe

我有一个打开多个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);
    }
}

2 个答案:

答案 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并且正确使用它吗?