簡體   English   中英

Eclipse JFace的向導(再次......)

[英]Eclipse JFace's Wizards (Again …)

現在,我可以根據第一頁選擇設置第二個向導頁面的內容 ,我正在尋找一種方法,當用戶單擊第一頁上的下一個按鈕時,將焦點放在第二頁的內容上。

默認情況下,當用戶單擊下一個按鈕時,焦點將放在按鈕組合上(下一個,后退或完成按鈕,具體取決於向導配置)

我發現將焦點放在頁面內容上的唯一方法是:

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子類,盡管這很少需要。

您對此解決方案有何看法? 有沒有更簡單,更清潔的解決方案來完成這項工作?

這個帖子建議:

在向導頁面中,使用在頁面顯示之前自動調用的繼承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();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM