gpt4 book ai didi

Java - 使用(抽象)ListModel 显示 HashMap 的内容

转载 作者:行者123 更新时间:2023-12-01 19:07:09 24 4
gpt4 key购买 nike

我正在为一个项目设计一个基本的电话簿。它具有三个类: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 作为 AbstractListModel 数据的核心来保存 TelephoneDirectory 类。这称为通过组合而不是继承来扩展类。

编辑:还可以考虑使用 TreeMap 而不是 HashMap,以便能够按姓名顺序检索您的姓名和电话记录。您还需要为 TelephoneDirectory 类提供一个 getElementAt(int index) 和一个 getSize() 方法,以允许在 AbstractListModel 类中使用它。

关于Java - 使用(抽象)ListModel 显示 HashMap 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9627903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com