SwingWorker に問題があるようです。基本的に、JFrame の propertyChange() メソッドから UI を更新する Java サンプル コードを実装しました。
doInBackground の 1 秒部分までのスリープもコピーしました。これにより、Worker 内の setProgress の更新率が良好になります。
ただし、propertyChange イベントは約 10 秒ごとに 1 回だけ発生します。すべての setProgress がイベントを発生させるわけではないことを API から知っていますが、それで問題ありませんが、これは少し遅く、失われるイベントが多すぎるようです。
デバッガーでステップスルーすると、setProgress の 3 回の呼び出しごとに 1 回の割合でより良いレートが得られます
なぜそれがとても遅いのですか?
私のコードの一部は次のとおりです。
public Void doInBackground() {
Random random = new Random();
setProgress(0);
float getSize=0,gotSize=0;
while (Sync.syncing) {
//Sleep for up to one second.
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException ignore) {
ignore.printStackTrace();
}
try{
getSize=Main.getSyncGet();
gotSize=Main.getSyncGot();
System.out.println("setProgress: "+(gotSize/getSize));
setProgress((int)((gotSize/(getSize))*100));
}catch(Exception e){
Main.LOGGER.log(Level.WARNING,"Error setting progress",e);
}
}
return null;
}
public void propertyChange(PropertyChangeEvent evt) {
if ("progress" == evt.getPropertyName()) {
jpb.setValue((Integer) evt.getNewValue());
}
}
敬具
イェンス