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
,它将返回的组件
stoolTipText
属性设置为所需的适当值
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
,将返回的组件stoolTipText
属性设置为所需的适当值
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应用于组合框)