В настоящее время у меня есть JFrame, где на панели содержимого я рисую изображения из игрового цикла со скоростью 60 кадров в секунду. Это отлично работает, но с правой стороны у меня теперь есть больше элементов Swing, для которых я хочу отображать некоторую информацию при выборе определенных частей панели содержимого. Эта часть представляет собой статический графический интерфейс и не использует игровой цикл.
Я обновляю это так:
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() из игрового цикла я получаю эффекты мерцания. Я предполагаю, что это связано с тем, что обновление пользовательского интерфейса занимает некоторое время, поэтому я решил поместить его в новую ветку. Это уменьшило мерцание, но не решило его.
Затем я решил дать новому потоку низкий приоритет, так как часть экрана, которая перерисовывается 60 раз в секунду, гораздо важнее. Это снова уменьшило мерцание, но оно все равно произошло. Затем я решил использовать Thread.sleep(150);
в новом потоке перед вызовом метода update(), что полностью устранило эффект мерцания в моей системе.
Однако при запуске на других системах это все равно происходит. Не так часто, как раньше (может быть, раз в 20 секунд), но все равно довольно раздражает. По-видимому, простое обновление пользовательского интерфейса в другом потоке не решает проблему.
Любые идеи, как полностью устранить мерцание?