Java 无法从JTextField中找到首先输入的值的原因

Java 无法从JTextField中找到首先输入的值的原因,java,swing,hashmap,jtextfield,Java,Swing,Hashmap,Jtextfield,代码如下: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; class Phone{ private String name; private String phone_number; private String address; public Phone(String name,String phone_number, String address) { t

代码如下:

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

class Phone{
private String name;
private String phone_number;
private String address;

public Phone(String name,String phone_number, String address) {
    this.name = name;
    this.phone_number = phone_number;
    this.address = address;
}

String getName() {return this.name;}
String getNumber() {return this.phone_number;}
String getAddress() {return this.address;}
}

public class Phone_Book extends JFrame{
private JTextArea ta = new JTextArea();

private JButton lookup = new JButton("lookup");
private JButton search = new JButton("search");
private JButton input = new JButton("input");
private JButton remove = new JButton("remove");

private JLabel name = new JLabel("name");
private JLabel phone_number = new JLabel("phone_number");
private JLabel address = new JLabel("address");

private JTextField name_input = new JTextField();
private JTextField phone_number_input = new JTextField();
private JTextField address_input = new JTextField();

private HashMap<String,Phone> hashPhoneBook = new HashMap<String, Phone>();

public Phone_Book() {
    setTitle("Phone Book");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container c = getContentPane();
    c.setLayout(null);

    //*********************PhoneBook Design ********************************************
    JPanel buttonPanel = new JPanel();

    buttonPanel.add(inquiry);
    buttonPanel.add(search);
    buttonPanel.add(input);
    buttonPanel.add(remove);

    buttonPanel.setLayout(new GridLayout(1,4));
    buttonPanel.setSize(350,30);
    buttonPanel.setLocation(670,70);    

    JPanel labelPanel = new JPanel();

    labelPanel.add(name);
    labelPanel.add(phone_number);
    labelPanel.add(address);

    labelPanel.setLayout(new GridLayout(3,1));
    labelPanel.setSize(80,150);
    labelPanel.setLocation(670,110);    

    JPanel textPanel = new JPanel();
    textPanel.add(name_input);
    textPanel.add(phone_number_input);
    textPanel.add(address_input);

    textPanel.setLayout(new GridLayout(3,1,0,25));

    textPanel.setSize(260, 140);
    textPanel.setLocation(750, 120);

    JScrollPane js = new JScrollPane(ta);
    js.setSize(600, 300);
    js.setLocation(20, 10);

    c.add(js);
    c.add(buttonPanel);     
    c.add(labelPanel);
    c.add(textPanel);

    //********************** PhoneBook Function **************************************************
    ...

    //---- problem occurs-------------------------------------      
    search.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) {    
            ta.setText(" ");

            Phone p = hashPhoneBook.get(name_input.getText());

            if(p == null) ta.append(name_input.getText()+"doesn't exist\n");
            else {
                ta.append(p.getName()+" "+p.getNumber()+" "+p.getAddress()+"\n");
            }

            name_input.setText(" ");
        }
    });

    //------------------------------------------------------
    ...

    setSize(1100,400);
    setVisible(true);
}

public static void main(String[] args) {
    new Phone_Book();
}
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.util.*;
班级电话{
私有字符串名称;
私人电话号码;
私有字符串地址;
公用电话(字符串名称、字符串电话号码、字符串地址){
this.name=名称;
this.phone\u number=电话号码;
this.address=地址;
}
字符串getName(){返回this.name;}
字符串getNumber(){返回此.phone_number;}
字符串getAddress(){返回此.address;}
}
公共类电话簿扩展JFrame{
私有JTextArea ta=新JTextArea();
私有JButton查找=新JButton(“查找”);
私有JButton search=新JButton(“search”);
私有JButton输入=新JButton(“输入”);
私有JButton remove=新JButton(“remove”);
专用JLabel名称=新JLabel(“名称”);
私人JLabel电话号码=新JLabel(“电话号码”);
专用JLabel地址=新JLabel(“地址”);
私有JTextField name_input=new JTextField();
私人JTextField电话号码输入=新JTextField();
私有JTextField地址_输入=新JTextField();
私有HashMap hashPhoneBook=新HashMap();
公用电话簿(){
设置标题(“电话簿”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
容器c=getContentPane();
c、 setLayout(空);
//*********************电话簿设计********************************************
JPanel buttonPanel=新的JPanel();
按钮面板。添加(查询);
按钮面板。添加(搜索);
按钮面板。添加(输入);
按钮面板。添加(删除);
buttonPanel.setLayout(新网格布局(1,4));
按钮面板设置尺寸(350,30);
按钮面板设置位置(670,70);
JPanel labelPanel=新的JPanel();
labelPanel.add(名称);
labelPanel.add(电话号码);
labelPanel.add(地址);
labelPanel.setLayout(新网格布局(3,1));
labelPanel.setSize(80150);
labelPanel.设置位置(670110);
JPanel textPanel=新的JPanel();
textPanel.add(名称\输入);
textPanel.add(电话号码输入);
textPanel.add(地址\输入);
setLayout(新的GridLayout(3,1,0,25));
textPanel.setSize(260、140);
textPanel.setLocation(750120);
JScrollPane js=新的JScrollPane(ta);
js.setSize(600300);
js.setLocation(20,10);
c、 添加(js);
c、 添加(按钮面板);
c、 添加(标签面板);
c、 添加(文本面板);
//**********************电话簿功能**************************************************
...
//----出现问题------------------
search.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
ta.setText(“”);
Phone p=hashPhoneBook.get(name_input.getText());
如果(p==null)ta.append(name_input.getText()+“不存在\n”);
否则{
附加(p.getName()+“”+p.getNumber()+“”+p.getAddress()+“\n”);
}
name_input.setText(“”);
}
});
//------------------------------------------------------
...
设置大小(1100400);
setVisible(真);
}
公共静态void main(字符串[]args){
新电话簿();
}
}
问题就在这里

  • 当我点击“查找”按钮时,我可以看到所有的值(包括我在运行程序后第一次输入的第一个值)(我认为不需要它,我没有把它放在这段代码中)

  • 当我试图从
    HashMap
    中查找或删除第一个值时,它不起作用。 只有我得到了“空” 但是,当我按下“空格”并输入值时,效果很好。 (例如,“大卫”-->“大卫”)


  • 我想知道为什么会发生这种情况?

    您的HashMap中的键似乎设置不正确。您还没有包括设置此项的代码

    不过,在我看来,我会用一个简单的以行分隔的文本文件来实现电话簿&将所有记录加载到一个字符串中,而不是对电话簿使用HashMap。原因是您可以使用正则表达式来匹配不区分大小写和部分记录。使用HashMap时,键必须是完全匹配的

    “我以为不需要它,我没有把它放在这段代码中”为了更快地获得更好的帮助,可以添加or。