1. ホーム
  2. java

[解決済み] HashMapのキー(String)を表示としたJList?

2022-02-15 13:45:42

質問

Javaを独学で勉強して数ヶ月になりますが、ある難題にぶつかりました。私は連絡先リストのアプリケーションを作っています。私は使用することを選択しました HashMap<String, Contact> を連絡先のストレージとして使用します。私が直面している問題は、Swingに慣れていないことです。私は初めてJListを使おうとしています。JListは文字列の普通の配列で動作するようにしましたが、今度は Key の値は、JList の表示に HashMap から使用されます。

他のところで読んだのですが、カスタム ListModel というのがありますが、具体的なものは見つかりませんでした。オラクルのドキュメント リストの使い方 は、その例でDefaultListModelを使用しています。AbstractListModelやListModelを使用するのが正しい方向だと思います。今のところ、主なクラスは3つです。

連絡先クラス

public class Contact {

    private String name;
    private String phoneNumber;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

クラスブック

import java.util.HashMap;
import java.util.Map;

public class Book {

    private Map<String, Contact> addressbook = new HashMap<String, Contact>();

    public Map<String, Contact> getAddressbook() {
        return addressbook;
    }

    public void setAddressbook(Map<String, Contact> addressbook) {
        this.addressbook = addressbook;
    }

}

クラス UserInterface ここで、BookクラスにあるHashMapからStringキーを取得するカスタムリストモデルを作成するのに苦労しているところです。

import java.awt.BorderLayout;

public class UserInterface extends JPanel implements ActionListener {

    private static final long serialVersionUID = 2161244209167568887L;

    // Contact list display
    JList contactList;

    // Menu bar and accompanying menu items
    private JMenuBar menuBar;
    private JMenu menu;
    private JMenuItem newContactMenuButton;
    private JMenuItem exitAppMenuButton;

    // Buttons
    private JButton newContactButton;
    private JButton openContactButton; 
    private JButton deleteContactButton; 

    // Panels to place components into
    private JPanel mainPanel;
    private JPanel buttonPanel; 

    // For message dialogs
    private JFrame messageDialog;

    public UserInterface() {

        // Add the JList
        contactList = new JList(new ContactListModel()); // ??

        // Creating the menu bar and its items
        // Adding ActionListeners to the menu buttons
        menuBar = new JMenuBar();
        menu = new JMenu("File");
        newContactMenuButton = new JMenuItem("New Contact");
        exitAppMenuButton= new JMenuItem("Exit");
        newContactMenuButton.addActionListener(this);
        exitAppMenuButton.addActionListener(this);
        menu.add(newContactMenuButton);
        menu.add(exitAppMenuButton);
        menuBar.add(menu);

        // Creating the Buttons
        // Adding ActionListeners to the buttons
        newContactButton = new JButton("New Contact");
        openContactButton = new JButton("Open Contact");
        deleteContactButton = new JButton("Delete Contact");
        newContactButton.addActionListener(this);
        openContactButton.addActionListener(this);
        deleteContactButton.addActionListener(this);

        // Creating the Panels with Grid Layouts
        mainPanel = new JPanel(new GridLayout());
        buttonPanel = new JPanel(new GridLayout(0, 1));

        // Adding components to the Panels
        mainPanel.add(contactList);
        buttonPanel.add(newContactButton);
        buttonPanel.add(openContactButton);
        buttonPanel.add(deleteContactButton);

        // Adding and aligning the Panels
        setBorder(BorderFactory.createEmptyBorder(45, 45, 45, 45));
        add(mainPanel, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.EAST);

    }

    public void CreateAndShowUI() {
        JFrame frame = new JFrame("Addressbook Application");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new UserInterface());
        frame.setJMenuBar(this.menuBar);
        frame.pack();
        frame.setVisible(true);
    }


    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getSource() == newContactButton) {
            JOptionPane.showMessageDialog(messageDialog, "yaaaay!");
        }

        if (e.getSource() == openContactButton) {
            JOptionPane.showMessageDialog(messageDialog, "yaaaay!");
        }

        if (e.getSource() == deleteContactButton) {

            if(contactList.isSelectionEmpty()) {
                JOptionPane.showMessageDialog(messageDialog, "No contact selected.");

            } else if(!contactList.isSelectionEmpty()) {

                }
            }

        if (e.getSource() == newContactMenuButton) {
            JOptionPane.showMessageDialog(messageDialog, "yaaaay!");
        }

        if (e.getSource() == exitAppMenuButton) {
            System.exit(0);
        }
    }
}

final class ContactListModel extends AbstractListModel {

    Book book = new Book();
    Map<String, Contact> bookList = book.getAddressbook();

    public Object getElementAt(int keys) {
        keys = // ??
        return keys;
    }

    @Override
    public int getSize() {
        return bookList.size();
    }

}

正しい方向へのどんな純粋な指摘も非常にありがたいです。とりあえず、検索を続けてみます。

編集:更新&回答

以下は、関連する更新されたコードの部分です。ユーザーのcarmickrが提案したように、アドレス帳のHashMapからのデータを処理するためにDefaultListModelを使用しました。

private DefaultListModel<Set<String>> model;
private JList<Set<String>> contactList;

そして、UserInterfaceのコンストラクタの中。

// Create the DefaultListModel object
// Add the JList
model = new DefaultListModel<Set<String>>();
model.addElement(book.AB.keySet());
contactList = new JList<Set<String>>(model);

解決方法は?

<ブロッククオート

BookクラスにあるHashMapからStringキーを取得するカスタムリストモデルを作成するのに苦労しています。

カスタムモデルを作成する必要はありません。ただ、それぞれの Contact オブジェクトを DefaultListModel . モデルを使用するポイントは、モデルがすべてのデータを保持し、データにアクセスするためにモデルのメソッドを使用することです。

そうすると、一番シンプルな方法は JList を実装することで、動作させることができます。 toString() メソッドを Contact オブジェクトに表示させたいプロパティを返します。 JList .

EDIT: 更新&回答

以下は、関連する更新されたコードの部分です。ユーザーのcarmickrが提案したように、アドレス帳のHashMapからのデータを処理するためにDefaultListModelを使用しました。

private DefaultListModel<Set<String>> model;
private JList<Set<String>> contactList;

そして、UserInterfaceのコンストラクタの中。

// Create the DefaultListModel object
// Add the JList
model = new DefaultListModel<Set<String>>();
model.addElement(book.AB.keySet());
contactList = new JList<Set<String>>(model);