Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JTable中实现选择侦听器时出现问题_Java_Swing_Jtable - Fatal编程技术网

Java 在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

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

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

嗯,这很正常

您的选择侦听器是在其创建表中使用
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:通常,您希望忽略此类事件。