Java - отображение содержимого HashMap с использованием (Abstract) ListModel - PullRequest
0 голосов
/ 09 марта 2012

Я проектирую базовый телефонный справочник для проекта. Он имеет три класса: Main (для GUI), TelephoneDirectory (объект для хранения объектов TelephoneRecords) и класс TelephoneRecords (где хранится информация для каждого объекта записи).

Состояние требований: Расширьте свое приложение, добавив список с полным текущим содержимым телефонного справочника, упорядоченный в алфавитном порядке по имени. Вам нужно будет реализовать ListModel. Возможно, вы захотите изучить класс AbstractListModel, прежде чем приступить к собственной реализации.

Единственная проблема в том, что я абсолютно не знаю, как расширить свое приложение для достижения этой цели. Я искал в Интернете всю ночь и не нашел способа сделать это. Я пытался хранить объекты в AbstractListModel, а не в HashMap, но получаю ошибки. Я точно не знаю, что или почему это используется и как я мог использовать это. Следующее требование (между прочим) - автоматическое обновление JList новыми данными при их вводе, так что, я думаю, это как-то связано?

В любом случае, если кто-то может помочь, это было бы здорово. Мой текущий рабочий код для предыдущей версии, которую необходимо отредактировать:

MAIN

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()   + ".");
    }
}

}

TELEPHONEDIRECTORY

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 + ".";
}

}

1 Ответ

4 голосов
/ 09 марта 2012

Возможно, вы пытаетесь сделать слишком много с наследованием.Вместо того чтобы использовать AbstractListModel вместо вашего HashMap, рассмотрите возможность создания класса, расширяющего AbstractListModel, и который содержит класс TelephoneDirectory с его HashMap в качестве ядра данных AbstractListModel.Это называется расширением класса на состав , а не наследование .

Редактировать: Также рассмотрите возможность использования TreeMapа не HashMap, чтобы иметь возможность получить ваши имена и телефонные записи в порядке имен.Вам также нужно предоставить вашему классу TelephoneDirectory getElementAt(int index) и метод getSize(), чтобы разрешить его использование в классе AbstractListModel.

...