Java Swing Switch между JInternalFrame и JFrame расширяет

Я создаю приложение, которое использует JDesktopPane и JInternalFrames, которые на данный момент работают так:

рабочий столPane.java

// this program handles the main desktop pane

public class desktopPane extends JFrame {

    static JDesktopPane mainDesktopPane;
    static JMenuItem itemChildProgram;

    public desktopPane() {
        mainSetup();
        mainBuild();
        mainActions();
    }

    public static void main(String[] args) {
        desktopPane mainFrame = new desktopPane();
        mainFrame.setVisible(true);
    }

    public void mainSetup() {
        // set title and size and close operation etc.
    }

    public void mainBuild() {
        mainDesktopPane      = new JDesktopPane();

        JMenuBar mainMenuBar = new JMenuBar();
        JMenu menuRun        = new JMenu("Run");
        itemChildProgram     = new JMenuItem("Child Program");

        add(mainDesktopPane);

        setJMenuBar(mainMenuBar);
        mainMenuBar.add(menuRun);
        menuRun.add(itemChildProgram);
    }

    public void mainActions() {
        actionChildProgram execChildProgram = new actionChildProgram();
        itemChildProgram.addActionListener(execChildProgram);
    }

    public class actionChildProgram implements ActionListener {
        public void actionPerformed(ActionEvent execChildProgram) {
            childProgram classChildProgram = new childProgram(mainDesktopPane);
        }
    }

}

Итак, эта программа просто создает мой главный экран и имеет кнопку, которая вызывает другую мою программу.

дочерняя программа.java

public class childProgram {

    public childProgram(JDesktopPane mainDesktopPane) {
        // database connection and data retrieval goes here

        childProgramGUI child = new childProgramGUI();
        child.setVisible(true);
        mainDesktopPane.add(child);
    }

}

Итак, эта программа просто подготавливает некоторые данные и кучу других вещей, а затем вызывает графический интерфейс, в котором данные видны. Файл gui на данный момент ужасно прост

дочерняя программаGUI.java

public class childProgramGUI extends JInternalFrame {
    // some gui design goes here
}

Это отлично работает при вызове childProgram.java из JDesktopPane в desktopPane.java, но как я могу вызвать childProgram.java как отдельную программу, не добавляя ее в mainDesktopPane как дочернюю.

Мне нужно, чтобы дочерняя программа запускалась за пределами панели рабочего стола только при выполнении условия.

Если я внесу следующие изменения в код

  • измените childProgramGUI.java на JFrame вместо JInternalFrame
  • удалите строку в childProgram.java: mainDesktopPane.add(child);

Затем он работает так, как я намеревался, но я не могу изменить расширение childProgramGUI.java на JFrame только с кодом (о котором я знаю)

ОБНОВИТЬ

Пока что единственное решение, которое у меня есть для этого, - это просто дублировать мои программы с графическим интерфейсом, поэтому теперь у меня есть

дочерняя программаGUI.java

public class childProgramGUI extends JInternalFrame {
    // some gui design goes here
}

А также автономный с точно таким же кодом, за исключением того, что это JFrame.

дочерняя программаGUI_Standalone.java

public class childProgramGUI_Standalone extends JFrame {
    // the exact same gui design goes here
}

А затем поставьте условие на мой mainDesktopPane.add(child). Я не доволен этим, но он работает для запуска программы в JDesktopPane и из нее.


person TheLovelySausage    schedule 12.02.2016    source источник
comment
Возможный дубликат Просмотр JInternalFrames без JDesktopPanes   -  person Arnaud    schedule 12.02.2016
comment
Связанный пример рассматривается здесь.   -  person trashgod    schedule 12.02.2016
comment
Возможный извлеченный урок: создавайте свой графический интерфейс с помощью JPanels и не используйте extends JFrame или extends JInternalFrame (если для этого нет действительно веской причины, но ее почти никогда не бывает...)   -  person Marco13    schedule 12.02.2016
comment
@ Marco13 Marco13, как бы вы создали графический интерфейс только с jpanels? Разве их не нужно добавлять в jframe?   -  person TheLovelySausage    schedule 13.02.2016
comment
Ключевым моментом является то, что ваши основные компоненты графического интерфейса обычно должны быть панелями. Затем их можно легко добавить либо на панель содержимого JFrame, либо на JInternalFrame. (Как следует из названия: это всего лишь фреймы (!) вокруг фактического содержимого). Обычно нет причин продлевать ни один из них. Обычно вы не переопределяете методы этих классов. Расширение их в основном выполняется в (сомнительных) вводных руководствах или, реже, в небольших примерах. Также см. stackoverflow. com/questions/1143923/ ....   -  person Marco13    schedule 13.02.2016