JXTreeTable在添加新节点时滚动?

时间:2014-08-24 01:17:33

标签: java swing swingx jxtreetable

我有一个带有添加按钮的JXTreeTable。按钮按预期工作:它在末尾添加一个新节点,其值(为了测试目的)被硬编码到我的程序中。这一行:

modelSupport.fireChildAdded(new TreePath(root), noOfChildren-1, dataNode);

告诉JXTreeTable识别对TreeTableModel所做的更新,并相应地进行刷新。

然后我执行:

treeTable.changeSelection(treeTable.getRowCount()-1, 0, false, false);

自动选择此新节点。这可以按预期工作,但我也希望它能自动滚动以显示这个新节点,但事实并非如此。相反,它滚动显示倒数第二个节点,使新节点隐藏在视线之外。

我还尝试使用技巧以编程方式滚动到最终记录。但是,这段代码:

JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue(vertical.getMaximum());

发现了同样的问题。

奇怪的是,如果我将以上两个代码块中的任何一个附加到"滚动到底部"按钮,并在添加新节点后手动按此按钮,一切正常!请任何人可以找出此错误的原因,或提供修复/解决方法吗?

2 个答案:

答案 0 :(得分:0)

JXTreeTable应具有以下内容:

JXTreeTable.scrollPathToVisible(...)

这对你有用吗?

编辑: 我假设它适用于您的Button,因为Scrollpane已经使用新添加的节点“渲染/绘制”(当您单击按钮时)。基于此,内部最大/最小计算(例如滚动窗格)可能不同。 / p>

答案 1 :(得分:0)

对于遇到此问题的其他人来说,这似乎是由于执行GUI操作的顺序所致(部分原因是需要在Dispatch线程上执行)。

从内存来看,这就是我解决它的方式。 (我几个月没看过代码,所以这段代码可能效果不好,但是你明白了。)

换行“vertical.setValue(vertical.getMaximum());” SwingUtilities.invokeLater()方法调用中的代码。换句话说:

SwingUtilities.invokeLater(new Runnable() {
   public void run() {
      JScrollBar vertical = scrollPane.getVerticalScrollBar();
      vertical.setValue(vertical.getMaximum());
   }
});