Приложение Java Swing не выйдет - PullRequest
2 голосов
/ 17 мая 2011

У меня есть приложение Java, которое открывает JFrame и рисует в нем.Проблема в том, что когда я пытаюсь выйти из приложения, закрыв окно JFrame (на моем Mac или ПК) или выбрав «Выход» в строке меню (на моем Mac), приложение просто зависает.Что интересно, такое поведение появилось только после того, как я добавил JButton в свое приложение.Вот мой код:

public class MyApplicationFrame extends JFrame {

public MyApplicationFrame(MyApplicationLogic l) {
    super();
    this.appLogic = l;
    try {
        SwingUtilities.invokeAndWait(new Runnable() {
            @Override public void run() {
                createAndShowGUI();
            }
        });
    }
    catch(InterruptedException e) { }
    catch(InvocationTargetException e) { }

    g = getGraphics();
}

public void paint() { ... }

private void createAndShowGUI() {
    final Container c = getContentPane();
    c.setLayout(new java.awt.FlowLayout());

    final JButton startButton = new JButton("Start");
            // if I comment out these lines with the startButton, everything works
    startButton.addActionListener(new ActionListener() {
        @Override public void actionPerformed(ActionEvent event) {
            appLogic.run();
            c.remove(startButton);
        }
    });
    c.add(startButton);

    setSize(FRAME_SIZE, FRAME_SIZE);
    setVisible(true);
    }
}

В моей логике приложения у меня есть следующий метод:

public void run() {
    appFrame.paint();
    getNextState();

    // then I added the following code to try and help solve this problem
    System.err.println(java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().peekEvent());        
}

Вывод в потоке System.err выглядит следующим образом:

null
null
null
null
null
// here's where I typed command-Q
java.awt.event.MouseEvent[MOUSE_CLICKED,(210,45),absolute(210,67),button=1,modifiers=Button1,clickCount=1] on frame0
java.awt.event.MouseEvent[MOUSE_CLICKED,(210,45),absolute(210,67),button=1,modifiers=Button1,clickCount=1] on frame0
java.awt.event.MouseEvent[MOUSE_CLICKED,(210,45),absolute(210,67),button=1,modifiers=Button1,clickCount=1] on frame0

У меня нет никаких слушателей мыши в приложении (хотя я предполагаю, что объект JButton имеет его), и я не зарегистрировал никаких слушателей, кроме ActionListener в JButton.И я не трогал мышь.Но я предполагаю, что все эти MouseEvents не дают приложению завершиться.Кто-нибудь знает, что я могу с этим сделать?Благодаря.

Ответы [ 4 ]

5 голосов
/ 17 мая 2011

добавить

 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

в вашем createAndShowGUI() методе.

3 голосов
/ 17 мая 2011

Скажите JFrame выйти из JVM в закрытом состоянии.

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

По умолчанию JFrame ничего не делает в закрытом состоянии. Даже не выйти из JVM.

0 голосов
/ 10 июля 2014

Добавьте следующий код в конструктор для MyApplicationFrame:

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
0 голосов
/ 19 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...