Java 更新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

我目前有一个JFrame,在它的内容窗格中,我以每秒60帧的速度从游戏循环中绘制图像。这很好,但在右侧,我现在有更多的Swing元素,在选择内容窗格的某些部分时,我想在这些元素上显示一些信息。该部分是一个静态GUI,不使用游戏循环

我正在以这种方式更新它:

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),这完全解决了系统上的闪烁效应

但是,在其他系统上运行时,仍然会发生这种情况。不像以前那样频繁(可能每20秒一次),但这仍然很烦人。显然,仅仅在另一个线程中更新UI并不能解决问题


如何完全消除闪烁的想法?

问题在于,您正在使用
线程。sleep(int)
,它在
事件期间停止并冻结GUI DispatchTread
更多信息,演示如何使用
线程冻结GUI。sleep(int)
,用于可运行线程


如果您想延迟Swing中的任何操作,那么最好的方法是在
SwingUtilities中调用
update()
。invokeAndWait()
停止线程并更新EDT中的UI。

您尝试过这样做吗:启动线程。当您需要更改GUI中的某些内容时,您可以调用SwingUtilities.invokeAndWait(您在此处可运行的代码)@Bv202请参阅我关于Runnble#Thread的回答中的链接示例,这里只是为了将invokeAndWait替换为invokeAndWait,InterruptedXXXXXX需要的添加抛出。我已经用当前代码编辑了我的问题。知道怎么了吗?谢天谢地,显然这只是一次尝试。现在测试,谢谢