JList使用HashMap键(String)作为显示?

时间:2017-09-21 23:32:50

标签: java swing

我已经自学了几个月的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);

1 个答案:

答案 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;