новый добавленный элемент в верхней части JList выбирается автоматически - PullRequest
2 голосов
/ 02 мая 2020

Я создаю JList с использованием Swing, я могу отображать и выбирать несколько элементов, а также я могу добавить новый элемент к нему. Однако, когда я выбираю первый элемент списка и добавляю новый в начало, я получаю два выбранных элемента (старый и новый), но когда я изменяю режим выбора на одиночный выбор работает нормально, возможно ли предотвратить этот автоматический c выбор и просто оставить старый выбранный , используя режим выбора нескольких интервалов ? Я использовал эту ссылку , которая содержит пример использования DataEventListner , но мне не удалось найти решение. Любая помощь, пожалуйста? Вот мой список:

 public static void main(String args[]) {
    String labels[] = { "A", "B", "C", "D", "E", "F", "G", "H" };
    JFrame frame = new JFrame("Selecting JList");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final DefaultListModel model = new DefaultListModel();
    for (int i = 0, n = labels.length; i < n; i++) {
        model.addElement(labels[i]);
    }
    JList jlist = new JList(model);
    jlist.setSelectionMode(
            ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    JScrollPane scrollPane1 = new JScrollPane(jlist);
    frame.add(scrollPane1, BorderLayout.CENTER);
    JButton jb = new JButton("add F");
    jb.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent actionEvent) {
            model.add(0, "First");
        }
    });
    frame.add(jb,BorderLayout.SOUTH);
    frame.setSize(640, 300);
    frame.setVisible(true);
}

Ответы [ 3 ]

2 голосов
/ 02 мая 2020

Я вижу, что вы в основном скопировали код по ссылке в своем вопросе. Этот пример касается только добавления одного элемента в JList при нажатии JButton. Это не касается выбора JList. Я не думаю, что автор этого примера рассматривал, что происходит, когда пользователь выбирает один или несколько элементов в JList до , щелкнув JButton.

, который мне удалось воспроизвести. поведение, описанное в вашем вопросе. Это может быть ошибка в реализации JList или ListSelectionModel. Я исправил это, добавив код в метод actionPerformed(), который обрабатывает любые существующие выборки JList.

Вот моя модифицированная версия метода actionPerformed(). Обратите внимание, что весь остальной код не изменился. Сначала я сохраняю индексы всех выбранных строк. Затем я очищаю существующие выборы. Затем я добавляю новый элемент в JList. Теперь мне нужно повторно выбрать строки, которые были выбраны до того, как я добавил новый элемент. Но обратите внимание, что мне нужно увеличивать каждый индекс на единицу, потому что есть новый элемент с индексом 0 (ноль).

jb.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent actionEvent) {
        int[] indices = jlist.getSelectedIndices();
        jlist.getSelectionModel().clearSelection();
        model.add(0, "First");
        for (int index : indices) {
            jlist.getSelectionModel().addSelectionInterval(index + 1, index + 1);
        }
    }
});
1 голос
/ 02 мая 2020

Из документации JList # setSelectionMode (int) :

ListSelectionModel.SINGLE_SELECTION - Одновременно может быть выбран только один индекс списка. В этом режиме setSelectionInterval и addSelectionInterval эквивалентны, заменяя текущее выделение индексом, представленным вторым аргументом («ведущим»).

try jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

0 голосов
/ 02 мая 2020

Вы можете добавить это в свой jb.addActionListner ():

int x = jlist.getSelectedIndex();
    jlist.clearSelection();
    jlist.setSelectedIndex(x);

Это должно работать так, как вы хотите!

...