簡體   English   中英

Java-使用(Abstract)ListModel顯示HashMap的內容

[英]Java - Displaying contents of a HashMap using (Abstract)ListModel

我正在設計一個項目的基本電話簿。 它具有三個類,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();
}

}

TELEPHONERECORDS

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類中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM