0

プロジェクトの基本的な電話帳を設計しています。これには、Main (GUI 用)、TelephoneDirectory (TelephoneRecords オブジェクトを格納するオブジェクト)、および TelephoneRecords クラス (各レコード オブジェクトの情報が格納される場所) の 3 つのクラスがあります。

要件の状態: 電話帳の現在の完全な内容を名前のアルファベット順に表示するリストを追加して、アプリケーションを拡張します。を実装する必要がありますListModelAbstractListModel独自の実装を開始する前に、クラスを学習することをお勧めします。

唯一の問題は、これを実現するためにアプリケーションを拡張する方法がまったくわからないことです。一晩中オンラインで検索しましたが、これを行う方法が見つかりませんでした。オブジェクトを HashMap ではなく AbstractListModel に格納しようとしましたが、エラーが発生しました。それが何のために、なぜ使用され、どのように使用できるのか正確にはわかりません。次の要件 (ちなみに) は、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 + ".";
}

}
4

1 に答える 1

4

継承を使いすぎている可能性があります。HashMapの代わりにAbstractListModel を使用するのではなく、AbstractListModelを拡張し、HashMap を AbstractListModel のデータの核として持つTelephoneDirectory クラスを保持するクラスを作成することを検討してください。これは、継承ではなく構成によってクラスを拡張することと呼ばれます。

編集: HashMap ではなく TreeMap を使用して、名前と電話記録を名前順に取得できるようにすることも検討してください。また、AbstractListModel クラス内で使用できるように、TelephoneDirectory クラスgetElementAt(int index)とメソッドを指定する必要があります。getSize()

于 2012-03-09T01:58:32.373 に答える