Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 维护JInternalFrame的单个实例?_Java_Swing_Jinternalframe - Fatal编程技术网

Java 维护JInternalFrame的单个实例?

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

我有一个打开多个JIF的应用程序,但我只想创建一个JIF实例,所以我使用这些函数来检查,并在按下一个键(JDesktopPane.getSelectedFrame().dispose())后使用dispose关闭JIF。然而,在连续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);
    }
}
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?您是否熟悉并正确使用了