Java 在JTable中实现选择侦听器时出现问题
我正在开发一个具有不同行的JTable。我想将事件与此表中的行选择相关联。我使用了以下选择类来提供表选择的行为:Java 在JTable中实现选择侦听器时出现问题,java,swing,jtable,Java,Swing,Jtable,我正在开发一个具有不同行的JTable。我想将事件与此表中的行选择相关联。我使用了以下选择类来提供表选择的行为: public class TableSelectionListener implements ListSelectionListener{ public Integer item; public TableSelectionListener(Integer item){ this.dialog = item; } public void valueChanged
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
有人知道问题出在哪里吗?嗯,这很正常 您的选择侦听器是在其创建表中使用
tablettest.getSelectedRow()的值创建的(该值为零)。而且,由于您从未更改侦听器中项
的值,因此此侦听器只能显示0
如果我是你,我会将valueChanged()
方法替换为以下内容(尽管它未经测试,而且我记得混合视图和模型行值时有时会发生奇怪的事情):
这很正常
您的选择侦听器是在其创建表中使用tablettest.getSelectedRow()的值创建的(该值为零)。而且,由于您从未更改侦听器中项
的值,因此此侦听器只能显示0
如果我是你,我会将valueChanged()
方法替换为以下内容(尽管它未经测试,而且我记得混合视图和模型行值时有时会发生奇怪的事情):
首先,在更改选择的同时,获取多个ListSelectionEvent
s是完全正常的。您可以使用该方法确定选择何时结束(它将返回false
)
其次,不需要用行号构造TableSelectionListener
。调用valueChanged
方法时,可以分别使用e.getFirstIndex()
和e.getLastIndex()
获取第一行/最后一行的索引(请记住,可能要在表中选择多行,除非禁用该功能),更改选择时,获取多个ListSelectionEvent
s是完全正常的。您可以使用该方法确定选择何时结束(它将返回false
)
其次,不需要用行号构造TableSelectionListener
。调用valueChanged
方法时,您可以分别使用e.getFirstIndex()
和e.getLastIndex()
获取第一行/最后一行的索引(请记住,可能要在表中选择多行,除非禁用该功能)
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
System.out.println("e...."+table.getSelectedRow());
}
});
一种更简单的方法如下:
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
System.out.println("e...."+table.getSelectedRow());
}
});
嗯,它不起作用:如果我单击第二行和第三行,消息输出是正确的:“单击的行是1”和“单击的行是2”。但是,当我单击第一行而不是给我0时,它又给了我2。另一种方法是从表中询问侦听器选择了哪些行。e.getFirstIndex()
不是很可靠。使用table.getSelectedRow()-它更稳定。添加较晚。选择模型“记住”所选的最低和最高行。在按住shift键并单击的情况下,需要此信息,其中选择了之间的所有行。方法名称是一个警告。它不起作用:如果我单击第二行和第三行,消息输出是正确的:“单击的行是1”和“单击的行是2”。但是,当我单击第一行而不是给我0时,它又给了我2。另一种方法是从表中询问侦听器选择了哪些行。e.getFirstIndex()
不是很可靠。使用table.getSelectedRow()-它更稳定。添加较晚。选择模型“记住”所选的最低和最高行。在按住shift键并单击的情况下,需要此信息,其中选择了之间的所有行。方法名称是一个警告。您为这种简单性付出的代价是从侦听器耦合到表-通常不是您想要的。此外,您忘记了检查isAdjusting:通常,您希望忽略此类事件。您为这种简单性付出的代价是从侦听器耦合到表-通常不是您想要的。此外,您忘记了检查isAdjusting:通常,您希望忽略此类事件。