Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Swing combobox tiptool设置为选定项_Java_Swing_Combobox_Mouseover - Fatal编程技术网

Java 将Swing combobox tiptool设置为选定项

Java 将Swing combobox tiptool设置为选定项,java,swing,combobox,mouseover,Java,Swing,Combobox,Mouseover,我有一个组合框,其中的项目是对象,其字符串值可能很长。我不想让框变长,而是希望全文显示在鼠标浮动的位置。我该怎么做呢?下面是一个使用 如文所述,你可以用我的例子说: ToolTipRenderer.addRenderer(jComboBox, foo -> foo.getTheLongString()); (或者,如果您不需要generic/java8之类的东西,也可以复制并重构它。) 我在这里基本上使用的是装饰器模式,而不是像扩展DefaultListCellRenderer这样的操作

我有一个组合框,其中的项目是对象,其字符串值可能很长。我不想让框变长,而是希望全文显示在鼠标浮动的位置。我该怎么做呢?

下面是一个使用

如文所述,你可以用我的例子说:

ToolTipRenderer.addRenderer(jComboBox, foo -> foo.getTheLongString());
(或者,如果您不需要generic/java8之类的东西,也可以复制并重构它。)

我在这里基本上使用的是装饰器模式,而不是像扩展
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.util.Objects;
导入java.util.function.function;
导入javax.swing.ListCellRenderer;
导入javax.swing.JComboBox;
导入javax.swing.JList;
导入javax.swing.JComponent;
导入java.awt.Component;
公共类ToolTipRenderer实现ListCellRenderer{

private final ListCellRenderer下面是一个使用

如文所述,你可以用我的例子说:

ToolTipRenderer.addRenderer(jComboBox, foo -> foo.getTheLongString());
(或者,如果您不需要generic/java8之类的东西,也可以复制并重构它。)

我基本上是在这里使用装饰器模式,而不是像扩展
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.util.Objects;
导入java.util.function.function;
导入javax.swing.ListCellRenderer;
导入javax.swing.JComboBox;
导入javax.swing.JList;
导入javax.swing.JComponent;
导入java.awt.Component;
公共类ToolTipRenderer实现ListCellRenderer{

private final ListCellRenderer基本解决方案是提供一个
ListCellRenderer
,它将返回的
组件
s
toolTipText
属性设置为所需的适当值

DefaultListCellRenderer
扩展自
JLabel
,因此您可以简单地使用它的
toolTipText
方法来提供所需的任何“扩展”文本

public class ToolTipListCellRenderer extends DefaultListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        // I'd extract the basic "text" representation of the value
        // and pass that to the super call, which will apply it to the 
        // JLabel via the setText method, otherwise it will use the
        // objects toString method to generate a representation
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
        setToolTipText("To what ever you need based on the value that has been passsed");
        return this;
    }

}
公共类ToolTipListCellRenderer扩展了DefaultListCellRenderer{
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
//我将提取值的基本“文本”表示形式
//并将其传递给超级调用,超级调用将应用于
//JLabel通过setText方法,否则它将使用
//对象toString方法生成表示
getListCellRenderComponent(列表、值、索引、isSelected、cellHasFocus);
setToolTipText(“根据已传递的值设置为所需的值”);
归还这个;
}
}

有关更多详细信息,请参见和。基本解决方案是提供一个
ListCellRenderer
,将返回的
组件
s
toolTipText
属性设置为所需的适当值

DefaultListCellRenderer
扩展自
JLabel
,因此您可以简单地使用它的
toolTipText
方法来提供所需的任何“扩展”文本

public class ToolTipListCellRenderer extends DefaultListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        // I'd extract the basic "text" representation of the value
        // and pass that to the super call, which will apply it to the 
        // JLabel via the setText method, otherwise it will use the
        // objects toString method to generate a representation
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
        setToolTipText("To what ever you need based on the value that has been passsed");
        return this;
    }

}
公共类ToolTipListCellRenderer扩展了DefaultListCellRenderer{
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
//我将提取值的基本“文本”表示形式
//并将其传递给超级调用,超级调用将应用于
//JLabel通过setText方法,否则它将使用
//对象toString方法生成表示
getListCellRenderComponent(列表、值、索引、isSelected、cellHasFocus);
setToolTipText(“根据已传递的值设置为所需的值”);
归还这个;
}
}
有关更多详细信息,请参见和。自定义渲染器允许您将工具提示应用于应显示的组件(假设非已直接应用于组合框),请查看和。自定义渲染器允许您将工具提示应用于应显示的组件(假设已直接将non应用于组合框)