2010-09-23 74 views
1

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

    } 
} 

当我创建该表的一个实例,赛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 

有没有人知道问题出在哪里?

回答

4

嗯,这很正常。

您的选择侦听器在其创建表(其值为零)下创建值tabletest.getSelectedRow()。而且,由于您从未在收听者中更改item的值,因此此收听者只能显示0

如果我是你,我wouold通过类似更换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()); 
} 
+0

好了,这是行不通的:如果我点击第二排和第三排的消息输出是正确的:“点击该行1”和“点击的行是2”。但是,当我点击第一行而不是给我0它再次给我2 – Anto 2010-09-23 16:18:39

+0

另一种方法是从表中向听众询问选择了哪些行。 – Carlos 2010-09-23 21:48:18

+4

'e.getFirstIndex()'不是很可靠。使用table.getSelectedRow() - 它更稳定。 – 2010-09-24 14:17:37

4

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

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

2

做的更简单的方法,如下:

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

你为这种感觉简单而付出的代价是从听众到表格 - 通常不是你想要的。此外,您忘记了isAdjusting的检查:通常,您想忽略这样的事件。 – kleopatra 2012-10-10 08:44:55