Eclipse RAP Dialog::open() генерирует исключение NullPointerException

Я использую Eclipse RAP для реализации веб-приложения. Следующий код генерирует NullPointerException во время выполнения выбора listener:

Link link = new Link(composite_2, SWT.NONE);
link.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
link.setText("<a>Dokument erfassen</a>");
link.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent arg0) {

        TestDialog dia = new TestDialog(getShell(),
                    SWT.APPLICATION_MODAL);
        dia.open(new DialogCallback() {
            public void dialogClosed(int returnCode) {
                System.out.println("Stored file: ");
            }
        });
    }
})

введите здесь описание изображения

Код класса TestDialog выглядит следующим образом:

public class TestDialog extends Dialog {
    private static final long serialVersionUID = 1L;

    public TestDialog(Shell parent) {
        super(parent);
    }

    public TestDialog(Shell parent, int style) {
        super(parent,style);
    }
}

Если я использую класс MessageBox вместо класса TestDialog, все работает нормально.


person Christian Hubrich    schedule 06.12.2016    source источник
comment
Я вижу, вы новичок в SO. Если вы считаете, что ответ решил проблему, отметьте его как «принятый», щелкнув зеленую галочку. Это помогает сосредоточить внимание на старых сообщениях, на которые до сих пор нет ответов.   -  person Rüdiger Herrmann    schedule 27.12.2016


Ответы (2)


реализация RAP 3.1 для метода Dialog.open использует shell.open(), но я не могу найти, где переменная shell действительно имеет значение? Разве это не должно быть «родителем»?

 public void open( final DialogCallback dialogCallback ) {
    prepareOpen();
    returnCode = SWT.CANCEL;
    shell.open();
    shell.addShellListener( new ShellAdapter() {
      @Override
      public void shellClosed( ShellEvent event ) {
        if( dialogCallback != null ) {
          dialogCallback.dialogClosed( returnCode );
        }
      }
    } );
  }
person Brian    schedule 20.12.2016

Ваша реализация Dialog должна переопределить prepareOpen(), которая по умолчанию ничего не делает.

После возврата из prepareOpen() следует создать оболочку, представляющую диалог, и назначить ее полю shell.

Например:

shell = new Shell( parent, SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL );
shell.setText( getText() );
// create controls in shell

См. FontDialog для более полного примера: https://github.com/eclipse/rap/blob/master/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/FontDialog.java

person Rüdiger Herrmann    schedule 20.12.2016