我怎样才能从一个JDialog框中返回一个值到父JFrame?

我已经创build了一个模式JDialog框与自定义绘图和JButton。 当我点击JButton时,JDialog框应该closures,并且应该返回一个值。

我在父JFrame中创build了一个名为setModalPiece的函数,它接收一个值并将其设置为本地JFramevariables。

问题是这个函数在JDialog框中是不可见的(即使JDialog框有一个对父JFrame的引用)。

两个问题:1)是否有一个更好的方法来从一个JDialog框中返回一个值到它的父JFrame?

2)为什么不能传递给JDialog的JFrame引用被用来访问我的JFrame函数setModalPiece?

您应该通过将自定义方法getValue()到您的自定义JDialog来做相反的事情。

通过这种方式,您可以从JFrame询问对话框的值,而不是通过在JFrame本身上调用某些东西来设置它。

如果你看看有关对话框的Oracle教程,那就说明了

如果您正在devise自定义对话框,则需要devise对话框的API,以便您可以查询有关用户select的对话框。 例如,CustomDialog有一个getValidatedText方法,返回用户input的文本。

(你可以findCustomDialog来源,看看他们是如何devise你的自定义对话框的)

我通常这样做:

 Dialog dlg = new Dialog(this, ...); Value result = dlg.showDialog(); 

Dialog.showDialog()函数如下所示:

 ReturnValue showDialog() { setVisible(true); return result; } 

由于在JDialog中将可见性设置为true是模态操作,所以OKbutton可以将实例variables( result )设置为对话框的选定结果(或者如果取消,则为null )。 在“确定/取消”button方法中处理后,执行以下操作:

 setVisible(false); dispose(); 

将控制返回给showDialog()函数。

我不知道我是否可以用一种很酷的方式解释我的方法…让我说我需要一个JDialog whos的productPrice和ammount从用户那里得到这个信息,我需要从JFrame调用它。

在JDialog中声明productPrice和ammount为公共非静态全局variables。

 public float productPrice; public int ammount; 

*这进入对话框的全局范围内。

在JDialog构造函数中添加这些行以确保forms

 super((java.awt.Frame) null, true); setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL); 

*这在对话框的类构造函数中进行

让我们说你的JDialog的类名是'MyJDialog',当调用做这样的事情

 MyJDialog question = new MyJDialog(); MyJDialog.setVisible(true); // Application thread will stop here until MyJDialog calls dispose(); // this is an effect of modality // // When question calls for dispose(), it will leave the screen, // but its global values will still be accessible. float myTotalCostVar = question.productPrice * question.ammount; // this is acceptable. // You can also create public getter function inside the JDialog class, // its safer and its a good practice. 

*这在你的JFrame中的任何function,并会打电话给JDialog获取信息。

当您将任何值传递给JFrame到JDialog时,然后创buildjdialog的参数化构造函数,并在jframe中随时调用。 例如参数化的构造函数,如:

  public EditProduct(java.awt.Frame parent, boolean modal, int no) { //int no is number of product want to edit. //Now we can use this pid in JDialog and perform whatever you want. } 

当你想从JDialog传递值到JFrame时,创build一个带有set的bean类,并使用vector获取这些值,并在jframe中获取这些值。 更多信息

这是我通常如何做的。 我不确定,这就是为什么我创build了这个post:

从JDialog返回值; dispose(),setVisible(false) – 例子

添加一个接口到你的构造函数?

 public class UploadConfimation extends JDialog { private final JPanel contentPanel = new JPanel(); public interface GetDialogResponse{ void GetResponse(boolean response); } /** * Create the dialog. */ public UploadConfimation(String title, String message, GetDialogResponse result) { setBounds(100, 100, 450, 300); setTitle(title); getContentPane().setLayout(new BorderLayout()); contentPanel.setLayout(new FlowLayout()); contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(contentPanel, BorderLayout.CENTER); { JLabel lblMessage = new JLabel(message); contentPanel.add(lblMessage); } { JPanel buttonPane = new JPanel(); buttonPane.setLayout(new FlowLayout(FlowLayout.CENTER)); getContentPane().add(buttonPane, BorderLayout.SOUTH); { JButton okButton = new JButton("YES"); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { result.GetResponse(true); dispose(); } }); buttonPane.add(okButton); getRootPane().setDefaultButton(okButton); } { JButton cancelButton = new JButton("NO"); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { result.GetResponse(false); dispose(); } }); buttonPane.add(cancelButton); } } } 

}