Java Swing:JTraboBox项目上的鼠标hover文本?

在Swing中,有没有办法为JComboBox中的每个项目定义鼠标hover文本(或工具提示文本)?

有一个比已经给出的ToolTipComboBox答案更好的方法。

首先,创建一个自定义ListCellRenderer

 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; } } 

然后像这样使用它:

 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); 

我喜欢MountainX解决方案的简单性,但不喜欢缺少封装。 另一种具有更多移动部件的解决方案,但它们非常简单且可重复使用。

界面:

 public interface ToolTipProvider { public String getToolTip(); } 

包装类:

 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(); } } 

和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; } } 

随着现在添加:

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

这是来自在线示例的一点点固定代码:

 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); } } 

如果您的combobox不可编辑,请使用setRenderer(ListCellRenderer) 。 如果它是可编辑的,请使用setEditor(ComboBoxEditor) ,因为:

如果JComboBox不可编辑,则使用渲染器。 如果它是可编辑的,则编辑器用于渲染和编辑所选项目。

我从来没有尝试过,但你应该能够定义一个ListCellRenderer,让它返回一个JLabel或其他任何带有工具提示的东西。