如何将值从JDialog框返回到父JFrame?

时间:2010-11-03 16:35:47

标签: java swing return-value jdialog

我创建了一个模态JDialog框,其上有一个自定义绘图和一个JButton。当我单击JButton时,JDialog框应该关闭,并且应该返回一个值。

我在父JFrame中创建了一个名为setModalPiece的函数,该函数接收一个值并将其设置为本地JFrame变量。

问题是从JDialog框中看不到此函数(即使JDialog框具有对父JFrame的引用)。

两个问题: 1)有没有更好的方法将值从JDialog框返回到其父JFrame?

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

6 个答案:

答案 0 :(得分:106)

我通常这样做:

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

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

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

由于在JDialog上将可见性设置为true是模态操作,因此OK按钮可以将实例变量(result)设置为对话框的选定结果(如果取消,则设置为null)。在“确定/取消”按钮方法中处理后,执行以下操作:

setVisible(false);
dispose();

将控制权交还给showDialog()函数。

答案 1 :(得分:23)

您应该通过向自定义getValue()添加自定义方法JDialog来执行相反的操作。

通过这种方式,您可以从JFrame询问对话框的值,而不是通过调用JFrame本身的内容来设置它。

如果您查看有关对话框here的Oracle教程,请说明

  

如果您正在设计自定义对话框,则需要设计对话框的API,以便查询用户选择的对话框。例如,CustomDialog有一个getValidatedText方法,该方法返回用户输入的文本。

(您可以找到CustomDialog的来源,了解他们如何设计您的自定义对话框)

答案 2 :(得分:4)

我不知道我能否以一种很酷的方式解释我的方法...... 让我们说我需要productPrice并从JDialog中安装,以便从用户那里获取该信息,我需要从JFrame中调用它。

将productPrice和ammount声明为JDialog中的公共非静态全局变量。

public float productPrice;
public int ammount;

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

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

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中的任何函数,并将调用JDialog来获取信息。

答案 3 :(得分:0)

当您将任何值传递给JFrame到JDialog时,只要您想调用,就可以在jframe中创建jdialog的参数化构造函数。 例如参数化构造函数如:

 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时,使用set和get方法创建一个bean类,使用vector来获取这些值,并在jframe中获取这些值。 More info

答案 4 :(得分:0)

以下是我通常的做法。我不确定,这就是我创建该帖子的原因:

Returning value from JDialog; dispose(), setVisible(false) - example

答案 5 :(得分:0)

为构造函数添加接口?

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);
        }
    }
}

}