Я работаю над проектом, в котором у меня есть индикаторы выполнения, указывающие состояние оси игрового контроллера (где события происходят в отдельном потоке). Обратный вызов события работает, однако, когда я пытаюсь отобразить текущее значение (из событий) с индикатором выполнения в Linux, это не работает хорошо. В Windows движение плавное, но в Linux оно, похоже, заикается при изменении значения индикатора выполнения. Я собрал минимальный пример, показывающий это (без необходимости в собственной библиотеке для работы с геймпадами).
import java.awt.BorderLayout;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class Test extends JFrame {
JProgressBar bar;
public Test() {
bar = new JProgressBar(0, 100);
setLayout(new BorderLayout());
add(bar, BorderLayout.NORTH);
setSize(500, 300);
setLocationRelativeTo(null);
EventSimulateThread t = new EventSimulateThread();
t.start();
}
public void updateProgress(int value) {
bar.setValue(value);
}
public static void main(String args[]) {
Test t = new Test();
t.setVisible(true);
}
class EventSimulateThread extends Thread {
Random rand = new Random();
@Override
public void run() {
while(true) {
for (int i = 0; i <= 100; i++) {
final int v = i;
SwingUtilities.invokeLater(() -> {
updateProgress(v);
});
try {Thread.sleep(10);}catch(Exception e) {}
}
for (int i = 100; i >= 0; i--) {
final int v = i;
SwingUtilities.invokeLater(() -> {
updateProgress(v);
});
try {Thread.sleep(10);}catch(Exception e) {}
}
}
}
}
}
При запуске в Windows индикатор выполнения плавно проходит через все значения. На Linux это прыгает вокруг. Любые идеи, что может вызвать это?
Редактировать: я проверял это на Ubuntu 18.04 с использованием рабочего стола Gnome3. Во всех тестах (Windows и Linux) я использовал Java 11.