Поддерживать один экземпляр JInternalFrame? - PullRequest
0 голосов
/ 15 ноября 2009

У меня есть приложение, которое открывает несколько файлов 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 ]

1 голос
/ 18 ноября 2009

Вы сравниваете классы вашего входного параметра и внутренних кадров ваших рабочих столов в цикле for. Это всегда будет верно, поскольку ваш параметр является экземпляром JInternalFrame, а метод getAllFrames возвращает массив JInternalFrames. Почему бы просто не сделать регулярное сравнение? :

ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i] == internalFrame

Я бы рекомендовал использовать HIDE_ON_CLOSE в качестве операции закрытия по умолчанию на кадрах и использовать setVisible(false) в качестве ключевого слушателя вместо dispose(). Когда кадры расположены, они закрыты, и вы не должны пытаться повторно использовать кадр после его закрытия. Если вы просто скроете рамку, она все равно будет дочерней по отношению к панели рабочего стола, поэтому вы должны добавить вызов к setVisible(true), когда найдете рамку в вашем методе setInternalFrame.

Звучит так, как будто вы получаете непоследовательное поведение (вы говорите, что оно терпит неудачу после двух или трех утилизации). Это говорит о том, что у вас есть проблема с потоком событий. Ваш setInternalFrame вызывается в потоке событий? Вы знакомы с Thread Dispatch Thread и используете ли вы его правильно?

1 голос
/ 15 ноября 2009

Я не думаю, что dispose делает то, что вы хотите для него сделать. dispose избавляет операционную систему от "пира" вашего фрейма. Но если вы намерены снова показать этот кадр, то не стоит выбрасывать его основы!

Я бы пошел с setVisible(false) на JIF, чтобы скрыть это. Затем вы можете повторно активировать его с помощью setVisible(true).

...