Java JProgressBar在Linux上运行缓慢

Java JProgressBar在Linux上运行缓慢,java,linux,swing,gtk,jprogressbar,Java,Linux,Swing,Gtk,Jprogressbar,我正在从事一个项目,其中我有进度条来指示游戏控制器轴的状态(事件发生在单独的线程上)。事件回调可以工作,但是当我尝试在Linux上用进度条显示当前值(来自事件)时,它不能正常工作。在windows上,运动是平滑的,但在linux上,随着进度条值的变化,运动似乎会结巴。我放了一个简单的例子来说明这一点(无需使用本机库来处理Gamepad) 导入java.awt.BorderLayout; 导入java.util.Random; 导入javax.swing.JFrame; 导入javax.swing

我正在从事一个项目,其中我有进度条来指示游戏控制器轴的状态(事件发生在单独的线程上)。事件回调可以工作,但是当我尝试在Linux上用进度条显示当前值(来自事件)时,它不能正常工作。在windows上,运动是平滑的,但在linux上,随着进度条值的变化,运动似乎会结巴。我放了一个简单的例子来说明这一点(无需使用本机库来处理Gamepad)

导入java.awt.BorderLayout;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JProgressBar;
导入javax.swing.SwingUtilities;
公共类测试扩展了JFrame{
JProgressBar;
公开考试(){
bar=新的JProgressBar(0,100);
setLayout(新的BorderLayout());
添加(条形图,边界布局。北);
设置大小(500300);
setLocationRelativeTo(空);
EventSimulateThread t=新的EventSimulateThread();
t、 start();
}
public void updateProgress(int值){
bar.setValue(值);
}
公共静态void main(字符串参数[]){
测试t=新测试();
t、 setVisible(真);
}
类EventSimulateThread扩展线程{
Random rand=新的Random();
@凌驾
公开募捐{
while(true){
对于(int i=0;i{
更新进度(v);
});
试试{Thread.sleep(10);}catch(异常e){}
}
对于(int i=100;i>=0;i--){
最终int v=i;
SwingUtilities.invokeLater(()->{
更新进度(v);
});
试试{Thread.sleep(10);}catch(异常e){}
}
}
}
}
}
在windows上运行时,进度条将平滑地遍历所有值。在linux上,它会跳转。你知道这是什么原因吗

编辑:我使用Gnome3桌面在Ubuntu18.04上测试了这个。在所有测试(Windows和Linux)中,我都使用Java 11。

找到了答案

看起来这是由于Linux上默认禁用了opengl。可以通过将以下行添加到main来修复

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