• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1129
  • Last Modified:

JTextArea as JTree node label

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
csunlistek
Asked:
csunlistek
1 Solution
 
CEHJCommented:
>>
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
 
csunlistekAuthor Commented:
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
 
csunlistekAuthor Commented:
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
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
objectsCommented:
You need to create a TreeCellEditor, as well as a TreeCellRenderer.
0
 
objectsCommented:
0
 
NaeemgCommented:
objects referenced website is fine. go there and download that java file.
0
 
csunlistekAuthor Commented:
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
 
objectsCommented:
(:
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: Microsoft Exchange Server

The MCTS: Microsoft Exchange Server 2010 certification validates your skills in supporting the maintenance and administration of the Exchange servers in an enterprise environment. Learn everything you need to know with this course.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now