java - 将 Swing 组合框提示工具设置为所选项目

标签 java swing combobox mouseover

我有一个组合框,其中的项目是对象,其字符串值可能很长。我不想让盒子变得更长,而是希望鼠标悬停在上面时显示全文。我怎样才能做到这一点?

最佳答案

下面是使用 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/

相关文章:

java - Hibernate如何以2位小数写Detachedcriteria?

java - 在 jython 中导入类

java - JScrollPane - 新行上的多个图像

extjs 组合框模型

combobox - 在 Combobox 中的值发生变化时调用 WIX 中的自定义操作

java - 无法通过bat文件运行java

java - 设置ContentPane不起作用

java - GUI Java-如何使用2个用户输入的数字来得到答案

c# - ComboBox 和 TextBox 之间的连接

java - ConstraintLayout 中的消失元素留下幽灵空间