Hi All,

I was trying to get the JTree work inside the "drop-down" of the JCombobox. By searching in the old archives I got a sample code. It works but I am not able to do any kind of tree functionality (like clicking on the parent folder (+ sign) doesn't do the unfold action or the fold action ).
Does any one know how this can be done. Here is the code I am using,




import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.plaf.basic.*;
import java.util.Vector;
import java.awt.*;
import javax.swing.plaf.*;
import javax.swing.tree.*;
import java.util.Enumeration;

public class TreeCombo extends JComboBox {
   static final int OFFSET = 16;

   public TreeCombo(TreeModel aTreeModel) {
       super();
       setModel(new TreeToListModel(aTreeModel));
       setRenderer(new ListEntryRenderer());
   }

   class TreeToListModel extends AbstractListModel implements
ComboBoxModel,TreeModelListener {
       TreeModel source;
       boolean invalid = true;
       Object currentValue;
       Vector cache = new Vector();

       public TreeToListModel(TreeModel aTreeModel) {
           source = aTreeModel;
           aTreeModel.addTreeModelListener(this);
           setRenderer(new ListEntryRenderer());
       }

public void setSelectedItem(Object anObject) {
if ( (currentValue != null && !currentValue.equals( anObject )) ||
currentValue == null && anObject != null ) {
currentValue = anObject;


               Enumeration enum = cache.elements();
               while(enum.hasMoreElements()) {
                   ListEntry le = (ListEntry)enum.nextElement();
                   if(le.object().equals(anObject)) {
                       currentValue = le;
                       break;
                   }
               }
           }

           fireContentsChanged(this, -1, -1);
       }

       public Object getSelectedItem() {
           return currentValue;
       }

       public int getSize() {
           validate();
           return cache.size();
       }

       public Object getElementAt(int index) {
           return cache.elementAt(index);
       }

       public void treeNodesChanged(TreeModelEvent e) {
           invalid = true;
       }

       public void treeNodesInserted(TreeModelEvent e) {
           invalid = true;
       }

       public void treeNodesRemoved(TreeModelEvent e) {
           invalid = true;
       }

       public void treeStructureChanged(TreeModelEvent e) {
           invalid = true;
       }

       void validate() {
           if(invalid) {
               cache = new Vector();
               cacheTree(source.getRoot(),0);
               if(cache.size() > 0)
                   currentValue = cache.elementAt(0);
               invalid = false;
               fireContentsChanged(this, 0, 0);
           }
       }

       void cacheTree(Object anObject,int level) {
           if(source.isLeaf(anObject))
               addListEntry(anObject,level,false);
           else {
               int c = source.getChildCount(anObject);
               int i;
               Object child;

               addListEntry(anObject,level,true);
               level++;

               for(i=0;i<c;i++) {
                   child = source.getChild(anObject,i);
                   cacheTree(child,level);
               }

               level--;
           }
       }

       void addListEntry(Object anObject,int level,boolean isNode) {
           cache.addElement(new ListEntry(anObject,level,isNode));
       }
   }

   class ListEntry {
       Object object;
       int    level;
       boolean isNode;

       public ListEntry(Object anObject,int aLevel,boolean isNode) {
           object = anObject;
           level = aLevel;
           this.isNode = isNode;
       }

       public Object object() {
           return object;
       }

       public int level() {
           return level;
       }

       public boolean isNode() {
           return isNode;
       }
   }

static Border emptyBorder = new EmptyBorder(0,0,0,0);

   class ListEntryRenderer extends JLabel implements ListCellRenderer  {
       Icon leafIcon = (Icon)UIManager.get( "Tree.expandedIcon"
);//SwingSet.sharedInstance().loadImageIcon("images/document.gif","Document");
       Icon nodeIcon = (Icon)UIManager.get( "Tree.collapsedIcon"
);//SwingSet.sharedInstance().loadImageIcon("images/folder.gif","Folder");

       public ListEntryRenderer() {
           this.setOpaque(true);
       }

public Component getListCellRendererComponent(
JList listbox,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
ListEntry listEntry = (ListEntry)value;
if(listEntry != null) {
Border border;
setText(listEntry.object().toString());
setIcon( listEntry.isNode() ? nodeIcon : leafIcon );
if(index != -1)
border = new EmptyBorder(0, OFFSET * listEntry.level(), 0, 0);
else
border = emptyBorder;


if(UIManager.getLookAndFeel().getName().equals("CDE/Motif")) {
if(index == -1 )
this.setOpaque(false);
else
this.setOpaque(true);
} else
this.setOpaque(true);


               this.setBorder(border);
               if (isSelected) {

this.setBackground(UIManager.getColor("ComboBox.selectionBackground"));

this.setForeground(UIManager.getColor("ComboBox.selectionForeground"));
} else {
this.setBackground(UIManager.getColor("ComboBox.background"));
this.setForeground(UIManager.getColor("ComboBox.foreground"));
}
} else {
setText("");
}
return this;
}
}
}






Thanks for all the help.

Rajesh

_________________________________________________________________
Marriage? http://www.bharatmatrimony.com/cgi-bin/bmclicks1.cgi?74 Join BharatMatrimony.com for free.


_______________________________________________
Swing mailing list
[EMAIL PROTECTED]
http://eos.dk/mailman/listinfo/swing

Reply via email to