Ограничение Jlist Максимальное количество выбранных элементов - PullRequest
1 голос
/ 29 марта 2012

У меня есть jlist с произвольным количеством элементов.Я хотел бы ограничить пользователей, выбирая только 3 элемента из списка.До сих пор я не нашел действительно удобного способа сделать это, кроме как сделать прослушиватель для выбора списка и оттуда написать код.

Есть ли какой-нибудь встроенный способ или лучший метод для Swing?*

Ответы [ 3 ]

5 голосов
/ 29 марта 2012

Реализуйте свою индивидуальную модель выбора.например, как показано ниже.

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);
    }
}
0 голосов
/ 29 марта 2012

Я пытался решить эту проблему, но пока я просто могу определить, достигает ли он предела, но все же разрешает выбор.Может быть, кто-то может улучшить мой код.

Вот что я сделал.Я объявил индексы целочисленного массива.

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
         */
      }
   }
}
0 голосов
/ 29 марта 2012

Посмотрите на ListSelectionModel DefaultListSelectionModel

Этот интерфейс представляет текущее состояние выбора для любого из компонентов, которые отображают список значений со стабильными индексами.Выбор моделируется как набор интервалов, каждый интервал представляет непрерывный диапазон выбранных элементов списка.Все методы для изменения набора выбранных интервалов используют пару индексов, index0 и index1, которые представляют собой закрытый интервал, то есть интервал включает в себя как index0, так и index1.

Вы можете подкласс DefaultListSelectionModel и переопределить методы addSelectionInterval(int index0, int index1) и setSelectionInterval(int index0, int index1).К сожалению, внутренние элементы из DefaultListSelectionModel помечены как частные, поэтому вы не можете (легко, не возвращаясь к отражению) получить доступ к набору битов, который представляет выбранные строки.Кажется, что нет способа получить счетчик выбора, кроме как перебирать все строки от getMinSelectionIndex() до getMaxSelectionIndex() и запрашивать isSelectedIndex().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...