2016-12-06 11 views
0

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

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: "); 
      } 
     }); 
    } 
}) 

enter image description here

код класса 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, все работает отлично.

+0

Я вижу, что вы новичок в SO Если вы чувствуете ответ решить эту проблему, пожалуйста, отметьте его как «принято», нажав зеленую галочку. Это помогает сосредоточиться на старых постах, у которых до сих пор нет ответов. –

ответ

0

реализация 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); 
     } 
     } 
    }); 
    } 
0

Ваше осуществление 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