Вызов метода из JButton - замораживание JFrame?

94
12

Я занимаюсь основной игрой в понг для класса. У меня работает Pong, и у меня есть GUI-дисплей при запуске, к сожалению, я не могу начать игру с самого начала JButton. Я прокомментировал, где проблема в коде, и удалил ненужный код.

 frame.add(GUIPanel);
JButton startButton = new JButton("Start!");
GUIPanel.add(startButton, BorderLayout.CENTER);
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
frame.getContentPane().remove(GUIPanel);
frame.validate();
frame.repaint();

drawPanel = new DrawPanel();
drawPanel.requestFocus();
frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
//This is the part that freezes it, everything else works fine
//except that the playGame method isn't called. If I remove the whole
//startButton and whatnot I can call playGame and it works perfectly.
playGame();
}
});
}

есть идеи?

спросил(а) 2014-05-07T06:46:00+04:00 5 лет, 9 месяцев назад
1
Решение
81

Swing - это однопроволочная конструкция.

То есть, все взаимодействия и модификации пользовательского интерфейса должны быть сделаны из контекста потока Dispatching Event. Все, что блокирует этот поток, не позволит ему обрабатывать, среди прочего, перерисовку запросов и пользовательских ввода/взаимодействия.

Я предполагаю, что playGame использует что-то вроде Thread.sleep или какое-то while(true) и блокирует EDT, заставляя вашу программу выглядеть так, как будто она заморожена

Прочитайте параллелизм в Swing для получения более подробной информации.

Простым решением было бы использовать Timer Swing, чтобы действовать как игровой цикл. Каждый раз, когда он тикает, вы обновляете состояние своей игры и вызываете (что-то вроде) repaint на игровой компонент

ответил(а) 2014-05-07T06:48:00+04:00 5 лет, 9 месяцев назад
35

Похоже, у вас есть скобка, которая не относится к вашей секунде с последней точкой с запятой. Попробуйте удалить его.

ответил(а) 2014-05-07T06:49:00+04:00 5 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема