【问题标题】:JXTreeTable scroll upon adding new node?JXTreeTable 在添加新节点时滚动?
【发布时间】:2014-08-24 01:17:33
【问题描述】:

我有一个带有添加按钮的 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());

揭示了同样的问题。

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

【问题讨论】:

    标签: java swing swingx jxtreetable


    【解决方案1】:

    JXTreeTable 应该是这样的:

    JXTreeTable.scrollPathToVisible(...)
    

    这对你有用吗?

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

    【讨论】:

      【解决方案2】:

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

      凭记忆,我就是这样解决的。 (我已经好几个月没看代码了,所以这段代码可能无法完美运行,但你明白了。)

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 2017-04-20
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        相关资源
        最近更新 更多