Qiang Li
Qiang Li

Reputation: 10855

Strange behavior after replacing a JTree in a JScrollPane

This is a follow-up question of my previous post. I am trying to place a JTree inside a JScrollPane using the following code. Initialization of the JTree looks fine, also after typing 100 in the JTextField and then Enter also went fine. But when I scrolled the vertical slide, resized the window, or tried to expand the new JTree nodes, I found the tree went back to the original state with only 10 nodes. Appreciate your help.

import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;


public class RandomJTree2 extends JFrame {

    private final JTextField jtf = new JTextField(10);
    private JTree tree;
    JScrollPane jsp;
    private Random generator = new Random();

    private JTree buildTree(int nnodes) {
        DefaultMutableTreeNode node = new DefaultMutableTreeNode(0);
        DefaultMutableTreeNode cnode = node;
        for (int i = 1; i <= nnodes; i++) {
            System.out.println(i);
            DefaultMutableTreeNode newn = new DefaultMutableTreeNode(i);
            int j = generator.nextInt(2);
            System.out.println("j=" + j);
            if (j == 0 && i != 1) {
                DefaultMutableTreeNode parent = (DefaultMutableTreeNode)cnode.getParent();
                if (parent != null) {
                    parent.add(newn);
                    cnode = parent;
                } else {
                    node.add(newn);
                    cnode = newn;
                }
            } else {
                cnode.add(newn);
                cnode = newn;
            }
        }
        return new JTree(node);
    }

    public RandomJTree2() {
        setLayout(new BorderLayout());
        add(jtf, BorderLayout.NORTH);
        tree = buildTree(10);
        jsp = new JScrollPane(tree);
        add(jsp, BorderLayout.CENTER);

        jtf.addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent e) {
                    int key = e.getKeyCode();
                    if (key == KeyEvent.VK_ENTER) {
                        invalidate();
                        //                        jsp.remove(tree);
                        //                        tree = buildTree(Integer.parseInt(jtf.getText()));
                        //                        jsp.add(tree);
                        //                        remove(jsp);
                        tree = buildTree(Integer.parseInt(jtf.getText()));
                        jsp = new JScrollPane(tree);
                        add(jsp, BorderLayout.CENTER);
                        validate();
                    }
                }
            });

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new RandomJTree2();
    }
}

Upvotes: 0

Views: 491

Answers (2)

JustDanyul
JustDanyul

Reputation: 14044

Tiny little additional comment, you will get a error if you press enter in the text field when its empty (or otherwise invalid formatted number).

try {
    int yourNumer = Integer.parseInt(jtf.getText()); // pass this to buildTree() 
    if (key == KeyEvent.VK_ENTER) {// do your stuff}
} catch (NumberFormatException e){
// show a dialog or somthing :D
}

Upvotes: 1

Jeffrey
Jeffrey

Reputation: 44808

Here you are:

 tree = buildTree(Integer.parseInt(jtf.getText()));
 remove(jsp); //<--------------------
 jsp = new JScrollPane(tree);
 add(jsp, BorderLayout.CENTER);
 validate();

You need to remove the old scroll pane before putting a new one in.

Upvotes: 1

Related Questions