1

假设我们有一个 JFrame frame,它包含两个 JPanelbuttonPaneldataPanel,并且在这个面板中只有一个 JButton button。单击时,会在其自己的窗口中button创建并显示一个 JDialog (与往常一样)。dialog使用几个 JTextField 和一个提交按钮,JDialogdialog创建一个dataObject封装这些输入数据的新对象。如果我们希望我们的dataPanelJPanel 在主应用程序frame中显示 this dataObject,应该如何dataObject适当地传递给驻留在外部 JFrame 中的 JPanel?

在写它的时候,这对我来说也是一个拗口,所以我将尝试澄清:

框架frame

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

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

一些指导?

4

1 回答 1

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);
  }
});
于 2013-04-06T20:53:56.287 回答