4

最初のページの選択に応じて 2 番目のウィザードのページのコンテンツを設定できるようになったので、ユーザーが最初のページの次のボタンをクリックしたときに、2 番目のページのコンテンツにフォーカスを与える方法を探しています。

デフォルトでは、ユーザーが [次へ] ボタンをクリックすると、ボタン コンポジット (ウィザードの構成に応じて [次へ]、[戻る]、または [終了] ボタン) にフォーカスが移ります。

ページのコンテンツにフォーカスを当てる唯一の方法は次のとおりです。

public class FilterWizardDialog extends WizardDialog {

    public FilterWizardDialog(Shell parentShell, IWizard newWizard) {
        super(parentShell, newWizard);
    }

    @Override
    protected void nextPressed() {
        super.nextPressed();
        getContents().setFocus();
    }
}

私にとって、この動作を実装するために WizardDialog クラスをオーバーライドする必要があるのは、少し「退屈で重い」ことです。さらに、WizardDialog javadoc は次のように述べています。

クライアントは をサブクラスWizardDialog化できますが、これが必要になることはめったにありません。

このソリューションについてどう思いますか? その仕事をするためのより簡単でクリーンなソリューションはありますか?

4

2 に答える 2

7

このスレッドは次のことを示唆しています。

setVisible()ウィザード ページで、ページが表示される前に自動的に呼び出される継承されたメソッドを使用します。

public void setVisible(boolean visible) {
   super.setVisible(visible);
   // Set the initial field focus
   if (visible) {
      field.postSetFocusOnDialogField(getShell().getDisplay());
   }
}

postSetFocusOnDialogField メソッドには以下が含まれます。

/**
 * Posts <code>setFocus</code> to the display event queue.
 */
public void postSetFocusOnDialogField(Display display) {
    if (display != null) {
        display.asyncExec(
            new Runnable() {
                public void run() {
                    setFocus();
                }
            }
        );
    }
}
于 2009-06-09T07:30:22.343 に答える
0

VonCの答えはうまく機能しますが、個人的には、次のように作業する方が少し簡単であることがわかりました:

@Override
public void setVisible(boolean visible) {
    super.setVisible(visible);
    if (visible) {
        Control control = getControl();
        if (!control.setFocus()) {
            postSetFocus(control);
        }
    }
}

private void postSetFocus(final Control control) {
    Display display = control.getDisplay();
    if (display != null) {
        display.asyncExec(new Runnable() {
            @Override
            public void run() {
                control.setFocus();
            }
        });
    }
}
于 2011-03-03T16:36:22.413 に答える