Java 滚动JTable头

Java 滚动JTable头,java,swing,Java,Swing,我有一个60行的JTable(固定) 每次事件发生时,该行中的单元格都会更新 NFC读卡器在卡上写入数据时触发该事件。这种情况每2或3秒发生一次 如果卡写入正确或不正确,jTable将更新结果(写入,ERRO) 将JTable移动到该位置的功能仅接收行号 滚动条现在移动到该行位置 问题是:在几行更新之后,甚至其他行的标题也会出现在所选焦点行的顶部 如下图所示 这是我已经使用过的代码。他们都做同样的事 //First code tblViewCsv.requestFocus(); tblView

我有一个60行的JTable(固定)

每次事件发生时,该行中的单元格都会更新

NFC读卡器在卡上写入数据时触发该事件。这种情况每2或3秒发生一次

如果卡写入正确或不正确,jTable将更新结果(写入,ERRO)

将JTable移动到该位置的功能仅接收行号

滚动条现在移动到该行位置

问题是:在几行更新之后,甚至其他行的标题也会出现在所选焦点行的顶部

如下图所示

这是我已经使用过的代码。他们都做同样的事

//First code
tblViewCsv.requestFocus();
tblViewCsv.changeSelection(rownumber, 0, false, false);

//2nd code
tblViewCsv.getSelectionModel().setSelectionInterval(rownumber, rownumber);
tblViewCsv.scrollRectToVisible(new Rectangle(tblViewCsv.getCellRect(rownumber, 0, true)));

 //3rd code
 JViewport viewport = (JViewport) tblViewCsv.getParent();
 Rectangle rect = tblViewCsv.getCellRect(rownumber, 0, true);
 Rectangle viewRect = viewport.getViewRect();
 rect.setLocation(rect.x - viewRect.x, rect.y - viewRect.y);

 int centerX = (viewRect.width - rect.width) / 2;
 int centerY = (viewRect.height - rect.height) / 2;
 if (rect.x < centerX) {
     centerX = -centerX;
 }
 if (rect.y < centerY) {
     centerY = -centerY;
 }
 rect.translate(centerX, centerY);
 viewport.scrollRectToVisible(rect);

有什么想法吗?谢谢

通过查看您提供的代码,我认为您必须检查:

if( rownumber>=0 ) {
   //Your code
}
可能是由rownumber=-1引起的渲染问题

NFC读卡器在卡上写入数据时触发该事件。这种情况每2或3秒发生一次

所以我猜这是一个单独的线程在后台运行

因此,您需要:

  • 使用
    table.scrollRectToVisible(..)
    ,因为您希望在滚动窗格的视口中滚动表格
  • 确保使用
    SwingUtilities.invokeLater(…)
    在事件调度线程上执行代码。有关EDT的更多信息,请阅读上的Swing教程

  • 每次事件发生…………通常该事件每2或3秒发生一次
    该事件是什么??我的意思是,如果需要,你能用更详细的代码或完整的代码更新你的问题吗possible@RakibulIslam“更详细的代码或完整的代码,如果可能的话”这是最好的操作后作为一个问题的答案。顺便说一句-通过在注释中键入
    [MCVE]
    来获取MCVE链接。该行始终>0。。从1开始到结束正确。谢谢。按照您的建议实施,但发生了相同的结果。看起来像是渲染问题。@RicardoCaldas,我从没有在后台线程更新表时遇到过问题。这更可能是一个编码问题。由于您尚未提供[mvce]代码来演示问题,我们无法提供更多帮助。
    if( rownumber>=0 ) {
       //Your code
    }