Jlist限制最大数量选定元素

我有一个包含任意数量元素的jlist。 我想限制用户只从列表中选择3个元素。 到目前为止,除了从那里制作列表选择监听器和编码之外,我还没有找到任何非常方便的方法。

在Swing中有任何内置方式或最佳实践吗?

实施您的自定义选择模型。 例如,如下所示。

public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setSize(800, 600); JList list = new JList(new Object[]{"111","111","111","111","111","111","111"}); list.setSelectionModel(new MySelectionModel(list, 3)); frame.getContentPane().add(new JScrollPane(list), BorderLayout.CENTER); frame.setVisible(true); } private static class MySelectionModel extends DefaultListSelectionModel { private JList list; private int maxCount; private MySelectionModel(JList list,int maxCount) { this.list = list; this.maxCount = maxCount; } @Override public void setSelectionInterval(int index0, int index1) { if (index1 - index0 >= maxCount) { index1 = index0 + maxCount - 1; } super.setSelectionInterval(index0, index1); } @Override public void addSelectionInterval(int index0, int index1) { int selectionLength = list.getSelectedIndices().length; if (selectionLength >= maxCount) return; if (index1 - index0 >= maxCount - selectionLength) { index1 = index0 + maxCount - 1 - selectionLength; } if (index1 < index0) return; super.addSelectionInterval(index0, index1); } } 

看看ListSelectionModel 。 和DefaultListSelectionModel

此接口表示显示具有稳定索引的值列表的任何组件的选择的当前状态。 选择被建模为一组间隔,每个间隔表示所选列表元素的连续范围。 用于修改所选区间集的方法都采用一对索引index0和index1,它们表示闭合区间,即区间包括index0和index1。

可以 DefaultListSelectionModel并覆盖addSelectionInterval(int index0, int index1)setSelectionInterval(int index0, int index1)方法。 不幸的是, DefaultListSelectionModel的内部被标记为私有,因此您不能(很容易地,没有恢复到reflection)访问代表所选行的位集。 除了从getMinSelectionIndex()遍历所有行到getMaxSelectionIndex()并查询isSelectedIndex()之外,似乎没有办法获得选择计数。

我试图解决这个问题,但到目前为止,我只能确定它是否达到极限,但仍允许选择。 也许有人可以改进我的代码。

这就是我做的。 我声明了一个整数数组索引。

 int indices[]; 

然后在listselectionlistener上 ,我将选定的索引存储到数组中,然后根据最大选择对其进行validation。

 public class ListListener implements ListSelectionListener{ public void valueChanged(ListSelectionEvent e){ indices = list.getSelectedIndices(); if(indices.length > max){ System.out.println("you can only select " + max + " items"); /* place a code here that prevents further more selection or still allows selection only to deselect the last selected item/element */ } } }