-1

私は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

4

1 に答える 1

0

問題はsetScale()メソッドのみに関連しています。キャンバスのサイズが大きいためsetScale()、UI スレッドで時間がかかっています。

基本的Jobに、バックエンドで非 UI アクティビティを実行するために使用されます。UI アクティビティにbusy indicator適しています。ただし、スケーリングタスクをキャンセルしたいので、ユーザー Job を使用していました。代わりにビジー インジケーターを使用して問題を解決できるため、キャンセル アクションを提供できませんでした。

于 2014-01-01T08:04:13.010 に答える