проблема при реализации слушателя выбора в JTable - PullRequest
1 голос
/ 23 сентября 2010

Я разрабатываю JTable с разными строками.Я хотел бы связать событие с выбором строки в этой таблице.Я использовал следующий класс выбора для обеспечения поведения при выборе таблицы:

public class TableSelectionListener implements ListSelectionListener{

public Integer item;    

public TableSelectionListener(Integer item){
    this.dialog = item;
}

public void valueChanged(ListSelectionEvent e) {

    System.out.println("The row clicked is "+item);

    }
}

Когда я создаю экземпляр этой таблицы, например, tabletest , я добавил следующий фрагмент кода:

tabletest.getSelectionModel().addListSelectionListener(new TableSelectionListener(tabletest.getSelectedRow());

Проблема в том, что когда я щелкаю один раз один раз, вместо того, чтобы один раз получить соответствующее сообщение, я получаю одно и то же сообщение несколько раз, предлагая повторить действия несколько раз.Например:

The row clicked is 0
The row clicked is 0
The row clicked is 0
The row clicked is 0

Кто-нибудь знает, где может быть проблема?

Ответы [ 3 ]

4 голосов
/ 23 сентября 2010

Во-первых, совершенно нормально получить несколько ListSelectionEvent с, пока выбор изменяется.Вы можете использовать метод getValueIsAdjusting, чтобы определить, когда выбор закончился (он вернет false).

Во-вторых, нет необходимости создавать TableSelectionListener с номером строки,Когда вызывается ваш метод valueChanged, вы можете получить индекс первой / последней выбранной строки (помните, что возможно выбрать несколько строк в таблице, если вы не отключите это), используя e.getFirstIndex() и e.getLastIndex() соответственно.*

4 голосов
/ 23 сентября 2010

Ну, это нормально.

Ваш слушатель выбора создается со значением tabletest.getSelectedRow() в его таблице создания (которая равна нулю). И, поскольку вы никогда не изменяете значение item в своем слушателе, этот слушатель может отображать только 0.

Если бы я был вами, я бы заменил метод valueChanged() на что-то вроде (хотя он не проверен, и я помню, что странные вещи иногда случаются при смешивании значений строк вида и модели):

public void valueChanged(ListSelectionEvent e) {
    if(!e.getValueIsAdjusting()) // added as sometimes, multiple events are fired while selection changes
        System.out.println("The row clicked is "+e.getFirstIndex());
}
2 голосов
/ 10 октября 2012

Более простой способ сделать это выглядит следующим образом:

table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {
        System.out.println("e...."+table.getSelectedRow());
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...