Что именно делает ListSelectionModel.insertIndexInterval ()? - PullRequest
3 голосов
/ 05 марта 2012

Я пытаюсь написать собственную реализацию ListSelectionModel , и в настоящее время я застрял при попытке реализовать insertIndexInterval.Я не понимаю результат этого метода в реализации Sun / Oracle DefautListSelectionModel.Вот пример:

ListSelectionModel model = new DefaultListSelectionModel();
model.setSelectionInterval(3, 5);
model.addListSelectionListener(new ListSelectionListener()
{
    public void valueChanged(ListSelectionEvent e)
    {
        System.out.println("Changed range reported by event: " +
            e.getFirstIndex() + "-" + e.getLastIndex());
    }
});

System.out.print("Selected indices before insert: ");
for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++)
    if (model.isSelectedIndex(i)) System.out.print(i + " ");
System.out.println();

model.insertIndexInterval(3, 3, true);  

System.out.print("Selected indices after insert: ");
for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++)
    if (model.isSelectedIndex(i)) System.out.print(i + " ");
System.out.println();

Когда вы запустите этот код, вы получите такой вывод:

Selected indices before insert: 3 4 5 
Changed range reported by event: 3-8
Selected indices after insert: 3 4 5 6 7 8 

Таким образом, первоначальный выбор был 3-5, и он был расширен до 3-8при вставке новых индексов.Но 3-5 уже были выбраны, поэтому реальное изменение составляет всего 6-8, так почему же событие говорит мне, что диапазон 3-8 был изменен?Это еще более запутанно, когда вы меняете вызов insertIndexInterval следующим образом:

model.insertIndexInterval(3, 3, false);  

Теперь вывод такой:

Selected indices before insert: 3 4 5 
Changed range reported by event: 5-8
Selected indices after insert: 3 4 5 6 7 8 

Я понятия не имею, почему зарегистрированное изменение равно 5-8.

Документация по API этого метода слишком коротка, чтобы понять, что там происходит.Особенно этот параметр before является для меня загадкой, поскольку он никогда не влияет на выбор, но, похоже, он оказывает некоторое влияние на событие, а также на индексы отведений и привязок.

Я даже не могу написатьмодульный тест для моей реализации, потому что я просто не знаю ожидаемых результатов.

Так что кто-то может объяснить подробно, что делает этот метод (и особенно флаг before) и какие побочные эффекты он имеет намодель выбора и ListSelectionEvent?

Ответы [ 2 ]

4 голосов
/ 05 марта 2012

Используется при добавлении новых данных в модель данных (поэтому текущие индексы выбора должны быть перемещены). Если 2 означает «недавно добавленный и выбранный», то ваш результат будет:

[0,0,0,1,1,1,0,0,0,0] == [3A,4,5L]
-> add after [0,0,0,1,2,2,2,1,1,0] == [3A,4,5,6,7,8L]
-> add before [0,0,0,2,2,2,1,1,1,0] == [3,4,5,6A,7,8L]

То, что вы видите здесь, является функцией * DefaultListSelectionModel - добавление индексов внутри текущего выделения автоматически расширяет выделение.

Начните, например, с выбранного индекса 1, затем вставьте три строки в индекс три:

[1,0,0,0,0,0,0,0,0,0]
-> add after [1,0,0,0,0,0,0,0,0,0]

Обратите внимание, что ваше представление выбора вводит в заблуждение, нулей на самом деле нет. Лучший способ напечатать состояние выбора:

private static void printSelection(ListSelectionModel model) {
    System.out.print("[");
    for (int i = model.getMinSelectionIndex(); i <= model.getMaxSelectionIndex(); i++) {
        if(i > model.getMinSelectionIndex()) {
            System.out.print(",");
        }
        if(model.isSelectedIndex(i)) {
            System.out.print(i);
            if(i == model.getAnchorSelectionIndex()) {
                System.out.print("A");
            }
            if(i == model.getLeadSelectionIndex()) {
                System.out.print("L");
            }
        }
    }
    System.out.println("]");
}

*) Документация DefaultListSelectionModel # insertIndexInterval отличается от интерфейса, см. Также http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4700643 и http://java.net/jira/browse/SWINGX-272

0 голосов
/ 05 марта 2012

РЕДАКТИРОВАТЬ Я надеюсь, что мы говорим о JList, а не о JTable, тогда остальное в уведомлении

Можете ли вы использовать это SSCCE и отредактировать свой вопрос с помощью кода, четко отражающего ваши проблемы с помощью ListSelectionModel, ListeSelectionMode и обходного решения соответствующего кода, notice у этого Listener есть только один dimension или directional,

import java.awt.Component;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Ctrl_Down_JList {

    private static void createAndShowUI() {
        String[] items = {"Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"};
        JList myJList = new JList(items) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void processMouseEvent(MouseEvent e) {
                int modifiers = e.getModifiers() | InputEvent.CTRL_MASK;
                // change the modifiers to believe that control key is down
                int modifiersEx = e.getModifiersEx() | InputEvent.CTRL_MASK;
                // can I use this anywhere?  I don't see how to change the modifiersEx of the MouseEvent
                MouseEvent myME = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), modifiers, e.getX(),
                        e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton());
                super.processMouseEvent(myME);
            }
        };
        JFrame frame = new JFrame("Ctrl_Down_JList");
        frame.getContentPane().add(new JScrollPane(myJList));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...