Java 当用户单击JDialog中的按钮时,如何将输入的数据从JDialog传递到父JFrame?

Java 当用户单击JDialog中的按钮时,如何将输入的数据从JDialog传递到父JFrame?,java,swing,jframe,jdialog,Java,Swing,Jframe,Jdialog,当用户单击JDialog中的某个按钮时,如何将用户输入的日期从JDialog传递到父JFrame 下面是我希望程序如何工作的:当用户单击JFrame中的按钮时,会弹出一个JDialog。然后用户输入各种类型的数据(字符串和整数)。如果用户单击“添加任务”按钮,数据将传递回原始JFrame,它将显示数据,JDialog将关闭。如果用户单击“取消”按钮,数据将被丢弃,JDialog将关闭 我考虑过使用JOptionPane,但我认为它不允许使用各种类型的数据。我考虑过在JFrame中创建一个方法并从

当用户单击JDialog中的某个按钮时,如何将用户输入的日期从JDialog传递到父JFrame

下面是我希望程序如何工作的:当用户单击JFrame中的按钮时,会弹出一个JDialog。然后用户输入各种类型的数据(字符串和整数)。如果用户单击“添加任务”按钮,数据将传递回原始JFrame,它将显示数据,JDialog将关闭。如果用户单击“取消”按钮,数据将被丢弃,JDialog将关闭

我考虑过使用JOptionPane,但我认为它不允许使用各种类型的数据。我考虑过在JFrame中创建一个方法并从JDialog调用它,但我不知道如何引用JFrame。我曾考虑在JDialog中创建一个变量,但我不知道如何阻止JDialog立即向JFrame传递一个空变量

有什么帮助吗

JFrame的代码:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Dialog.ModalityType;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JDialog;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class MainInterface extends JFrame {

    private JPanel contentPane;

    public MainInterface() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 400, 800);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JButton addTask = new JButton("Add");
        addTask.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                NewTask newTask = new NewTask();
                newTask.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                // Set window title
                newTask.setTitle("Add Task");
                newTask.setVisible(true);
            }
        });
        addTask.setBounds(0, 728, 97, 25);
        contentPane.add(addTask);
        
        JButton modifyTask = new JButton("Modify");
        modifyTask.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                
            }
        });
        modifyTask.setBounds(95, 728, 97, 25);
        contentPane.add(modifyTask);
        
        JButton deleteTask = new JButton("Delete");
        deleteTask.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
            }
        });
        deleteTask.setBounds(190, 728, 97, 25);
        contentPane.add(deleteTask);
        
        JButton settingMenu = new JButton("Settings");
        settingMenu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Setting settings = new Setting();
                settings.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                settings.setVisible(true);
                settings.setTitle("Settings");
            }
        });
        settingMenu.setBounds(285, 728, 97, 25);
        contentPane.add(settingMenu);
    }

}

JFrame是由另一个类启动的,因此它没有main方法

JDialog的代码:

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import org.omg.CORBA.PUBLIC_MEMBER;

import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.JSpinner;
import java.awt.event.ActionListener;
import java.util.jar.Attributes.Name;
import java.awt.event.ActionEvent;

public class NewTask extends JDialog {

    private final JPanel contentPanel = new JPanel();
    private JTextField taskName;

    public NewTask() {
        setBounds(100, 100, 450, 600);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        contentPanel.setLayout(null);
        {
            JLabel lblNewLabel = new JLabel("Name:");
            lblNewLabel.setBounds(24, 13, 38, 16);
            contentPanel.add(lblNewLabel);
        }
        {
            taskName = new JTextField();
            taskName.setBounds(79, 10, 304, 22);
            contentPanel.add(taskName);
            taskName.setColumns(10);
        }
        
        JLabel lblNewLabel_1 = new JLabel("Time Required:");
        lblNewLabel_1.setBounds(24, 58, 97, 16);
        contentPanel.add(lblNewLabel_1);
        
        JSpinner hourSpinner = new JSpinner();
        hourSpinner.setBounds(125, 55, 44, 22);
        contentPanel.add(hourSpinner);
        
        JLabel lblNewLabel_2 = new JLabel("hours");
        lblNewLabel_2.setBounds(175, 58, 44, 16);
        contentPanel.add(lblNewLabel_2);
        
        // Set maximum value for minutes to 59
        int min = 0;
        int max = 59;
        int step = 1;
        int i = 1;
        SpinnerModel value = new SpinnerNumberModel(i, min, max, step);
        JSpinner minuteSpinner = new JSpinner(value);
        minuteSpinner.setBounds(225, 55, 44, 22);
        contentPanel.add(minuteSpinner);
        
        JLabel lblNewLabel_3 = new JLabel("minutes");
        lblNewLabel_3.setBounds(281, 58, 56, 16);
        contentPanel.add(lblNewLabel_3);
        
        JLabel lblNewLabel_4 = new JLabel("Deadline:");
        lblNewLabel_4.setBounds(24, 108, 56, 16);
        contentPanel.add(lblNewLabel_4);
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
            {
                JButton addButton = new JButton("Add Task");
                addButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        dispose();
                    }
                });
                addButton.setActionCommand("OK");
                buttonPane.add(addButton);
                getRootPane().setDefaultButton(addButton);
            }
            {
                JButton cancelButton = new JButton("Cancel");
                cancelButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        // Close dialog window
                        dispose();
                    }
                });
                cancelButton.setActionCommand("Cancel");
                buttonPane.add(cancelButton);
            }
        }
    }
    
}
我考虑在JFrame中创建一个方法并从 JDialog,但我不知道如何引用JFrame

尽管这可能是一个很好的解决方案,但不鼓励引用调用该方法的对象。 查看原因(第一个答案):

一种可能的方法是在JFrame中创建一个方法,并添加一个JFrame作为
newTask()
函数的参数。然后,调用
newTask()
时,将
this
作为参数传递:
newTask(this)

在修改后的
newTask(JFrame)
方法中,只需使用传递的参数引用父JFrame中的方法

这似乎与引用调用该方法的对象相同,但事实并非如此。这里您将作为参数传递父JFrame,它可能并不总是调用该方法的对象


我希望我足够清楚,有一个美好的一天

通常,当您创建
JDialog
时,会传递对
JFrame
的引用,因此
JDialog
可以相对于
JFrame
放置在显示器上。你有选择的余地。如果按下OK按钮,您可以使用
JFrame
code检查并执行
JDialog
getters以获取字段。或者,您可以将数据模型传递给
JDialog
,并让
JDialog
在OK按钮
ActionListener
中向数据模型添加字段。