JProgressBar 在 Linux 上变慢
JProgressBar slow on Linux
我正在做一个项目,其中有进度条来指示游戏控制器轴的状态(事件发生在单独的线程上)。事件回调有效,但是当我尝试在 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 上它跳来跳去。有什么想法会导致这种情况吗?
编辑:我使用 Gnome3 桌面在 Ubuntu 18.04 上对此进行了测试。在所有测试中(Windows 和 Linux)我使用的是 Java 11.
找到答案
看起来这是因为 opengl 在 Linux 上默认被禁用。可以通过将以下行添加到 main.
来修复
System.setProperty("sun.java2d.opengl", "true");
我正在做一个项目,其中有进度条来指示游戏控制器轴的状态(事件发生在单独的线程上)。事件回调有效,但是当我尝试在 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 上它跳来跳去。有什么想法会导致这种情况吗?
编辑:我使用 Gnome3 桌面在 Ubuntu 18.04 上对此进行了测试。在所有测试中(Windows 和 Linux)我使用的是 Java 11.
找到答案
看起来这是因为 opengl 在 Linux 上默认被禁用。可以通过将以下行添加到 main.
来修复System.setProperty("sun.java2d.opengl", "true");