Java 在插入新节点时,在JTree的末尾设置viewport

Java 在插入新节点时,在JTree的末尾设置viewport,java,swing,jscrollpane,viewport,jtree,Java,Swing,Jscrollpane,Viewport,Jtree,我有一个在JScrollPane中的JTree。我想在插入新节点时更新视口并将其设置为JTree的末尾 我想做一些类似的事情 scrollPane = new JScrollPane( textPane )); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); DefaultCaret caret = (DefaultCaret) textPane.getCaret();

我有一个在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()
方法,因此 我已经检查了JTreeAPI,但找不到我需要的。 有没有一种简单的方法可以让它工作?

您可以获取滚动窗格的名称,然后使用。差不多

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);
            }  
        });
    }
}
导入java.awt.Rectangle;
导入javax.swing.*;
导入javax.swing.tree.DefaultMutableTreeNode;
公共类TestViewPort{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
DefaultMutableTreeNode根=新的DefaultMutableTreeNode(“根”);
对于(int i=0;i<100;i++){
add(新的DefaultMutableTreeNode(Integer.toString(i));
}
JTree树=新的JTree(根);
树。设置VisibleRowCount(10);
JScrollPane=新的JScrollPane();
窗格。setViewportView(树);
int y=tree.getPreferredSize().height;
getViewport().scrollRectToVisible(新矩形(0,y,0,0));
showMessageDialog(空,窗格);
}  
});
}
}

  • 或者就像AndrewThompson指出的
    tree.scrollRectToVisible(新矩形(0,y,0,0))
    ,因为
    JTree
    也有这个方法

更新:可能是最好的解决方案
  • 或者其他解决方案(可能更好)
您可以获取滚动窗格的名称,然后使用。差不多

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);
            }  
        });
    }
}
导入java.awt.Rectangle;
导入javax.swing.*;
导入javax.swing.tree.DefaultMutableTreeNode;
公共类TestViewPort{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
DefaultMutableTreeNode根=新的DefaultMutableTreeNode(“根”);
对于(int i=0;i<100;i++){
add(新的DefaultMutableTreeNode(Integer.toString(i));
}
JTree树=新的JTree(根);
树。设置VisibleRowCount(10);
JScrollPane=新的JScrollPane();
窗格。setViewportView(树);
int y=tree.getPreferredSize().height;
getViewport().scrollRectToVisible(新矩形(0,y,0,0));
showMessageDialog(空,窗格);
}  
});
}
}

  • 或者就像AndrewThompson指出的
    tree.scrollRectToVisible(新矩形(0,y,0,0))
    ,因为
    JTree
    也有这个方法

更新:可能是最好的解决方案
  • 或者其他解决方案(可能更好)
您可以获取滚动窗格的名称,然后使用。差不多

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);
            }  
        });
    }
}
导入java.awt.Rectangle;
导入javax.swing.*;
导入javax.swing.tree.DefaultMutableTreeNode;
公共类TestViewPort{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
DefaultMutableTreeNode根=新的DefaultMutableTreeNode(“根”);
对于(int i=0;i<100;i++){
add(新的DefaultMutableTreeNode(Integer.toString(i));
}
JTree树=新的JTree(根);
树。设置VisibleRowCount(10);
JScrollPane=新的JScrollPane();
窗格。setViewportView(树);
int y=tree.getPreferredSize().height;
getViewport().scrollRectToVisible(新矩形(0,y,0,0));
showMessageDialog(空,窗格);
}  
});
}
}

  • 或者就像AndrewThompson指出的
    tree.scrollRectToVisible(新矩形(0,y,0,0))
    ,因为
    JTree
    也有这个方法

更新:可能是最好的解决方案
  • 或者其他解决方案(可能更好)
您可以获取滚动窗格的名称,然后使用。差不多

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);
            }  
        });
    }
}
导入java.awt.Rectangle;
导入javax.swing.*;
导入javax.swing.tree.DefaultMutableTreeNode;
公共类TestViewPort{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
DefaultMutableTreeNode根=新的DefaultMutableTreeNode(“根”);
对于(int i=0;i<100;i++){
add(新的DefaultMutableTreeNode(Integer.toString(i));
}
JTree树=新的JTree(根);
树。设置VisibleRowCount(10);
JScrollPane=新的JScrollPane();
窗格。setViewportView(树);
int y=tree.getPreferredSize().height;
getViewport().scrollRectToVisible(新矩形(0,y,0,0));
showMessageDialog(空,窗格);
}  
});
}
}

  • 或者就像AndrewThompson指出的
    tree.scrollRectToVisible(新矩形(0,y,0,0))
    ,因为
    JTree
    也有这个方法

更新:可能是最好的解决方案
  • 或者其他解决方案(可能更好)
看到像&。看到像&。看到像&。看到像&。