Java Swing: texto de Mouseover en elementos JComboBox?

En Swing, ¿hay alguna manera de definir el texto del mouseover (o texto de sugerencia de herramienta) para cada elemento en un JComboBox?

Hay una forma mucho mejor de hacer esto que la respuesta ToolTipComboBox ya dada.

Primero, ListCellRenderer un ListCellRenderer personalizado:

 package com.example; import javax.swing.*; import java.awt.*; import java.util.List; public class ComboboxToolTipRenderer extends DefaultListCellRenderer { List tooltips; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JComponent comp = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (-1 < index && null != value && null != tooltips) { list.setToolTipText(tooltips.get(index)); } return comp; } public void setTooltips(List tooltips) { this.tooltips = tooltips; } } 

Entonces úsalo así:

 JComboBox comboBox = new JComboBox(); ComboboxToolTipRenderer renderer = new ComboboxToolTipRenderer(); comboBox.setRenderer(renderer); ... //make a loop as needed comboBox.addItem(itemString); tooltips.add(tooltipString); ... renderer.setTooltips(tooltips); 

Me gusta la simplicidad de la solución de MountainX, pero no la falta de encapsulación. Una solución alternativa que tiene más partes móviles, pero son bastante simples y reutilizables.

Una interfaz:

 public interface ToolTipProvider { public String getToolTip(); } 

Una clase de contenedor:

 public class ToolTipWrapper implements ToolTipProvider { final Object value; final String toolTip; public ToolTipWrapper(Object value, String toolTip) { this.value = value; this.toolTip = toolTip; } @Override public String getToolTip() { return toolTip; } @Override public String toString() { return value.toString(); } } 

Y una variante del renderizador de MountainX:

 public class ToolTipRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JComponent component = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); String tip = null; if (value instanceof ToolTipProvider) { ToolTipProvider ttp = (ToolTipProvider) value; tip = ttp.getToolTip(); } list.setToolTipText(tip); return component; } } 

con la adición ahora:

 combobox.addItem(new ToolTipWrapper(itemString,tooltipString) ); 

Aquí hay un código poco arreglado de un ejemplo en línea:

 import java.awt.Component; import java.awt.FlowLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.UIManager; import javax.swing.plaf.basic.BasicComboBoxRenderer; /** * @version 1.0 06/05/99 */ public class ToolTipComboBox extends JFrame { /** * */ private static final long serialVersionUID = 2939624252688908292L; String[] items = { "jw", "ja", "la" }; String[] tooltips = { "Javanese ", "Japanese ", "Latin " }; public ToolTipComboBox() { super("ToolTip ComboBox Example"); JComboBox combo = new JComboBox(items); combo.setRenderer(new MyComboBoxRenderer()); getContentPane().setLayout(new FlowLayout()); getContentPane().add(combo); } class MyComboBoxRenderer extends BasicComboBoxRenderer { /** * */ private static final long serialVersionUID = 2746090194775905713L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); if (-1 < index) { list.setToolTipText(tooltips[index]); } } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } setFont(list.getFont()); setText((value == null) ? "" : value.toString()); return this; } } public static void main(String args[]) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) {} ToolTipComboBox frame = new ToolTipComboBox(); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setSize(200, 140); frame.setVisible(true); } } 

Si su cuadro combinado no es editable, use setRenderer(ListCellRenderer) . Si es editable, use setEditor(ComboBoxEditor) , porque:

El renderizador se usa si JComboBox no es editable. Si es editable, el editor se usa para renderizar y editar el elemento seleccionado.

Nunca lo intenté, pero debería poder definir un ListCellRenderer y hacer que devuelva un JLabel o lo que sea con una información sobre herramientas.