2013-06-23 42 views
0

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

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 ([email protected]"); 
    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
A名称(现在将其从actionPerformed中打印出来) 个的ADRESS一市一省邮政编码
一些
另一个号码
电子邮件
名:名称
地址:一个ADRESS一市一省邮政编码
家庭电话号码:一些
工作电话号码:其他号码
电子邮件:电子邮件
BUILD SUCCESSFUL(总时间:20秒)

+2

你有没有试图调试你的程序,或者你想我们其中的一个人来帮助你解决一个简单的问题? – Tdorno

回答

1

看来你saveInfo FUNC由于您在调用它之前已经设置了每个值,因此重复是多余的,但我不知道为什么saveInfo将值设为无效。尝试在saveInfo之前致电displayPersonInfo,看看会发生什么。

1

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

的问题是:

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

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

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

因此,解决办法是:

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

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

相关问题