我正在设计一个项目的基本电话簿。它具有三个类,Main(用于GUI),TelephoneDirectory(用于存储TelephoneRecords对象的对象)和TelephoneRecords类(用于存储每个记录对象的信息)。
需求状态:通过添加一个列表来扩展您的应用程序,该列表显示电话目录的完整当前内容,并按名称按字母顺序排序。您将需要实现ListModel
。您可能需要先学习类AbstractListModel
,然后再开始自己的实现。
唯一的问题是,我绝对不知道如何扩展我的应用程序来实现这一目标。我整夜都在网上搜索,还没有找到实现此目的的方法。我尝试将对象存储在AbstractListModel中而不是HashMap中,但是会出错。我不完全知道它的用途或用途,以及如何使用它。下一个要求(顺便说一句)是在输入新数据时让JList自动更新,所以我想这与它有关系吗?
无论哪种方式,如果有人可以帮助,那就太好了。我当前需要修改的以前版本的工作代码是:
主要
public class Main extends JFrame implements ActionListener {
private static TelephoneDirectory directory = new TelephoneDirectory();
private JTextField nameField;
private JTextField numberField;
private JList contactList;
public Main() {
setTitle("Telephone Directory");
setLayout(new GridLayout(0,2));
JLabel nameLabel = new JLabel("Name of Contact:");
nameField = new JTextField(20);
add(nameLabel);
add(nameField);
JLabel numberLabel = new JLabel("Number of Contact:");
numberField = new JTextField(20);
add(numberLabel);
add(numberField);
JButton enterButton = new JButton("Enter");
JButton cancelButton = new JButton("Cancel");
enterButton.addActionListener(this);
cancelButton.addActionListener(this);
add(enterButton);
add(cancelButton);
JLabel contactsLabel = new JLabel("Current Contacts:");
contactList = new JList();
add(contactsLabel);
add(contactList);
setVisible(true);
pack();
}
public static void main(String[] args) {
new Main();
}
@Override
public void actionPerformed(ActionEvent arg0) {
JButton jb = (JButton) arg0.getSource();
if (jb.getText().equals("Cancel")) {
System.exit(0);
} else {
directory.addRecord(nameField.getText(), new TelephoneRecords(nameField.getText(), numberField.getText()));
System.out.println("Added record for " + nameField.getText() + ": number is " + numberField.getText() + ".");
}
}
}
电话目录
public class TelephoneDirectory implements Iterable<TelephoneRecords> {
private HashMap records;
public TelephoneDirectory() {
records = new HashMap<String, TelephoneRecords>();
}
public void addRecord(String name, TelephoneRecords newRecord) {
records.put(name, newRecord);
}
public TelephoneRecords getRecord(String name) {
return (TelephoneRecords) records.get(name);
}
public void getDirectory() {
System.out.println("Telephone Directory:");
records.values().iterator();
}
@Override
public Iterator<TelephoneRecords> iterator() {
return records.values().iterator();
}
}
电话录音
public class TelephoneRecords {
private String name;
private String number;
public TelephoneRecords(String name, String number) {
this.name = name;
this.number = number;
}
public String getName() {
return name;
}
public String getNumber() {
return number;
}
@Override
public String toString() {
return "The phone number of " + name + " is " + number + ".";
}
}
最佳答案
您可能会尝试对继承做太多事情。与其使用AbstractListModel代替您的HashMap,不如考虑创建一个扩展AbstractListModel的类,该类保留带有HashMap的TelephoneDirectory类,以其作为AbstractListModel数据的核心。这称为通过组合而不是继承来扩展类。
编辑:还考虑使用TreeMap而不是HashMap,以便能够按名称顺序检索您的姓名和电话记录。您还需要给您的TelephoneDirectory类提供一个getElementAt(int index)
和一个getSize()
方法,以允许其在AbstractListModel类中使用。