Выход из конфликтов в Java GUI - PullRequest
1 голос
/ 29 февраля 2012

Я столкнулся с еще одной проблемой исправления двух графических интерфейсов в моей программе Java.Скажем, у нас есть новый JFrame:

public class guiOne {

public static void main (String [] agrs) {
    JFrame f = new JFrame();
    JButton b = new JButton();
    JPanel p = new JPanel();

    b.setSize(100,100);
    f.setTitle("New JFrame");
    f.setVisible(true);
    f.setSize(300,300);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    p.add(b);
    f.add(b);
}

Когда я нажимаю новую кнопку, появляется новый JFrame.Проблема, которую я получаю, когда я добавляю этот код:

System.exit(guiOne);

Все выходы.Я только хочу, чтобы guiOne выходил, как только я запускаю новый JFrame.Почему все закрывается?

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

f.setVisible(true); должна быть последней строкой кода в конструкторе для контейнера

1) никогда не создавать новый JFrame в качестве другого контейнера верхнего уровня, используйте JDialog сродительский элемент JFrame и / или, если требуется, setModal()/ ModalityTypes

2) не создавайте новый Top-Level Container, создайте этот контейнер один раз и повторно используйте его с getComtentPane.removeAll()

3) вы посмотрите на CardLayout для простых и простых реализаций, более понятных как игра с другим JFrame/JDialog на экране

4) JTabbedPane - другой способкак это сделать

2 голосов
/ 29 февраля 2012

В этом случае вы должны использовать f.dispose().System.exit останавливает весь JVM.Обратите внимание, что вы можете использовать setDefaultCloseOperation на фрейме, чтобы закрыть его с помощью хуков оконных менеджеров (например, Alt-F4 и т. Д.).


Пример:

public static void main(String[] args) {

    final JFrame frame = new JFrame("Test");
    frame.add(new JButton(new AbstractAction("Open new frame") {
        @Override
        public void actionPerformed(ActionEvent e) {

            // create new frame
            JFrame newFrame = new JFrame("New Frame");
            newFrame.add(new JLabel("new frame..."));
            newFrame.pack();
            newFrame.setVisible(true);
            newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // dispose the old frame
            frame.dispose();
        }
    }));
    frame.pack();
    frame.setVisible(true);
}
1 голос
/ 29 февраля 2012

Это действительно зависит от того, что вы хотите случиться, когда окна закрываются.EXIT_ON_CLOSE означает, что JVM закроется, когда окно закроется, и это обычно не то, чего вы хотите.DISPOSE_ON_CLOSE высвободит ресурсы, удерживаемые JFrame, и это то, что вы используете для окна, которое часто не открывается.HIDE_ON_CLOSE - это когда вы просто хотите, чтобы окно стало невидимым, но при этом сохраняете ресурсы.Ускоряет открытие окна и используется, когда вы будете использовать окно снова и снова.

Я предлагаю вам сделать следующее:

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
...