[解決済み] HashMapのキー(String)を表示としたJList?
質問
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);
関連
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み] 解決済み】Javaが「型をインスタンス化できない」というエラーを返す [重複] [重複]
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み] ハッシュマップのキーを指定して、値を更新するには?
-
[解決済み] Java Hashmap。値からキーを取得する方法は?
-
[解決済み] HashMapのキー存在チェック
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】Java、"変数名 "を変数に解決することができない
-
[解決済み】エラー「No enclosing instance of type Foo is accessible」の原因と修正方法について教えてください。
-
[解決済み] メソッドがスーパータイプのメソッドをオーバーライドまたは実装していない - Overrideの場合
-
[解決済み】Mockitoでモックからチェックされた例外を投げる
-
[解決済み】なぜjava.io.Fileにはcloseメソッドがないのでしょうか?
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み】koch snowflake java recursion