我正在开发一个具有不同行的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
有谁知道问题出在哪里?
答案 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());
}
});