首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在项中添加名称/对象对(JList)

在项中添加名称/对象对(JList)
EN

Stack Overflow用户
提问于 2013-04-26 12:37:51
回答 2查看 727关注 0票数 0

我试图在Java应用程序中使用JList实现多选择选项,下面是我的代码

代码语言:javascript
复制
// 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()标记中的方法,这样用户就可以查看名称,并且当他选择名称时,通过动作监听器,我们可以获得所选项目的对象。

EN

回答 2

Stack Overflow用户

发布于 2013-04-27 14:18:36

与其用JList数组实例化JList,不如用您选择的对象数组实例化它。确保您重写了toString方法,因为这就是将要绘制的内容。例如:

代码语言:javascript
复制
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模型中,如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
     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方法中。有关详细说明,请参阅以下教程:

  • 如何使用列表
  • JLists、数据模型和单元呈现器
票数 1
EN

Stack Overflow用户

发布于 2013-04-27 13:54:21

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16236668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档