首页 > 解决方案 > 我找不到我首先从 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) {
    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();
}
}

这是问题所在。

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

  2. 当我尝试从中查找或删除第一个值时HashMap,它不起作用。只有我得到了'null'但是,当我按下'空格'并输入值时,它运行良好。(例如,'大卫' ----->'大卫')

我想知道为什么会这样?

标签: javaswinghashmapjtextfield

解决方案


似乎您的 HashMap 中的键设置不正确。您还没有包含设置它的代码。

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


推荐阅读