Java 保持TrayDialog打开并提交数据

Java 保持TrayDialog打开并提交数据,java,eclipse-rcp,Java,Eclipse Rcp,我有一个对话框,它扩展了TrayDialog,从用户那里收集一些数据。我想在不关闭对话框的情况下将收集到的值传递给另一个类。如果我重写okPressed()方法,数据将传回,但窗口将关闭 public class MyDialog extends TrayDialog { public MyDialog(final Shell shell, final MyData mydata) { super(shell); this.shell = shell;

我有一个对话框,它扩展了
TrayDialog
,从用户那里收集一些数据。我想在不关闭对话框的情况下将收集到的值传递给另一个类。如果我重写
okPressed()
方法,数据将传回,但窗口将关闭

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

如果不调用
super.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;
    }
在这种情况下,您需要在某个时候手动关闭对话框。此外,如果使用,对话框将不会阻止执行线程

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