marberg
asked on
Tooltip for items in a jcombobox?
I need to enable a tooltip for each individual item in a jcombobox. In the answer to question 10065772 the recomendation was to edit the treeCombo.java in the swingSet example. Can anybody please help me and explain exactly what i need to change to make it work, i have tried to add setToolTipText in the getCellRendererComponent but nothing happens...
Thanks
Mattias
Thanks
Mattias
1. can you post your code so that we can work on it.
2. what's your OS / JDK version / Swing version ?
2. what's your OS / JDK version / Swing version ?
ASKER
OS Win95/98, JDK 1.2, Swing ??
The code...
Please observe that I only use this code for test purpose. If I get the tooltip facility to work properly I will rewrite the code...
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,TreeModelLis tener {
TreeModel source;
boolean invalid = true;
Object currentValue;
Vector cache = new Vector();
public TreeToListModel(TreeModel aTreeModel) {
source = aTreeModel;
aTreeModel.addTreeModelLis tener(this );
setRenderer(new ListEntryRenderer());
}
public void setSelectedItem(Object anObject) {
currentValue = anObject;
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(TreeModel Event e) {
invalid = true;
}
public void treeNodesInserted(TreeMode lEvent e) {
invalid = true;
}
public void treeNodesRemoved(TreeModel Event e) {
invalid = true;
}
public void treeStructureChanged(TreeM odelEvent 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,leve l,false);
else {
int c = source.getChildCount(anObj ect);
int i;
Object child;
addListEntry(anObject,leve l,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,i sNode));
}
}
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;
}
public String toString() {
return object.toString();
}
}
static Border emptyBorder = new EmptyBorder(0,0,0,0);
class ListEntryRenderer extends JLabel implements ListCellRenderer {
ImageIcon leafIcon = SwingSet.sharedInstance(). loadImageI con("image s/document .gif","Doc ument");
ImageIcon nodeIcon = SwingSet.sharedInstance(). loadImageI con("image s/folder.g if","Folde r");
public ListEntryRenderer() {
setOpaque(true);
}
public Component getListCellRendererCompone nt(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 );
setToolTipText(listEntry.o bject().to String());
if(index != -1)
border = new EmptyBorder(0, OFFSET * listEntry.level(), 0, 0);
else
border = emptyBorder;
if(UIManager.getLookAndFee l().getNam e().equals ("CDE/Moti f")) {
if(index == -1 )
setOpaque(false);
else
setOpaque(true);
} else
setOpaque(true);
setBorder(border);
if (isSelected) {
setBackground(UIManager.ge tColor("Co mboBox.sel ectionBack ground"));
setForeground(UIManager.ge tColor("Co mboBox.sel ectionFore ground"));
} else {
setBackground(UIManager.ge tColor("Co mboBox.bac kground")) ;
setForeground(UIManager.ge tColor("Co mboBox.for eground")) ;
}
} else {
setText("");
}
return this;
}
}
}
The code...
Please observe that I only use this code for test purpose. If I get the tooltip facility to work properly I will rewrite the code...
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,TreeModelLis
TreeModel source;
boolean invalid = true;
Object currentValue;
Vector cache = new Vector();
public TreeToListModel(TreeModel aTreeModel) {
source = aTreeModel;
aTreeModel.addTreeModelLis
setRenderer(new ListEntryRenderer());
}
public void setSelectedItem(Object anObject) {
currentValue = anObject;
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(TreeModel
invalid = true;
}
public void treeNodesInserted(TreeMode
invalid = true;
}
public void treeNodesRemoved(TreeModel
invalid = true;
}
public void treeStructureChanged(TreeM
invalid = true;
}
void validate() {
if(invalid) {
cache = new Vector();
cacheTree(source.getRoot()
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,leve
else {
int c = source.getChildCount(anObj
int i;
Object child;
addListEntry(anObject,leve
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,i
}
}
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;
}
public String toString() {
return object.toString();
}
}
static Border emptyBorder = new EmptyBorder(0,0,0,0);
class ListEntryRenderer extends JLabel implements ListCellRenderer {
ImageIcon leafIcon = SwingSet.sharedInstance().
ImageIcon nodeIcon = SwingSet.sharedInstance().
public ListEntryRenderer() {
setOpaque(true);
}
public Component getListCellRendererCompone
ListEntry listEntry = (ListEntry)value;
if(listEntry != null) {
Border border;
setText(listEntry.object()
setIcon( listEntry.isNode() ? nodeIcon : leafIcon );
setToolTipText(listEntry.o
if(index != -1)
border = new EmptyBorder(0, OFFSET * listEntry.level(), 0, 0);
else
border = emptyBorder;
if(UIManager.getLookAndFee
if(index == -1 )
setOpaque(false);
else
setOpaque(true);
} else
setOpaque(true);
setBorder(border);
if (isSelected) {
setBackground(UIManager.ge
setForeground(UIManager.ge
} else {
setBackground(UIManager.ge
setForeground(UIManager.ge
}
} else {
setText("");
}
return this;
}
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks alot!
ASKER