JProgressBar медленно работает на Linux - PullRequest
0 голосов
/ 04 ноября 2019

Я работаю над проектом, в котором у меня есть индикаторы выполнения, указывающие состояние оси игрового контроллера (где события происходят в отдельном потоке). Обратный вызов события работает, однако, когда я пытаюсь отобразить текущее значение (из событий) с индикатором выполнения в 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.

1 Ответ

1 голос
/ 05 ноября 2019

Нашел ответ здесь

Похоже, это связано с тем, что opengl по умолчанию отключен в Linux. Можно исправить, добавив следующую строку в main.

System.setProperty("sun.java2d.opengl", "true");
...