Обработка события изменения выбора JTable: динамический поиск исходной таблицы

Я реализовал свой собственный обработчик событий и добавил его в модель выбора таблицы:

table.getSelectionModel().addListSelectionListener(event);

И реализовал метод для "события" (упомянутый выше):

public void valueChanged(ListSelectionEvent e) {
    log.debug("value changed");
}

К сожалению, событие срабатывает дважды, если я делаю выбор, и кажется невозможным найти связанную таблицу, потому что e.getSource предоставляет javax.swing.DefaultListSelectionModel.

Отсюда мои вопросы:

1) Почему он срабатывает дважды, хотя eventListener регистрируется только один раз?

2) Как я могу найти таблицу, для которой применяется выбор? DefaultListSelectionModel, похоже, не предлагает никакого getSource() или подобного.

Большое спасибо!


person MrG    schedule 17.12.2008    source источник


Ответы (3)


1) Я думаю, вы обнаружите, что он срабатывает один раз для отмены выбора старого выбора и один раз для выбора нового выбора. Если вы зарегистрируете детали события, вы должны увидеть, что именно происходит. Я не помню подробностей, так что, возможно, это неправильно. В любом случае вы должны иметь возможность вызывать getValueIsAdjusting() для события и использовать только последнее в цепочке (т.е. когда оно возвращает false).

2) Обычно вам это не нужно, но, насколько я знаю, единственный способ сделать это - создать свой Listener специально для таблицы (т.е. передать таблицу конструктору и запомнить ее).

person Draemon    schedule 17.12.2008
comment
Большое спасибо, это было именно то, что я искал! getValueIsAdjusting() должно быть ложным, как вы написали. - person MrG; 19.12.2008

Спасибо, Дреймон.. Работает нормально....

Наш Кодекс

vMachinesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

    public void valueChanged(ListSelectionEvent lse) {
        if (!lse.getValueIsAdjusting()) {
            System.out.println("Selection Changed");
        }
    }
});

Спасибо

Команда ТФ

person Think Force    schedule 17.04.2012

Поскольку несколько JTable (или других компонентов, как я предполагаю) могут использовать одну и ту же модель выбора, нет смысла запрашивать связанный JTable из события. По той же причине вы не можете получить JTable из TableModel. Как предлагает Дреймон, сохраните ссылку на JTable в своем классе слушателя (или сделайте его доступным для него).

person Dave Ray    schedule 17.12.2008