【问题标题】:<JTable>.getSelectedRow() is returning -1<JTable>.getSelectedRow() 返回 -1
【发布时间】:2012-09-30 18:52:40
【问题描述】:

我在JTable 上写了一个“双击”事件。我的 JTable,即。 myTaskTable 填充了许多具有多列的行。我希望在双击JTable 的行之一时检索行索引。我不确定为什么它总是返回-1 的索引导致异常。我在忽略什么吗?可能出了什么问题?

这就是我从JTable - myTaskTable 中检索所选行的索引的方式

int selRow = myTaskTable.getSelectedRow();

谢谢!

编辑

代码如下:

...
myTaskTable.addMouseListener(this);
...
public void mouseClicked(MouseEvent e)
{
 if(e.getModifiers() == MouseEvent.BUTTON1_MASK)
 {
   if(e.getClickCount() == 2)
   {
     e.consume();
     int selRow = myTaskTable.getSelectedRow();
     System.out.println("GridReport double clicked on row="+selRow);
    }
  }
}

【问题讨论】:

  • 我认为您的问题在于您没有向我们展示的代码。我们猜测未显示代码中的错误的能力非常有限。
  • 作为参考,这里有一个workign example
  • e.consume() 是干什么用的?另外,myTaskTable 变量是否引用了实际上正在显示的 JTable?如需更好的帮助,请考虑创建和发布sscce。这将需要一些努力,但通常是值得的。

标签: java indexing jtable


【解决方案1】:

使用事件获取行索引,而不是表选择:

final int selectedRowIndex = table.rowAtPoint(mouseEvent.getPoint());
// If the rows are sorted or filtered
final int modelRowIndex = table.convertRowIndexToModel(selectedRowIndex);

getSelectedRow() 不适用于多选行(允许多选),因为它总是返回"the index of the first selected row"

【讨论】:

    【解决方案2】:

    您是否尝试将e.consume(); 作为最后一条语句?

    public void mouseClicked(MouseEvent e){
     if(e.getModifiers() == MouseEvent.BUTTON1_MASK){
       if(e.getClickCount() == 2){
         int selRow = myTaskTable.getSelectedRow();
         System.out.println("GridReport double clicked on row="+selRow);
         e.consume();
        }
      }
    }
    

    当您完成响应式代码时,通常会调用 e.consume();。这会清除 Event 的依赖关系,因此它也可能会清除选定的 Row。

    【讨论】: