滚动JTable标题

时间:2018-06-21 16:17:51

标签: java swing

我有一个包含60行的JTable(已修复)。

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

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

如果卡的书写方式正确或正确,则jTable会更新结果(WRITE,ERRO)。

将JTable移到该位置的函数仅接收行号。

现在,滚动条已移动到该行位置。

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

就像下面的图片一样。

enter image description here

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

//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)));
}

有什么想法吗?谢谢

2 个答案:

答案 0 :(得分:3)

  

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

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

所以您需要:

  1. 使用table.scrollRectToVisible(..),因为您想在滚动窗格的视口中滚动表格。
  2. 使用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导致的呈现问题。