私はEclipse RCPアプリケーションに取り組んでいます。私ScalableLayeredPane
は約800体のフィギュアを持っています。
setScale()
メソッドを使用してズーム値を変更する必要があります。
また、ジョブを使用してズームの進行状況を表示したいと考えています。
メソッドを使用して関数asyncexec
を呼び出していsetScale()
ます。ただし、GUI が不足しており、キャンセル ボタンもクリックできません。
これに関するヘルプをいただければ幸いです。
これが私がやっていることです。
Job job = new Job("Some job") {
@Override
protected IStatus run(IProgressMonitor monitor) {
// Decide scaling amount
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
scalableLayeredPaneObj.setScale(scale); }
});
// Check if cancel is pressed and return status accordingly
if(monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
};
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
if(event.getResult().isOK()) {
System.out.println("Job done!");
// Do something
} else {
System.out.println("Job cancelled!");
// Do something else
}
}
});
job.setUser(true);
job.schedule();
ただし、この特定のコードを実行すると、GUI が応答しなくなり、キャンセル ボタンを押すことができなくなります。いつも"Job done!"
メッセージをいただいています。
PlatformUI#getWorkbench()#getDisplay()#syncExec
また、UI スレッドを実行するメソッドを使用してみました。それはうまくいきませんでした。
私の分析が示唆しているのは、setScale
操作自体に時間がかかり、GUI が応答しなくなることです。スレッドがハングアップしないsetScale
ように、(可能であれば) 別のスレッドから呼び出す必要があります。Main