在JTable中实现选择侦听器时出现问题

时间:2010-09-23 14:00:19

标签: java swing jtable

我正在开发一个具有不同行的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);

    }
}

当我创建此表的实例时,sai 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 个答案:

答案 0 :(得分:4)

嗯,这很正常。

您的选择侦听器在其创建表(为零)时创建的值为tabletest.getSelectedRow()。并且,由于您永远不会更改侦听器中item的值,因此此侦听器fcan仅显示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());
}

答案 1 :(得分:4)

首先,获取多个ListSelectionEvent是完全正常的,而选择正在改变。您可以使用getValueIsAdjusting方法确定选择何时结束(它将返回false)。

其次,没有必要使用行号构建TableSelectionListener。调用valueChanged方法时,您可以使用e.getFirstIndex()和{{1来获取第一个/最后一个选定行的索引(记住它可能在表中选择多行,除非您禁用它)分别。

答案 2 :(得分:2)

更简单的方法如下:

table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {
        System.out.println("e...."+table.getSelectedRow());
    }
});