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

Java Jlist限制所选元素的最大数量,java,swing,listselectionlistener,Java,Swing,Listselectionlistener,我有一个包含任意数量元素的jlist。我想限制用户仅从列表中选择3个元素。到目前为止,除了制作一个列表选择监听器并从中编码之外,我还没有找到任何真正方便的方法 在Swing中是否有内置方式或最佳实践?请查看。及 此接口表示显示具有稳定索引的值列表的任何组件的当前选择状态。选择被建模为一组间隔,每个间隔表示所选列表元素的连续范围。修改所选区间集的方法均采用一对表示闭合区间的索引index0和index1,即区间包括index0和index1 您可以将DefaultListSelectionMode

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

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

请查看。及

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

您可以将DefaultListSelectionModel子类化,并覆盖addSelectionIntervalint index0、int index1和setSelectionIntervalint index0、int index1方法。不幸的是,DefaultListSelectionModel的被标记为private,因此如果不恢复到反射,您将无法轻松访问表示所选行的位集。除了遍历从getMinSelectionIndex到getMaxSelectionIndex的所有行并查询isSelectedIndex之外,似乎没有其他方法可以获取选择计数。

请查看。及

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


您可以将DefaultListSelectionModel子类化,并覆盖addSelectionIntervalint index0、int index1和setSelectionIntervalint index0、int index1方法。不幸的是,DefaultListSelectionModel的被标记为private,因此如果不恢复到反射,您将无法轻松访问表示所选行的位集。除了迭代从getMinSelectionIndex到getMaxSelectionIndex的所有行并查询isSelectedIndex之外,似乎没有其他方法来获取选择计数。

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

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

实现定制的选择模型。例如,如下所示

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

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

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

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

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

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

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

chenyi1976通过让选择模型保留对JList的引用,解决了知道选择了哪些行的问题。这是可行的…chenyi1976通过让选择模型保留对JList的引用,解决了知道选择了哪些行的问题。这是可行的…当按下SHIFT键进行多项选择时,此解决方案不起作用。当按下SHIFT键进行多项选择时,此解决方案不起作用。