【发布时间】:2009-01-26 15:55:09
【问题描述】:
在 Swing 中,有没有办法为 JComboBox 中的每个项目定义鼠标悬停文本(或工具提示文本)?
【问题讨论】:
在 Swing 中,有没有办法为 JComboBox 中的每个项目定义鼠标悬停文本(或工具提示文本)?
【问题讨论】:
有一个比已经给出的ToolTipComboBox 答案更好的方法。
首先,自定义ListCellRenderer:
package com.example;
import javax.swing.*;
import java.awt.*;
import java.util.List;
public class ComboboxToolTipRenderer extends DefaultListCellRenderer {
List<String> 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<String> 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) );
【讨论】:
这是来自在线example 的一些固定代码:
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);
}
}
【讨论】:
如果您的组合框不可编辑,请使用setRenderer(ListCellRenderer)。如果可以编辑,请使用setEditor(ComboBoxEditor),因为:
如果 JComboBox 不可编辑,则使用渲染器。如果它是可编辑的,则使用编辑器来渲染和编辑选定的项目。
【讨论】:
我从未尝试过,但您应该能够定义一个 ListCellRenderer,并让它返回一个 JLabel 或任何带有工具提示的东西。
【讨论】: