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或其他任何带有工具提示的东西。