0

下面是我正在处理的代码。基本上我需要一个框来打开并让用户在相应的文本字段中输入他们的数据。一切都很好。当我从 actionPerformed 方法打印它时,一切都正确输出,但是当我从 main 调用 gui.displayPersonInfo 方法时,它显示所有值为空。它在盒子打开之前首先执行 displayPersonInfo 方法,即使我在之后调用该方法。有人知道我的代码有什么问题吗?(下面的输出)

package userInput;

import javax.swing.JFrame;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Person extends JFrame{

String Name; 
String Address;
String PhoneNumHome;
String PhoneNumWork;
String email;

JLabel label, label2;
JTextField tf1, tf2, tf3, tf4, tf5, tf6, tf7, tf8;
JButton button;

public Person(){
    setLayout(new FlowLayout());
    label = new JLabel("Enter your name");
    add(label);
    tf1 = new JTextField(10);
    add(tf1);

    label = new JLabel("Enter your Address (street number + street name)");
    add(label);
    tf2 = new JTextField(10);
    add(tf2);

    label = new JLabel("Enter your city");
    add(label);
    tf3 = new JTextField(10);
    add(tf3);

    label = new JLabel("Enter your province");
    add(label);
    tf4 = new JTextField(10);
    add(tf4);

    label = new JLabel("Enter your postal code");
    add(label);
    tf5 = new JTextField(10);
    add(tf5);

     label = new JLabel("Enter your home phone number (306-xxx-xxx)");
    add(label);
    tf6 = new JTextField(10);
    add(tf6);

     label = new JLabel("Enter your work phone number (306-xxx-xxx)");
    add(label);
    tf7 = new JTextField(10);
    add(tf7);

     label = new JLabel("Enter your email (user@emailservice.xxx");
    add(label);
    tf8 = new JTextField(10);
    add(tf8);

    button = new JButton("Next");
    add(button);

    event e = new event();
    button.addActionListener(e);
}

public class event implements ActionListener{
    public void actionPerformed(ActionEvent e){
        String address1, pnum, wnum, a;
        try{
            String word = tf1.getText();
            Name = word;
            System.out.println(Name);
            Address = tf2.getText();
            Address = Address + " " + tf3.getText();
            Address = Address + " " + tf4.getText();
            Address = Address + " " + tf5.getText();
            address1 = Address;
            System.out.println(Address);
            PhoneNumHome = tf6.getText();
            pnum = PhoneNumHome;
            PhoneNumWork = tf7.getText();
            wnum = PhoneNumWork;
            email = tf8.getText();
            a = email;
            System.out.println(PhoneNumHome);
            System.out.println(PhoneNumWork);
            System.out.println(email);

            saveInfo(word, address1, pnum, wnum, a);
            displayPersonInfo();
            System.exit(0);

        }catch(Exception ex){}
    }
}

public void displayPersonInfo(){
    System.out.println("Name: " + Name);
    System.out.println("Address: " + Address);
    System.out.println("Home Phone Number: " + PhoneNumHome);
    System.out.println("Work Phone Number: " + PhoneNumWork);
    System.out.println("Email: " + email);
}

public void saveInfo(String name, String address, String Hphone, String Wphone, String Email){
    Name = name;
    Address = address;
    PhoneNumHome = Hphone;
    PhoneNumWork = Wphone;
    email = Email;
}

public static void main(String[] args) {
    Person gui = new Person();

    gui.displayPersonInfo();
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setTitle("Enter Information");
    gui.setSize(350,330);
    gui.setLocation(500,250);
    gui.setVisible(true);

}

}

这是输出:(它就像 displayPersonInfo 首先出现)
运行:
名称:空
地址:空
家庭电话号码:空
工作电话号码:空
电子邮件:空
一个名称(现在它从 actionPerformed 中打印它)一个地址一个城市一个省 一个邮政编码
一个号码
另一个号码
一个电子邮件
姓名:一个 姓名
地址:一个地址 一个城市 一个省 一个邮政编码
家庭电话号码:一个号码
工作电话号码:另一个号码
电子邮件:一个电子邮件 建立
成功(总时间:20 秒)

4

2 回答 2

1

It seems your saveInfo function is redundant since you already set every value prior to calling it, but I don't know why saveInfo is nulling the values. Try to call displayPersonInfo before saveInfo and see what happens.

于 2013-06-23T01:21:37.517 回答
1

在主方法中,“displayPersonInfo()”方法在开始时被调用。您将字符串名称声明为未初始化的字段,因此默认情况下其值为空。在事件类的 actionPerformed() 方法中初始化这个变量。

问题是:

public void displayPersonInfo() {
    System.out.println("Name: " + Name);
}

public static void main(String[] args) {
    Person gui = new Person();
    gui.displayPersonInfo();
}

您仅在执行操作时为变量指定所需的值,因此如果您尝试在此之前访问该变量,您将在那里获得默认值,即 null。这正是你正在做的。当 main 方法启动时,它会调用 displayPersonInfo(),在其中您尝试访问变量名称并返回 null,因为该变量仅在执行操作时接收您想要的值。

所以解决方案是:

public void displayPersonInfo() {
    String word = tf1.getText();
    Name = word;
    System.out.println("Name: " + Name);
}

在调用变量之前,您必须给出所需的值。这同样适用于其他的。如果您将某些内容声明为“字符串名称;” 并尝试调用它,您将收到 null。

于 2013-06-23T04:17:25.453 回答