以下是我正在处理的代码。基本上我需要一个框来打开并让用户在相应的文本字段中输入他们的数据。一切都很好。当我从actionPerformed方法打印它时,一切都正确输出,但是当我从main调用gui.displayPersonInfo方法时,它将所有值显示为null。它甚至在盒子打开之前首先执行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首先出现一样)
运行:
姓名:null
地址:null
家庭电话号码:null
工作电话号码:null
电子邮件:null
一个名字(现在它从actionPerformed中打印出来)
一个城市一个省的邮政编码
一个数字
另一个号码
电子邮件
姓名:姓名
地址:一个城市一个省的邮政编码
家庭电话号码:一个号码
工作电话号码:另一个号码
电子邮件:电子邮件
建立成功(总时间:20秒)
答案 0 :(得分:1)
您的saveInfo
功能似乎是多余的,因为您在调用之前已经设置了每个值,但我不知道为什么saveInfo
将值归零。尝试在displayPersonInfo
之前致电saveInfo
,看看会发生什么。
答案 1 :(得分:1)
在main方法中," displayPersonInfo()"方法在启动时被调用。您将字符串名称声明为未初始化的字段,因此默认情况下其值为null。您在事件类内的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。