Hello John,
Here is some code I found in the older versions of the swingset demo.
Take this code or search for TreeCombo.java and you will have a JTree
rendered in your combobox popdown menu.
/**
* @(#)TreeCombo.java 1.6 98/08/26
*
* Copyright 1997, 1998 by Sun Microsystems, Inc.,
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Sun Microsystems, Inc. ("Confidential Information"). You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Sun.
*/
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;
}
}
}
Friday, May 31, 2002, 6:56:33 AM, you wrote:
John> I don't know if this is technically possible with the JComboBox, but I was
wondering if I could have a JTree pop down instead of a JList?
John> I'm using 1.3.1_02. Thanks,
John> John
John> _______________________________________________
John> Advanced-swing mailing list
John> [EMAIL PROTECTED]
John> http://eos.dk/mailman/listinfo/advanced-swing
--
Best regards,
Max mailto:[EMAIL PROTECTED]
_______________________________________________
Advanced-swing mailing list
[EMAIL PROTECTED]
http://eos.dk/mailman/listinfo/advanced-swing