【问题标题】:Java - Displaying contents of a HashMap using (Abstract)ListModelJava - 使用(抽象)ListModel 显示 HashMap 的内容
【发布时间】:2012-03-09 01:52:53
【问题描述】:

我正在为一个项目设计一个基本的电话簿。它具有三个类,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 + ".";
}

}

【问题讨论】:

    标签: java swing class defaultlistmodel


    【解决方案1】:

    您可能试图对继承做太多事情。与其使用 AbstractListModel 代替您的 HashMap,不如考虑创建一个扩展 AbstractListModel 的类,该类持有 TelephoneDirectory 类,其 HashMap 作为 AbstractListModel 数据的核心。这称为通过组合而不是继承扩展类。

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

    【讨论】:

    • 您将如何做到这一点并将 HashMap 存储在 AbstractListModel 类中?
    • +1 表示合成。 @user1258337:EnvTableTest 就是一个例子。
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 2018-01-02
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多