假设我们有一个 JFrame frame
包含两个 JPanel,buttonPanel
和dataPanel
,在此面板中有一个 JButton button
。单击时,button
创建并显示 JDialog dialog
在它自己的窗口中(像往常一样)。使用多个 JTextField 和一个提交按钮,JDialog dialog
创建一个新对象 dataObject
封装这些输入数据。如果我们希望我们的dataPanel
主应用程序中的 JPanel frame
显示此 dataObject
,应该如何dataObject
是否正确传递到驻留在外部 JFrame 中的 JPanel?
在写这篇文章时,即使对我来说也很拗口,所以我会尝试澄清:
JFrame frame
- JPanel
dataPanel
- 用于显示 JDialog 中创建的对象的数据 - JPanel
buttonPanel
- 包含一个打开 JDialog 的按钮,将在其中输入一些信息,并使用所述信息我们的对象dataObject
已构建。
这里的目标是通过这个dataObject
(及其组成字段)到 dataPanel
要显示。处理这个问题最合适的方法是什么?我考虑将对象保留在 dataPanel
中static,然后从 JDialog 调用静态方法来添加新对象,但这似乎不是正确的做法。
一些指导?
最佳答案
很大程度上取决于程序的结构,包括对话框的行为方式:
- 如果 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);
}
});
关于java - 将对象从 JDialog 传递回根框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15855864/