(...アゲイン)のJFaceのウィザードのEclipse
質問
今、私がhref="https://stackoverflow.com/questions/954443/eclipse-jfaces-wizards">は、最初のページに私の2番目のウィザードのページによってはの内容を設定することができる午前
デフォルトでは、ユーザーは次のボタンをクリックすると、フォーカスは、 私は私のページのコンテンツにフォーカスを与えることが判明唯一の方法は、次のいずれかです。 私にはそれがこの動作を実装するために、WizardDialogのクラスをオーバーライドする必要が少し「退屈と重い」です。 WizardDialogのjavadocを、より細かくは述べています: クライアントは、 あなたはこのソリューションについてどう思いますか?その仕事をするための任意のより簡単かつクリーンな解決策はありますか?public class FilterWizardDialog extends WizardDialog {
public FilterWizardDialog(Shell parentShell, IWizard newWizard) {
super(parentShell, newWizard);
}
@Override
protected void nextPressed() {
super.nextPressed();
getContents().setFocus();
}
}
これはめったに必要ありませんが、
WizardDialog
をサブクラス化してます。
解決
このスレッドには提案します:
あなたのウィザードページでは、あなたのページが表示される前に自動的に呼び出され継承され
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();
}
}
);
}
}
他のヒント
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();
}
});
}
}