Обработка событий изменения выбора JTable: динамически находить исходную таблицу - PullRequest
3 голосов
/ 17 декабря 2008

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

table.getSelectionModel().addListSelectionListener(event);

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

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

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 17 апреля 2012

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

Наш код

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

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

Спасибо.

TF Team

5 голосов
/ 17 декабря 2008

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

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

3 голосов
/ 17 декабря 2008

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

...