Вызов метода из JButton - замораживание JFrame?
Я занимаюсь основной игрой в понг для класса. У меня работает 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();
}
});
}
есть идеи?
Swing - это однопроволочная конструкция.
То есть, все взаимодействия и модификации пользовательского интерфейса должны быть сделаны из контекста потока Dispatching Event. Все, что блокирует этот поток, не позволит ему обрабатывать, среди прочего, перерисовку запросов и пользовательских ввода/взаимодействия.
Я предполагаю, что playGame
использует что-то вроде Thread.sleep
или какое-то while(true)
и блокирует EDT, заставляя вашу программу выглядеть так, как будто она заморожена
Прочитайте параллелизм в Swing для получения более подробной информации.
Простым решением было бы использовать Timer
Swing, чтобы действовать как игровой цикл. Каждый раз, когда он тикает, вы обновляете состояние своей игры и вызываете (что-то вроде) repaint
на игровой компонент
Похоже, у вас есть скобка, которая не относится к вашей секунде с последней точкой с запятой. Попробуйте удалить его.