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