Jlist限制所选元素的最大数量

时间:2012-03-29 00:39:45

标签: java swing

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

Swing中是否有内置方式或最佳实践?

3 个答案:

答案 0 :(得分:5)

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

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);
    }
}

答案 1 :(得分:0)

看看ListSelectionModel。和DefaultListSelectionModel

  

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

可以继承DefaultListSelectionModel并覆盖addSelectionInterval(int index0, int index1)setSelectionInterval(int index0, int index1)方法。不幸的是,DefaultListSelectionModel的{​​{3}}被标记为私有,因此您不能(很容易地,不返回反射)访问代表所选行的位集。似乎没有办法获得选择计数,除了遍历从getMinSelectionIndex()getMaxSelectionIndex()的所有行并查询isSelectedIndex()

答案 2 :(得分:0)

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

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

int indices[];

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

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
         */
      }
   }
}