سؤال

الآن بعد ذلك أنا قادر على تعيين محتوى صفحة المعالج الثاني اعتمادا في اختيار الصفحة الأولى، أبحث عن طريقة لإعطاء التركيز على محتوى صفحتي الثانية عندما ينقر المستخدم على الزر التالي في الصفحة الأولى.

افتراضيا، عند النقر فوق المستخدم النقر فوق الزر "التالي"، يتم توفير التركيز على الزر المركب (التالي أو التالي أو "إنهاء" اعتمادا على تكوين المعالج)

الطريقة الوحيدة التي وجدتها لإعطاء التركيز على محتوى صفحتي هي الوحدة التالية:

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());
   }
}

تحتوي طريقة postsetfocusondialogfieldogfield:

/**
 * 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 مع الإسناد
لا تنتمي إلى StackOverflow
scroll top