Я реализовал свой собственный обработчик событий и добавил его в модель выбора таблицы:
table.getSelectionModel().addListSelectionListener(event);
И реализовал метод для «события» (упомянутого выше):
public void valueChanged(ListSelectionEvent e) {
log.debug("value changed");
}
К сожалению, событие срабатывает дважды, если я выберу случайный выбор и не представляется возможным найти связанную таблицу, потому что e.getSource предоставляет javax.swing.DefaultListSelectionModel.
Отсюда мои вопросы:
1) Почему он срабатывает дважды, хотя eventListener регистрируется только один раз?
2) Как мне найти таблицу, для которой применяется выбор? DefaultListSelectionModel, похоже, не предлагает никаких getSource () или аналогичных.
Большое спасибо!
1) Я думаю, вы обнаружите, что он срабатывает один раз для отмены выбора старого выбора и один раз для выбора нового выбора. Если вы регистрируете подробности события, вы должны точно видеть, что происходит. Я не могу вспомнить детали, так что, возможно, это неправильно. В любом случае вы должны иметь возможность вызывать getValueIsAdjusting () для события и использовать только последний в цепочке (т.е. когда он возвращает false).
2) Обычно в этом нет необходимости, но AFAIK единственный способ сделать это - создать свой Listener специально для таблицы (т.е. передать таблицу конструктору и запомнить ее).
Поскольку более чем один JTable (или другой компонент, который я предполагаю) могут использовать одну и ту же модель выбора, нет смысла запрашивать связанный JTable из события. По этой же причине вы не можете получить JTable из TableModel. Как предлагает Дрэмон, сохраните ссылку на JTable в (или сделайте ее доступной для) вашего класса слушателя.
Спасибо Draemon .. Он отлично работает ....
vMachinesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent lse) {
if (!lse.getValueIsAdjusting()) {
System.out.println("Selection Changed");
}
}
});
Спасибо
Команда TF
Большое спасибо, это именно то, что я искал! getValueIsAdjusting () должно быть ложным, как вы написали.