我已经自学了几个月的Java并遇到了挑战。我正在制作联系人列表申请表。我选择使用 HashMap<String, Contact>
作为联系人的存储空间。我遇到的挑战是我对Swing的不熟悉。我正在尝试第一次使用JList。我有JList可以处理正常的字符串数组,但现在我想使用HashMap中的 Key
值来显示JList。
我已经在其他地方读过自定义ListModel
会做的事情,但我没有找到具体的内容。 oracle文档How to Use Lists在其示例中使用DefaultListModel。我读过使用AbstractListModel或ListModel是正确方向的步骤。到目前为止,有三个主要类别:
班级联系
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();
}
}
正确指出任何真正的观点都受到高度赞赏。与此同时,我会一直在寻找。
编辑:已更新&amp;回答
以下是相关的更新代码位。用户carmickr建议我使用DefaultListModel处理地址簿HashMap中的数据。
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);
答案 0 :(得分:1)
我在创建自定义列表模型时遇到困难,该模型从位于类Book中的HashMap中获取String键。
您无需创建自定义模型。您可以将每个Contact
对象添加到DefaultListModel
。使用模型的关键是模型包含所有数据,您使用模型的方法来访问数据。
然后让JList
工作的最简单方法是在toString()
对象中实现Contact
方法,以返回您希望在{{1}中看到的属性}。
编辑:已更新&amp;回答强>
以下是相关的更新代码位。用户carmickr建议我使用DefaultListModel处理地址簿HashMap中的数据。
JList
然后在UserInterface构造函数中:
private DefaultListModel<Set<String>> model;
private JList<Set<String>> contactList;