当前位置: 首页 > 知识库问答 >
问题:

用户输入到GUI中的值没有保存?

朱高超
2023-03-14

下面是我正在编写的代码。基本上我需要一个盒子来打开,让用户在相应的文本字段中输入数据。一切都很好。当我从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首先出现一样)< br >运行:< br >名称:null
地址:null
家庭电话号码:null
工作电话号码:null
电子邮件:null
名称(现在它从actionPerformed中打印出来)地址城市省邮政编码< br >号码< br >另一个号码< br >电子邮件< br >名称:名称< br >地址:地址城市省邮政编码< br >家庭电话号码:号码

共有2个答案

仲孙默
2023-03-14

在main方法中,一开始就调用了“displayPERInfo()”方法。您将字符串名称声明为未初始化的字段,因此默认情况下它的值为null。您在事件类内的actionPerform()方法中初始化此变量。

问题是:

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);
}

在调用变量之前,您必须给出您想要的值。这同样适用于其他变量。如果您将某些内容声明为“String Name;”并尝试调用它,您将收到null。

齐望
2023-03-14

似乎您的<code>saveInfo</code>函数是多余的,因为您在调用它之前已经设置了每个值,但我不知道<code>saveInfo</code>为什么会将这些值置零。尝试在<code>saveInfo</code>之前调用<code>displayPersonInfo</code>并查看发生了什么。

 类似资料:
  • 我有一个已经预先输入值的hashmap,并且我正在从用户那里获取更多的值。然后按升序对这些值进行排序。但是在这段代码中,用户输入的值不会插入到HashMap中。 我创建了一个名为adduser()的方法,我调用它来添加新值。但它不能输入数据。我该怎么解决这个?

  • 问题内容: 一直试图将我的房屋,房屋的年数和大小添加到GUI(更确切地说是JTextarea)中。最简单的方法是什么?尚未完全掌握数据输入。 问题答案: 有一个简单的方法,应该可以轻松附加结果 例如… 看看如何使用文本区域实现更多细节

  • 我正在制作一个简单的石头剪刀程序,但不确定如何确保用户只输入有效的选项。如果他们不键入“石头”、“纸”或“剪刀”(大写不重要)等变量,然后再键入“是”或“否”,我需要能够对他们进行谴责。建议? }

  • 问题内容: 我有一个线程类“ MyThread”和主应用程序,简称为“ Gui”。我想从线程类创建一些对象,但在本示例中,我仅创建了一个对象。线程类完成一些工作,然后向Gui类发出信号,指示需要用户输入(此指示目前仅是更改按钮的文本)。然后,线程应等待用户输入(在这种情况下为单击按钮),然后继续执行其操作… 如何在(多个)线程中等待用户输入? 问题答案: 默认情况下,具有事件循环,可以处理信号和插

  • 让我明确一点--我试图使用Twilio STUDIO来实现这一点--而不是编码。我有一个完整的IVR构建和工作,但我不知道如何保存呼叫者输入的选择(DTMF)。是否有一个简单的插件或addon可以节省用户输入?

  • 问题内容: 我正在尝试创建一个基本菜单,以检查输入的变量是否与定义的变量匹配。如果定义了变量,则获取已定义变量的数据。 例。 我输入 应该相等 问题答案: 这似乎是您要找的东西: 但是,这可能不是最好的策略,因为错字或恶意用户很容易使您的代码崩溃,系统过载或执行他们喜欢的任何其他讨厌的事情。对于这种特殊情况,更好的方法可能是