使用JavaSwing应用程序,如何将值从对话框面板获取到主应用程序中?

使用JavaSwing应用程序,如何将值从对话框面板获取到主应用程序中?,java,swing,dialog,panel,Java,Swing,Dialog,Panel,在我的Swing应用程序中,用户可以单击一个按钮打开一个对话框面板并输入一些值,然后他们可以单击该面板上的“确定”将其关闭并返回主程序,但是我如何将他们输入的值传递到主程序而不先保存到文件中呢?您可以做以下几件事: 您可以在应用程序和对话框之间创建观察者/可观察者关系,并在对话框关闭时使用事件中的值使对话框发布事件 您可以在应用程序中维护对话框的句柄,当您在dialog上调用setVisible(false)时,您可以查询对话框中的数据 用户界面通常应在底层应用程序上分层。(依我看,用户界面本

在我的Swing应用程序中,用户可以单击一个按钮打开一个对话框面板并输入一些值,然后他们可以单击该面板上的“确定”将其关闭并返回主程序,但是我如何将他们输入的值传递到主程序而不先保存到文件中呢?

您可以做以下几件事:

  • 您可以在应用程序和对话框之间创建观察者/可观察者关系,并在对话框关闭时使用事件中的值使对话框发布事件
  • 您可以在应用程序中维护对话框的句柄,当您在dialog上调用
    setVisible(false)
    时,您可以查询对话框中的数据
用户界面通常应在底层应用程序上分层。(依我看,用户界面本身应该分为几个层,但这是另一种说法。)将应用程序的相关部分传递给用户界面的创建。当您准备好将值从UI传递到应用程序时(可以是多页对话框上的OK按钮,一直到每次击键),将数据推送到应用程序组件。

我建议使用MVC(模型视图控制器)设计。所以对话框将是您的视图,可能还有控制器。但是必须有一个域类作为您的模型。例如,如果创建该对话框是为了编辑个人数据,则可以使用名为Person的类来保存数据。对话框的设计应该使您能够设置并从中获取人员。

与其只使用糟糕的Java
Observable
/
Observator
API,不如让您看看“事件总线”,它应该特别适合您的情况

事件总线的两种实现:

  • 非常普遍的事件总线, 可以在任何情况下使用
  • 特定于Guice依赖项注入库

其中一个应该可以帮助您解决当前的问题。

可能是您想尝试以下解决方案:

类MyDialog{

private static String[] returnValues = new String[10]
private static MyDialog dialog;

private MyDialog() {
  initDialog()
}

private void closeDialog()
{
     dispose();
}

private initDialog()
{

 //....
 btnOk = new JButton("OK");
  jTextField1 = new JTextField();
  ...
  jTextField10 = new JTextField();
  ...
  ActionListener btnOK_click = new ActionListener() {

        public void actionPerformed(ActionEvent e)
        {
            returnValues[0] = jTextField1.getText();
            ...
            returnValues[9] = jTextField10.getText();
            closeDialog();  
        }
  }
  btnOk.addActionListener(btnOk_click);
}

public static String[] showMyDialog() {
    dialog = new MyDialog();
    dialog.setVisible(true);
    return returnValues;
}

}

只需在对话框类中定义一个带有单个方法的接口(如:“returnToCaller(returntype rt)”)

对话框的构造函数将此接口的一个实例作为输入,并使用它在退出/确定时返回结果

main模块(窗口或其他什么)只是实例化了对话框,因此对接口进行了无意义的使用,定义了返回方法,有点像委托(c#)

当时的呼吁是:

    MyDialog md = new MyDialog(new MyDialog.ReturnToCaller() {
        public void returnToCaller(ReturnValues rv) {
                         // Handle the values here
        }
    });
    md.setModal(true);
    md.setVisible(true);

实现对话框面板的类必须有一个到主程序的链接,并且主程序必须提供一个带有参数的方法,这些参数将是要传输的值

然后你的对话框面板类听Ok按钮,点击按钮,它检索这些值并与前面提到的方法一起使用

class Main {
    //...
    private Dialog myDialog ;

    public Main(){
        //...
        myDialog = new Dialog(this);
        //...
    }

    //...

    public void onDialogOk(String valueA, int valueB)
    {
        //...
    }
}

class Dialog implement ActionListener{
    //...
    private Main myMain ;

    public setMain(Main main){
        myMain = main;
    }

    public Dialog(Main main){
        //...
        setMain(main) ;

        //...
        JButton ok = new JButton("ok") ;
        ok.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) { 
        // retrieve form values
        String valueA = ... ;
        int valueB = Integer.parse(...);
        myMain.onDialogOK(valueA, valueB) ; //DONE
    }
}

+1@Frank:这里讨论的是一个
可观察的
委托,在扩展
JDialog
时很有用。我想到了一种方法,使用主类的静态字段来保存值,因此在对话框中设置值,当对话框关闭时,我可以在主类中访问这些字段的值。对不起。。。但这是非常错误的。如果您能够创建自定义的“MyDialog”类,为什么不在其中为您的域类创建getter和setter呢?返回字符串数组是讨厌的。我完全赞同尤格纳的评论。此外,在这里使用静态是绝对可怕的。对于这个问题,基本上有两种有效的解决方案(据我所知):MVC或事件总线。任何其他解决方案通常都是一种代码气味。