0

我正在尝试JList在 Java Swing 应用程序中实现多选选项,下面是我的代码

// Create some items to add to the list
        String  listData[] =
        {
            "Item 1",
            "Item 2",
            "Item 3",
            "Item 4"
        };


JList listbox = new JList( listData );

现在,我可以看到多选选项如下所示

在此处输入图像描述

我添加了一个动作侦听器来获取选定的项目,但是现在我只能获取文本"Item 1",但是我是否可以将一个对象与每个项目相关联并在用户选择它时获取它?

更新 :

实际上,我正在尝试对存储项目的方式进行排序,就像在 html Object.getName() 标记中一样,以便用户查看名称,当他选择它时,使用动作侦听器我们可以获得所选项目的对象。

4

2 回答 2

1

不要JListString数组实例化 a ,而是用您选择的对象数组实例化它。确保您覆盖该toString方法,因为这就是将要绘制的内容。例如:

public class Item {

private int id;
private String name;

public Item(int id, String name) {
    this.id = id;
    this.name = name;
}

public int getId() {
    return id;
}

public String getName() {
    return name;
}

@Override
public String toString() {
    return name;
}
}

如果Item是数据模型的一部分,则将其添加到 JList 模型中,如下所示:

public class AppJList extends JFrame {

public AppJList() {
    super("JList model test");
    initUI();
}

public Item[] initModel() {
    Item[] model = new Item[3];
    for (int i = 0; i < model.length; i++) {
        model[i] = new Item(i, "text " + i);
        System.out.println(i);
    }
    return model;
}

public JPanel initMainPanel() {
    JPanel jpanel = new JPanel();
    JList jList = new JList(initModel());
    jList.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent e) {
            if (!e.getValueIsAdjusting()) {
                JList list = ((JList) e.getSource());
                Item selected = (Item) list.getModel().getElementAt(list.getSelectedIndex());
                System.out.println("selected item with id: " + selected.getId());
            }
        }
    });
    jpanel.add(jList);
    return jpanel;
}

public void initUI() {
    this.setPreferredSize(new Dimension(200, 200));
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane().add(new JScrollPane(initMainPanel()));
    this.setLocationByPlatform(true);
    this.pack();
}

public static void main(String[] args) {
    // SwingUtilities.invokeLater
    // or
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            new AppJList().setVisible(true);;
        }
    });
}
}

如果您想更好地控制列表呈现,请添加自定义ListCellRenderer

     jList.setCellRenderer(new ListCellRenderer() {

        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Item toBeRendered = (Item)list.getModel().getElementAt(index);
            return new JLabel(toBeRendered.getId() +":"+toBeRendered.getName());
        }
    });

initMainPanel方法中。有关详细说明,请查看以下教程:

于 2013-04-27T14:18:36.503 回答
0

请参阅 JList 中的 ListModel 和 getModel() 方法。您可以使用 getElementAt(index)

于 2013-04-27T13:54:21.153 回答