2011-11-22 82 views
2

我目前有一个JFrame,它在内容窗格上以60帧/秒的速度从游戏循环中绘制图像。这工作正常,但在右侧,我现在有更多的Swing元素,我想在选择内容窗格的某些部分时显示一些信息。这部分是一个静态GUI,并没有使用游戏循环。更新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次的屏幕部分更为重要。这再次减少了闪烁,但仍然发生。然后,我决定在调用update()方法之前在新线程中使用Thread.sleep(150);,这个方法完全解决了我系统上的闪烁效应。

但是,在其他系统上运行时,它仍然会发生。不像以前那样频繁(可能每20秒一次),但仍然非常烦人。可以看出,只是在另一个线程中更新UI并不能解决问题。

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

+0

你有没有试过看这个:http://stackoverflow.com/q/669979/401667 – Molske

回答

4

调用update()SwingUtilities.invokeAndWait()它停止线程并更新EDT中的UI。

+0

那么这是如何工作的?我真的不知道如何使用它... – Bv202

+0

您开始线程。当您需要在GUI中更改某些内容时,您可以调用SwingUtilities.invokeAndWait(您的代码位于Runnable这里) – StanislavL

+0

是的,但不可能从那里调用该方法... – Bv202