我有一个组合框,其中的项目是对象,其字符串值可能很长。我不想让盒子变得更长,而是希望鼠标悬停在上面时显示全文。我怎样才能做到这一点?
最佳答案
下面是使用 custom cell renderer 的示例.
正如所写,您可以通过说出以下内容来使用我的示例:
ToolTipRenderer.addRenderer(jComboBox, foo -> foo.getTheLongString());
(或者,如果您不需要通用/Java 8 的内容,也可以复制并重构它。)
我在这里基本上使用了装饰器模式,而不是做类似扩展DefaultListCellRenderer
之类的事情。这样,如果 JComboBox
已经使用了不同的东西,则行为将被保留。设置工具提示时您真正关心的是该组件是否是 JComponent
的某个子类。
import java.util.Objects;
import java.util.function.Function;
import javax.swing.ListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JComponent;
import java.awt.Component;
public class ToolTipRenderer<E> implements ListCellRenderer<E> {
private final ListCellRenderer<? super E> delegate;
private final Function<E, String> toStringFn;
public ToolTipRenderer(ListCellRenderer delegate,
Function<E, String> toStringFn) {
this.delegate = Objects.requireNonNull(delegate);
this.toStringFn = Objects.requireNonNull(toStringFn);
}
@Override
public Component getListCellRendererComponent(JList<? extends E> list,
E value,
int index,
boolean isSelected,
boolean cellHasFocus) {
Component result =
delegate.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);
if (result instanceof JComponent) {
// if you don't want to use generics,
// replace this with
// = value.getTheLongString();
String ttText = toStringFn.apply(value);
((JComponent) result).setToolTipText(ttText);
// I was not sure if you wanted
// something like this too.
// if (result instanceof JLabel) {
// ((JLabel) result).setText(value.getTheShortString());
// }
}
return result;
}
// This is an example of how it should be used.
// Pass the ToolTipRenderer the previous renderer
// from comboBox.getRenderer().
public static <E> void addRenderer(JComboBox<E> comboBox,
Function<E, String> toStringFn) {
ListCellRenderer<? super E> delegate = comboBox.getRenderer();
comboBox.setRenderer(new ToolTipRenderer<E>(delegate, toStringFn));
}
}
关于java - 将 Swing 组合框提示工具设置为所选项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43621987/