Заставить Java обновить графический интерфейс Java Swing - PullRequest
1 голос
/ 10 ноября 2011

Я кодировал два Компьютера, чтобы играть друг с другом в Реверси, однако, когда они играют друг с другом. Доска обновляется только после окончания игры.

По некоторым поискам я знаю, что есть что-то, что может сделать поток событий AWT, но я до сих пор не знаю, как заставить JFrame обновляться.

Моя функция работает, меняя значки, а затем вызывая revalidate и repaint. Любые указатели были бы замечательными.

Ответы [ 3 ]

6 голосов
/ 10 ноября 2011

Если вы начинаете свою игру AI с actionPerformed(), она выполняется в потоке EDT. Вы должны переместить свою логику (и ваши sleep() вне потока EDT, запустив новый Thread, чтобы позволить Swing правильно перерисовывать пользовательский интерфейс и публиковать обновления для пользовательского интерфейса следующим образом:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        myUI.update();  // repaint(), etc. according to changed states
    }
});

Также рассмотрите возможность использования javax.swing.SwingWorker, javax.swing.Timer и посмотрите на Параллельность в Swing .

0 голосов
/ 10 ноября 2011

Если вам нужно принудительно перерисовать приложение, вы должны вызвать метод repaint() для компонента, содержащего игровую доску. Это должно заставить Swing перекрасить доску.

0 голосов
/ 10 ноября 2011

Звучит как проблема с потоками - Поток событий не имеет возможности выполнить. Я бы начал с некоторых команд сна в потоках логики / действий, чтобы дать время обновлению пользовательского интерфейса.

Кроме того, вы можете создать поток «updateUI» и запустить его в invokeAndWait, чтобы заставить его обновить отображение. Назовите это после того, как каждый ход был завершен.

...