在插入新节点时在JTree末尾设置视口

时间:2014-10-02 11:04:57

标签: java swing jscrollpane viewport jtree

我有一个位于JScrollPane中的JTree。我希望在插入新节点时更新视口并将其设置为JTree的末尾。

我想做类似的事......

   scrollPane = new JScrollPane( textPane ));
   scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

   DefaultCaret caret = (DefaultCaret) textPane.getCaret();
   caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

但是JTree不是JTextPane。 JTree类没有getCaret()方法,所以 我检查过JTree API但找不到我需要的东西。 是否有一种简单的方法可以使其正常工作?

1 个答案:

答案 0 :(得分:3)

您可以获取滚动窗格的JViewport,然后使用JViewPort#scrollRectToVisible(Rectangle contentRect)。像

这样的东西
int y = tree.getPreferredSize().height;
pane.getViewport().scrollRectToVisible(new Rectangle(0, y, 0, 0));

这是一个完整的例子

import java.awt.Rectangle;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;

public class TestViewPort {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
                for (int i = 0; i < 100; i++) {
                    root.add(new DefaultMutableTreeNode(Integer.toString(i)));
                }
                JTree tree = new JTree(root);
                tree.setVisibleRowCount(10);
                JScrollPane pane = new JScrollPane();
                pane.setViewportView(tree);
                int y = tree.getPreferredSize().height;
                pane.getViewport().scrollRectToVisible(new Rectangle(0, y, 0, 0));
                JOptionPane.showMessageDialog(null, pane);
            }  
        });
    }
}

  • 或者就像AndrewThompson指出tree.scrollRectToVisible(new Rectangle(0, y, 0, 0));一样,JTree也有这种方法。

更新:可能是最佳解决方案