2012-03-09 33 views
0

我正在爲一個項目設計一個基本的電話簿。它有三個類:Main(用於GUI),TelephoneDirectory(用於存儲TelephoneRecords對象的對象)和TelephoneRecords類(用於存儲每個記錄對象的信息)。Java - 使用(摘要)顯示HashMap的內容ListModel

需求狀態:通過添加一個列表來顯示電話目錄的完整當前內容,按名稱按字母順序排列,從而擴展您的應用程序。您將需要實施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 + "."; 
} 

} 

回答

4

你可能會試圖做太多的繼承。考慮創建一個擴展AbstractListModel的類,而不是使用AbstractListModel 來代替,並考慮創建一個擴展AbstractListModel的類,並且保留TelephoneDirectory類,並將其HashMap作爲AbstractListModel數據的核心。這被稱爲擴展類組成而不是由繼承

編輯:另外考慮使用TreeMap而不是HashMap,以便能夠按名稱順序檢索您的姓名和電話記錄。您還需要爲您的TelephoneDirectory類提供getElementAt(int index)getSize()方法,以允許在AbstractListModel類中使用它。

+0

你將如何做到這一點,並將HashMap存儲在AbstractListModel類中? – mark 2012-03-09 10:39:26

+0

+1。 @ user1258337:['EnvTableTest'](http://stackoverflow.com/a/9134371/230513)就是一個例子。 – trashgod 2012-03-09 12:02:19