Forcing Java to refresh the Java Swing GUI

点点圈 提交于 2019-12-24 11:00:02

问题


Ive coded two Computers to play each other in Reversi, however when they play each other. The board only updates after the game has finished.

From some googling around I know its has something to do the AWT Event Thread, but I still have no idea how to force the JFrame to refresh.

My function works by changing the icons and then calling revalidate and repaint. Any pointers would be wonderful.


回答1:


If you start your AI game from an actionPerformed(), it is executed in EDT thread. You should move your logic (and your sleep()'s outside of EDT thread by starting a new Thread to allow Swing to repaint UI properly and post updates to UI as following:

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

Also consider use of javax.swing.SwingWorker, javax.swing.Timer and take a look at Concurrency in Swing.




回答2:


Sounds like a threading issue - Event Thread is not being given a chance to execute. I would start with some sleep commands in the logic / action threads to give time for the UI to update.

Also, you could have an "updateUI" thread and run that on an invokeAndWait to force it to update the display. Call that after each move has been completed.




回答3:


If you need to force the application to redraw, you should invoke the repaint() method on the component containing the game board. This should cause Swing to repaint the board.



来源:https://stackoverflow.com/questions/8073823/forcing-java-to-refresh-the-java-swing-gui

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!