将对象从JDialog传递回根帧

时间:2013-04-06 20:48:49

标签: java swing constructor jframe jdialog

假设我们有一个JFrame frame,其中包含两个JPanel,buttonPaneldataPanel,并且在此面板中包含一个JButton button。点击后,button会在自己的窗口中创建并显示JDialog dialog(照例)。使用几个JTextFields和一个提交按钮,JDialog dialog创建一个封装这些输入数据的新对象dataObject。如果我们希望主应用程序dataPanel中的frame JPanel显示此dataObject,那么应该如何将dataObject正确地传递给驻留在外部JFrame中的JPanel?

在写这篇文章的时候对我来说是满口的,所以我会试着澄清一下:

JFrame frame

  • JPanel dataPanel - 用于显示来自JDialog
  • 中创建的对象的数据
  • JPanel buttonPanel - 包含一个用于打开JDialog的按钮,其中将输入一些信息,并且使用所述信息构建我们的对象dataObject

此处的目标是将此dataObject(及其组成字段)传递给要显示的dataPanel。处理这个问题最合适的方法是什么?我考虑将对象保持在dataPanel静态,然后从JDialog调用静态方法来添加新对象,但这似乎不适合做。

一些指导?

1 个答案:

答案 0 :(得分:2)

很大程度上取决于程序的结构,包括对话框的行为方式:

  • 如果JDialog是模态并且在按下提交按钮时消失,那么解决方案很简单 - 在返回后将从对话框相关类中提取数据,这将是显示对话框后的代码。对话框提交JButton的监听器只会使对话框不再可见。
  • 否则,如果JDialog是非模态并且在按下提交按钮时消失,那么您可能希望将一个监听器附加到其窗口,我相信一个WindowListener,然后进行调用当侦听器指示对话框已关闭或正在关闭时,代码将提取信息。
  • 否则,如果JDialog是非模态并且在按下提交按钮时不应该变为不可见但你需要用新数据更新调用程序,那么我会有调用类将PropertyChangeListener添加到与对话框相关的类中,以便与对话框相关的类可以通知任何已按下提交的侦听器。这段代码将在对话框中提交JButton的监听器。
  • 我会给对话框相关的类一个public DataObject getDataObject()方法,调用代码在对话框返回后可以调用该方法,允许显示对话框的类在需要时提取相关信息。
  • 无论你做什么,都没有理由使用静态字段和许多理由不这样做。我强烈建议你不要考虑这个。

例如,模态对话框返回:

// caveat: code has not been tested by compilation or running. 
JButton myButton = new JButton(new AbstractAction("Show Dialog Button") {
  public void actionPerformed(ActionEvent evt) {
    MyDialogPanel myDialogPanel = new MyDialogPanel();
    JDialog myDialog = new JDialog(myJFrame, "My Dialog", 
            ModalityType.APPLICATION_MODAL);
    myDialog.add(myDialogPanel);
    myDialog.pack();
    myDialog.setLocationRelativeTo(myJFrame);
    myDialog.setVisible(true);

    // dialog now returns and we can get the data
    // assuming that the wrapper object for your data 
    // is called "DataObject"
    DataObject dataObject = myDialogPanel.getDataObject();

    // and perhaps use it. Assume setDataObject is a method 
    // of the main GUI that displays the data object
    setDataObject(dataObject);
  }
});