Java 更新GUI会产生闪烁效果
我目前有一个JFrame,在它的内容窗格中,我以每秒60帧的速度从游戏循环中绘制图像。这很好,但在右侧,我现在有更多的Swing元素,在选择内容窗格的某些部分时,我想在这些元素上显示一些信息。该部分是一个静态GUI,不使用游戏循环 我正在以这种方式更新它:Java 更新GUI会产生闪烁效果,java,multithreading,swing,game-loop,Java,Multithreading,Swing,Game Loop,我目前有一个JFrame,在它的内容窗格中,我以每秒60帧的速度从游戏循环中绘制图像。这很好,但在右侧,我现在有更多的Swing元素,在选择内容窗格的某些部分时,我想在这些元素上显示一些信息。该部分是一个静态GUI,不使用游戏循环 我正在以这种方式更新它: public class InfoPanel extends JPanel implements Runnable { private String titelType = "type: "; private String t
public class InfoPanel extends JPanel implements Runnable {
private String titelType = "type: ";
private String type;
private JLabel typeLabel;
private ImageIcon icon;
public void update() {
if (this.icon != null)
this.typeLabel.setIcon(this.icon);
if(this.type != null || this.type != "")
this.typeLabel.setText(this.titelType + this.type);
else
this.typeLabel.setText("");
}
public void run() {
try {
Thread.sleep(150);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.update();
}
(此方法仅在玩家实际移动时调用,因此只调用一次,而不是每秒调用60次)
我注意到,当从游戏循环调用这个update()方法时,我得到了闪烁的效果。我认为这是因为更新UI需要一些时间,所以我决定将其放在一个新线程中。这减少了闪烁,但没有解决它
接下来,我决定给新线程低优先级,因为屏幕上每秒重画60次的部分要重要得多。这减少了闪烁再次,但它仍然发生。然后,我决定使用Thread.sleep(150)在调用update()方法之前,在新线程中使用code>,这完全解决了系统上的闪烁效应
但是,在其他系统上运行时,仍然会发生这种情况。不像以前那样频繁(可能每20秒一次),但这仍然很烦人。显然,仅仅在另一个线程中更新UI并不能解决问题
如何完全消除闪烁的想法?问题在于,您正在使用线程。sleep(int)
,它在事件期间停止并冻结GUI DispatchTread
更多信息,演示如何使用线程冻结GUI。sleep(int)
,用于可运行线程
如果您想延迟Swing中的任何操作,那么最好的方法是在SwingUtilities中调用update()
。invokeAndWait()
停止线程并更新EDT中的UI。您尝试过这样做吗:启动线程。当您需要更改GUI中的某些内容时,您可以调用SwingUtilities.invokeAndWait(您在此处可运行的代码)@Bv202请参阅我关于Runnble#Thread的回答中的链接示例,这里只是为了将invokeAndWait替换为invokeAndWait,InterruptedXXXXXX需要的添加抛出。我已经用当前代码编辑了我的问题。知道怎么了吗?谢天谢地,显然这只是一次尝试。现在测试,谢谢