3

なぜ次のコード(そのクラスの一部extends TitleAreaDialog)で:

@Override  
protected void createButtonsForButtonBar(Composite parent) {          
    super.createButtonsForButtonBar(parent);  
    this.getButton(IDialogConstants.OK_ID).addSelectionListener(new SelectionAdapter() {  
        @Override  
        public void widgetSelected(SelectionEvent e) {  
            okPressed();  
        }  
    });  
}  

@Override  
protected void okPressed() {  
    saveInput();  
    super.okPressed();  
}

private void saveInput(){  
    firstNameSelected = firstNameCombo.getText();  
    lastNameSelected = lastNameCombo.getText();      
}    

OKボタン を押すと、次の例外が発生します。

org.eclipse.swt.SWTException:ウィジェットはorg.eclipse.swt.SWT.error(SWT.java:4361)のorg.eclipse.swt.SWT.error(SWT.java:4276)のorg.eclipseに配置されます。 swt.SWT.error(SWT.java:4247)at org.eclipse.swt.widgets.Widget.error(Widget.java:468)at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:340) org.eclipse.swt.widgets.Combo.getText(Combo.java:1006)で

インライン:firstNameSelected = firstNameCombo.getText();saveInput
ウィジェットが選択時に破棄されるのはなぜですか?

4

2 に答える 2

2

createButtonsForButtonBar(Composite parent)メソッドを完全に削除してみてください。ダイアログはokPressedそれ自体で呼び出す必要があります。

また、電話は必要ないと思いますsuper.okPressed()。少なくとも私はそれを使用しません。this.close()代わりに電話してください。

これが私が使用する簡単なテンプレートです:

public class OptionsDialog extends Dialog {

    public OptionsDialog(Shell parentShell)
    {
        super(parentShell);
        setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL);
        setBlockOnOpen(true);
    }

    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);

        GridLayout layout = new GridLayout(1, false);
        layout.marginHeight = 5;
        layout.marginWidth = 10;

        composite.setLayout(layout);

        GridData gridData = new GridData();
        gridData.widthHint = 500;

        composite.setLayoutData(gridData);

        createContent();

        return composite;
    }

    private void createContent()
    {
        /* ADD WIDGETS */
    }

    protected void configureShell(Shell newShell)
    {
        super.configureShell(newShell);
        newShell.setText("Options");
    }

    public void okPressed()
    {
        /* SAVE VALUES */
        this.close();
    }

    /* GETTERS AND SETTERS/ */

}
于 2012-10-04T16:23:30.883 に答える
1

okPressed()内でメソッドを呼び出す必要はありませんwidgetSelected()widgetSelected()メソッドを呼び出す必要はまったくないと思います。はokPressed()ダイアログ自体によって呼び出されます。

次のコードを試してみてください。

public ClassNameWhichExtendsTitleAreDialog(Shell parentShell) {
    super(parentShell);
}

@Override
protected void createButtonsForButtonBar(Composite parent) {
    createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
    createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}

@Override
protected void okPressed() {
    firstNameSelected = firstNameCombo.getText();
    lastNameSelected = lastNameCombo.getText();
    super.okPressed();
}

// A function to return the name values obtained
于 2012-10-05T06:16:17.970 に答える