2014-05-17 3 views
0

사용자로부터 데이터를 수집하기 위해 TrayDialog을 확장하는 대화 상자가 있습니다. 대화 상자를 닫지 않고 다른 클래스에 수집 된 값을 전달하려고합니다. okPressed() 메서드를 재정의하면 데이터가 다시 전달되지만 창은 닫힙니다.TrayDialog를 열고 데이터를 제출하십시오.

public class MyDialog extends TrayDialog { 
    public MyDialog(final Shell shell, final MyData mydata) { 
     super(shell); 
     this.shell = shell; 
     this.mydata = mydata; 
    } 

    @Override 
    protected void okPressed() { 
     if (!validateData()) { 
      return; 
     } 
     super.okPressed(); 
    } 

    //rest of the code for text box, buttons in the dialog 
} 

final MyDialog myDialog = new MyDialog(new Shell(), this.mydata); 
if (myDialog.open() == Window.CANCEL) { 
    return null; 
} 
//here get the data that user has entered in the dialog after they press ok 

답변

2

전화하지 않는 경우 super.okPressed() 대화 상자가 닫히지 않습니다. Source :

protected void okPressed() { 
    setReturnCode(OK); 
    close(); 
} 

그리고 다시 okPressed 활동에 데이터를 전달하기 위해, 나는 MyDialog에에 콜백을 제공하기 위해 제안합니다. 다음과 같은 내용 :

public interface MyCallback { 
    void okPressed(MyData data); 
} 

public class MyDialog extends TrayDialog { 
public MyDialog(final Shell shell, final MyData mydata, MyCallback callback) { 
    super(shell); 
    this.shell = shell; 
    this.mydata = mydata; 
    this.callback = callback; 
} 

@Override 
protected void okPressed() { 
    if (!validateData()) { 
     return; 
    } else { 
     callback.onPressed(data); 
    } 
    //super.okPressed(); 
} 

MyCallback callback = new MyCallback() { 

    void okPressed(MyData data) { 
     // handle data 
    } 
} 
final MyDialog myDialog = new MyDialog(new Shell(), this.mydata, callback); 
    if (myDialog.open() == Window.CANCEL) { 
     return null; 
    } 

이 경우 대화 상자를 수동으로 닫아야합니다. 또한 사용하는 경우 Dialog는 실행 스레드를 차단하지 않습니다. setBlockOnOpen(false);

관련 문제