【问题标题】:Set viewport at the end of the JTree on inserting a new node在插入新节点时在 JTree 末尾设置视口
【发布时间】:2014-10-02 11:04:56
【问题描述】:
我有一个位于 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,但找不到我需要的东西。
有没有一种简单的方法可以让它工作?
【问题讨论】:
标签:
java
swing
jscrollpane
viewport
jtree
【解决方案1】:
您可以获取滚动窗格的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 也有这个方法。
更新:可能是最好的解决方案