【问题标题】:Java Multi Select - Add name / object pair in items (JList)Java Multi Select - 在项目中添加名称/对象对(JList)
【发布时间】:2013-04-26 12:37:51
【问题描述】:

我正在尝试使用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() 标记中一样,以便用户查看名称,当他选择它时,使用动作侦听器我们可以获得所选项目的对象。

【问题讨论】:

  • 请问possible for me to associate an object with each item and get it when user selects it是什么@
  • 请查看我有问题的更新。
  • 您在 Mac OS 9 上运行的是什么版本的 Swing?

标签: java swing


【解决方案1】:

不要使用String 数组来实例化@987654321@,而是使用您选择的对象数组来实例化它。确保覆盖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 方法中。有关详细说明,请查看以下教程:

【讨论】:

    【解决方案2】:

    查看 ListModel 和 JList 中的 getModel() 方法。您可以使用 getElementAt(index)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多