【问题标题】:How to get JDialog textFiels Value from JFrame如何从 JFrame 获取 JDialog textFiels 值
【发布时间】:2020-09-17 12:15:48
【问题描述】:

您好,我是 Java 编码的新手,并试图在 JFrame 和 JDialog 的帮助下设计一个用户友好的桌面应用程序 -

我的 JFrame 是 -

package com.myapp.ui;
    
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JCheckBox;

public class MyFrame extends JFrame { 

private JPanel contentPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MyFrame frame = new MyFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public MyFrame() {

        setTitle("MyFrame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JButton btnClickMe = new JButton("Click Me");
        btnClickMe.setBounds(271, 171, 115, 29);
        contentPane.add(btnClickMe);
        
        JCheckBox chckbxOpenDialog = new JCheckBox("Open Dialog");      
        chckbxOpenDialog.setBounds(25, 171, 139, 29);
        contentPane.add(chckbxOpenDialog);
        
        chckbxOpenDialog.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(chckbxOpenDialog.isSelected()== true){
                    MyDialog MD = new MyDialog();
                    MD.setModal(true);
                    MD.setVisible(true);
                }
            }
        });
        
        btnClickMe.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                 //Here I want to get the value of textFieldName and textFieldEmail from JDialog
                 //after Click on Confirm Button in JDialog and closing/disposing it
            }
        });
    }
}

我的 JDialog 是 -

package com.myapp.ui;

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 javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class MyDialog extends JDialog {

    private final JPanel contentPanel = new JPanel();
    private JTextField textFieldName;
    private JTextField textFieldEmail;
    private JButton btnConfirm;

    public static void main(String[] args) {
        try {
            MyDialog dialog = new MyDialog();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public MyDialog() {
        setTitle("MyDialog");
        setBounds(100, 100, 450, 300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        contentPanel.setLayout(null);
        
        textFieldName = new JTextField();
        textFieldName.setBounds(108, 26, 146, 26);
        contentPanel.add(textFieldName);
        textFieldName.setColumns(10);
        
        textFieldEmail = new JTextField();
        textFieldEmail.setBounds(108, 68, 146, 26);
        contentPanel.add(textFieldEmail);
        textFieldEmail.setColumns(10);
        
        btnConfirm = new JButton("Confirm");
        btnConfirm.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //passing the Name and Email field value in JFrame
            }
        });
        btnConfirm.setBounds(132, 141, 115, 29);
        contentPanel.add(btnConfirm);
        
        MyFrame MF = new MyFrame();
        
    }
}

JFrame 和 JDialog 都在同一个包中。我试图获得的价值

从 JDialog 到 JFrame 的 textFieldName 和 textFieldEmail

如果有人能以最好的方式指导我,那就太好了。

【问题讨论】:

  • Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同的语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。与此相关的提示:new JTextField() 应该更像new JTextField(12)12 表示该文本字段在被填充之前要处理多少个字母(列)并有助于确定大小。
  • .. 正确布局 GUI 后,setBounds(100, 100, 450, 300);(充其量只是猜测)可以替换为 pack(); // makes it exactly the size it needs to be。应在添加所有组件后打包 GUI。

标签: java swing jframe jdialog


【解决方案1】:

你可以:

  1. 将设置器添加到 MyFrame
  2. ActionListener 中创建时将MyFrame 引用传递给MyDialog(使用this
  3. ActionListenerMyDialog 中设置字段MyFrame

可能有更好的方法来做到这一点。内置的JOptionPane 生成等待用户输入的模态对话框窗口。这些会比将 JFrame 的引用传递给 JDialog 更好。

另请注意,JavaFX 已在很大程度上取代了用于桌面 UI 的 Java Swing

【讨论】:

  • 谢谢@tomgeraghty3 我分享的代码是一个工作代码。您可以添加您提到的更改的任何可能性。我是新手,对 java 编码的理解非常有限。
猜你喜欢
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
相关资源
最近更新 更多