Solved

JTextArea as JTree node label

Posted on 2004-10-26
953 Views
Last Modified: 2012-06-27
Hi

I want my JTree to display a JTextArea as its node label.
For example:
When a node minimizes, only the 1st line of the text string is shown.
When a node expandes, the entire multi-line text string is shown.
 
It would look this:

Root +----LABEL A line 1
        |     LABEL A line 2
        |     .....
        |    
        +----LABEL B Line 1

I try extending javax.swing.tree.DefaultTreeCellRenderer
but I could not get it to display a JTextArea as the node label.

How should I approach this problem ?

Is there any sample source code out there ?

Any commercial UI javabean that can do this ?

I would appreciate any comment or suggestion.



0
Question by:csunlistek
    9 Comments
     
    LVL 86

    Expert Comment

    by:CEHJ
    >>
    I try extending javax.swing.tree.DefaultTreeCellRenderer
    but I could not get it to display a JTextArea as the node label.
    >>

    Can you post your code?

    0
     

    Author Comment

    by:csunlistek
    Yes, here is my latest test code. tested under JDK 1.4.2.
    It implements TreeCellRenderer.
    It was at least able to display a JTextArea as a tree node
    but it has the following problems:

    1. resizing. How do I get the width of JTextArea to fit the width of the frame ?
    2. border. How do I draw the border around JTextArea to show the boundary of text ?

    Thanks for any suggestion.  sample code would be useful.

    -------------------------------------------------------------------------------

    package test;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;

    public class MyJTree extends JPanel {

      public MyJTree() {
        setLayout(new BorderLayout());
        // init data model
        String dummyText="";
        for (int i = 0; i < 10; i++) dummyText +=" ABCDE"; // dummy text string
        //for (int i = 0; i < 10; i++) dummyText +=" ABCDE \n"; // shows multiline here
        DefaultMutableTreeNode root =  new DefaultMutableTreeNode("root");
        for (int i = 0; i < 3; i++) {
          DefaultMutableTreeNode child = new DefaultMutableTreeNode("Child "+i + dummyText);
          root.add( child );
          for (int  j= 0; j < 3; j++)
            child.add( new DefaultMutableTreeNode("GrandChild "+i+"."+ j + dummyText));
        }
        DefaultTreeModel model = new DefaultTreeModel(root);
        // create tree UI
        JTree tree = new JTree(model);
         // Change the cell renderer
         tree.setCellRenderer(new CellRenderer());
         // Put tree in a scrollable pane
         JScrollPane sp = new JScrollPane(tree);
         add(sp, BorderLayout.CENTER);
      }

      // my cell renderer
     class CellRenderer implements TreeCellRenderer {
          JTextArea renderer;

          CellRenderer () {
            renderer = new JTextArea();
            renderer.setWrapStyleWord(true);
            renderer.setLineWrap(true);
            renderer.setOpaque (true);
          }

          public Component  getTreeCellRendererComponent(JTree tree,
              Object value, boolean selected, boolean expanded,
              boolean leaf, int row, boolean hasFocus) {

            // Change background color based on selected state
            Color background = (selected ? Color.lightGray : Color.white);
            renderer.setBackground(background);

            String text = value.toString();

            if (expanded) { // in expanded state, display all text
              renderer.setText(text);
              renderer.setPreferredSize(new Dimension(200,80));
            } else { // in minimized state, display 1st 10 chars
              renderer.setText( (text.length()>10 ?  text.substring(0, 10) : text) );
              renderer.setPreferredSize(new Dimension(200,20));
            }
            return renderer;
          }
        }


        public static void main(String[] args) {
          MyJTree t = new MyJTree();
          JFrame frame = new JFrame();
          frame.getContentPane().add(t);
          frame.setSize(300, 300);
          frame.setVisible(true);
        }


    }
    0
     

    Author Comment

    by:csunlistek
    One more question to add to above:

    3. Editing. How do I make the JTextArea as tree node editable ?
    It appears the CellRenderer approach is designed for display text, not for in-place text editing.

    Maybe I approach the whole problem in the wrong way ???

    0
     
    LVL 92

    Expert Comment

    by:objects
    You need to create a TreeCellEditor, as well as a TreeCellRenderer.
    0
     
    LVL 92

    Expert Comment

    by:objects
    0
     
    LVL 92

    Accepted Solution

    by:
    0
     
    LVL 5

    Expert Comment

    by:Naeemg
    objects referenced website is fine. go there and download that java file.
    0
     

    Author Comment

    by:csunlistek
    The sample codes do not work exactly as I had in mind (editing, border, auto JTextArea width adjustment, line wrap, etc) but they provide a good starting point, enough to get me going again.

    Thanks for all the help.
    0
     
    LVL 92

    Expert Comment

    by:objects
    (:
    0

    Write Comment

    Please enter a first name

    Please enter a last name

    We will never share this with anyone.

    Featured Post

    How your wiki can always stay up-to-date

    Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
    - Increase transparency
    - Onboard new hires faster
    - Access from mobile/offline

    If you have upgraded to Java2 update 10 on a Microsoft Windows client, you may have discovered that your Java application does not work as it did before.  For example, the colors of your Java2D graphic may be all wrong for no apparent reason. Aft…
    Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
    Viewers learn how to read error messages and identify possible mistakes that could cause hours of frustration. Coding is as much about debugging your code as it is about writing it. Define Error Message: Line Numbers: Type of Error: Break Down…
    Viewers will learn about arithmetic and Boolean expressions in Java and the logical operators used to create Boolean expressions. We will cover the symbols used for arithmetic expressions and define each logical operator and how to use them in Boole…

    913 members asked questions and received personalized solutions in the past 7 days.

    Join the community of 500,000 technology professionals and ask your questions.

    Join & Ask a Question

    Need Help in Real-Time?

    Connect with top rated Experts

    17 Experts available now in Live!

    Get 1:1 Help Now