我有一个包含60行的JTable(已修复)。
每次事件发生时,该行中的单元格都会更新。
当NFC读取器在卡上写入数据时,触发该事件。这种情况每2或3秒发生一次。
如果卡的书写方式正确或正确,则jTable会更新结果(WRITE,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);
这是唯一滚动到所选内容的方法。
这只会收到行号指示符。
在所有情况下行号都是正确的。
public void scrollPanel(int line) {
tblViewCsv.changeSelection(line, 0, false, false);
tblViewCsv.getSelectionModel().setSelectionInterval(line, line);
tblViewCsv.scrollRectToVisible(new Rectangle(tblViewCsv.getCellRect(line, 0, true)));
}
有什么想法吗?谢谢
答案 0 :(得分:3)
当NFC读取器在卡上写入数据时,触发该事件。这种情况每2或3秒发生一次。
所以我猜想这是一个在后台运行的单独线程。
所以您需要:
table.scrollRectToVisible(..)
,因为您想在滚动窗格的视口中滚动表格。SwingUtilities.invokeLater(...)
确保在事件调度线程上执行了代码。阅读Concurrency上的Swing教程,以获取有关EDT的更多信息。答案 1 :(得分:0)
通过查看您提供的代码,我认为您必须检查:
<div class="contact" itemscope itemtype="http://schema.org/ExerciseGym https://schema.org/LocalBusiness https://schema.org/Person" itemprop="employee">
<div class"name" itemprop="name">John Doe Does</div>
...
</div>
也许是由于rownumber = -1导致的呈现问题。