Java Jlist限制所选元素的最大数量
我有一个包含任意数量元素的jlist。我想限制用户仅从列表中选择3个元素。到目前为止,除了制作一个列表选择监听器并从中编码之外,我还没有找到任何真正方便的方法 在Swing中是否有内置方式或最佳实践?请查看。及 此接口表示显示具有稳定索引的值列表的任何组件的当前选择状态。选择被建模为一组间隔,每个间隔表示所选列表元素的连续范围。修改所选区间集的方法均采用一对表示闭合区间的索引index0和index1,即区间包括index0和index1 您可以将DefaultListSelectionModel子类化,并覆盖addSelectionIntervalint index0、int index1和setSelectionIntervalint index0、int index1方法。不幸的是,DefaultListSelectionModel的被标记为private,因此如果不恢复到反射,您将无法轻松访问表示所选行的位集。除了遍历从getMinSelectionIndex到getMaxSelectionIndex的所有行并查询isSelectedIndex之外,似乎没有其他方法可以获取选择计数。请查看。及 此接口表示显示具有稳定索引的值列表的任何组件的当前选择状态。选择被建模为一组间隔,每个间隔表示所选列表元素的连续范围。修改所选区间集的方法均采用一对表示闭合区间的索引index0和index1,即区间包括index0和index1Java Jlist限制所选元素的最大数量,java,swing,listselectionlistener,Java,Swing,Listselectionlistener,我有一个包含任意数量元素的jlist。我想限制用户仅从列表中选择3个元素。到目前为止,除了制作一个列表选择监听器并从中编码之外,我还没有找到任何真正方便的方法 在Swing中是否有内置方式或最佳实践?请查看。及 此接口表示显示具有稳定索引的值列表的任何组件的当前选择状态。选择被建模为一组间隔,每个间隔表示所选列表元素的连续范围。修改所选区间集的方法均采用一对表示闭合区间的索引index0和index1,即区间包括index0和index1 您可以将DefaultListSelectionMode
您可以将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键进行多项选择时,此解决方案不起作用。