Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.gui > #4108

Re: JTree within JScrollP

Path csiph.com!x330-a1.tempe.blueboxinc.net!feeder1.hal-mli.net!news.glorb.com!news-out.readnews.com!news-xxxfer.readnews.com!news-out.news.tds.net!newsreading01.news.tds.net!86597e80!not-for-mail
From "tomaszewski.p" <tomaszewski.p@THRWHITE.remove-dii-this>
Subject Re: JTree within JScrollP
Message-ID <g96633$b4h$1@news.interia.pl> (permalink)
X-Comment-To comp.lang.java.gui
Newsgroups comp.lang.java.gui
In-Reply-To <0a56d7bd-4911-480e-82ea-413d2adf8764@c58g2000hsc.googlegroups.com>
References <0a56d7bd-4911-480e-82ea-413d2adf8764@c58g2000hsc.googlegroups.com>
Content-Type text/plain; charset=IBM437
Content-Transfer-Encoding 8bit
X-Gateway time.synchro.net [Synchronet 3.15a-Win32 NewsLink 1.92]
Lines 145
Date Wed, 27 Apr 2011 15:48:44 GMT
NNTP-Posting-Host 96.60.20.240
X-Complaints-To news@tds.net
X-Trace newsreading01.news.tds.net 1303919324 96.60.20.240 (Wed, 27 Apr 2011 10:48:44 CDT)
NNTP-Posting-Date Wed, 27 Apr 2011 10:48:44 CDT
Organization TDS.net
Xref x330-a1.tempe.blueboxinc.net comp.lang.java.gui:4108

Show key headers only | View raw


  To: comp.lang.java.gui


"JSchneider" <johannes@familieschneider.info> wrote in message 
news:0a56d7bd-4911-480e-82ea-413d2adf8764@c58g2000hsc.googlegroups.com...
> Hi,
>
> I have the following requirement:
>
> I have a JTree placed within a JScrollPane. The model of the JTree is
> now updated every other second. But the additional entries are added
> at the top of the Model (index is nearly always 0).
> This is a requirement and can't be changed...
[...]
> Now the problem:
> If the user has scrolled to the bottom (he wants to see the youngest
> entries) the visible entries change every time an additional row is
> added at the top (old mail has been added).
[...]
> ScrollRectToVisble causes a
> repaint with the old visible rect. Therefore the tree is
> "jumping" (paints one time with the "wrong" visible rect).
[...]

Try this:

import java.util.Enumeration;
import java.util.List;
import java.util.LinkedList;

import java.awt.BorderLayout;

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

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;

import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeModelEvent;

public class JTreeRefreshTest {

    static class NodeElement {
        private String message;

        public NodeElement(String message) {
            this.message = message;
        }

        @Override
        public String toString() {
            return message;
        }
    }

    static class TestTreeModel extends DefaultTreeModel {
           public TestTreeModel(TreeNode root) {
               super(root);
           }

           public void addNode(DefaultMutableTreeNode parent, 
DefaultMutableTreeNode child)
           {
               parent.insert(child, 0);
               final int childIndex = parent.getIndex(child);
               fireTreeNodesInserted(parent, parent.getPath(), new int[] 
{childIndex}, new Object[] {child});
           }
    }

    static class TestPanel extends JPanel {
        private DefaultMutableTreeNode rootNode;
        private TestTreeModel treeModel;

        public TestPanel() {
            super();
            rootNode = new DefaultMutableTreeNode(new NodeElement("Root"));
            for (int idx = 0; idx < 100; idx++) {
                rootNode.add(new DefaultMutableTreeNode(new 
NodeElement("Child " + idx)));
            }
            treeModel = new TestTreeModel(rootNode);

            final JTree tree = new JTree(treeModel);
            final JScrollPane scroll = new JScrollPane();
            scroll.getViewport().add(tree);

            setLayout(new BorderLayout());
            add(scroll, BorderLayout.CENTER);

            tree.addKeyListener(new KeyAdapter() {
                @Override
                public void keyReleased(KeyEvent event) {
                    if (event.getKeyCode() == KeyEvent.VK_1) {
                        final DefaultMutableTreeNode newNode = new 
DefaultMutableTreeNode(new NodeElement("New Node"));
                        treeModel.addNode(rootNode, newNode);
                    }
                }
            });
            treeModel.addTreeModelListener(new TreeModelListener() {
                @Override
                public void treeNodesChanged(TreeModelEvent event) {
                }

                @Override
                public void treeNodesInserted(TreeModelEvent event) {
                    tree.scrollPathToVisible(event.getTreePath());
                }

                @Override
                public void treeNodesRemoved(TreeModelEvent event) {
                }

                @Override
                public void treeStructureChanged(TreeModelEvent event) {
                }
            });
        }
    }

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new TestPanel(), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

}

Przemek

---
 * Synchronet * The Whitehouse BBS --- whitehouse.hulds.com --- check it out free usenet!
--- Synchronet 3.15a-Win32 NewsLink 1.92
Time Warp of the Future BBS - telnet://time.synchro.net:24

Back to comp.lang.java.gui | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

JTree within JScrollPane: "JSchneider" <jschneider@THRWHITE.remove-dii-this> - 2011-04-27 15:48 +0000
  Re: JTree within JScrollP "tomaszewski.p" <tomaszewski.p@THRWHITE.remove-dii-this> - 2011-04-27 15:48 +0000
    Re: JTree within JScrollP "JSchneider" <jschneider@THRWHITE.remove-dii-this> - 2011-04-27 15:48 +0000
      Re: JTree within JScrollP "tomaszewski.p" <tomaszewski.p@THRWHITE.remove-dii-this> - 2011-04-27 15:48 +0000

csiph-web