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