如何为 JComboBox 定义一个通用的 "POJO" ListCellRenderer
How do I define a general "POJO" ListCellRenderer for a JComboBox
如果我有一个 JComboBox,根据平台的不同,它呈现单元格的方式也不同。我对它呈现字符串的方式感到满意。我想要实现的是定义一个从 Pojos 映射到字符串的 ListCellRenderer,这样我就可以用任何对象填充 JComboBox,但显示 toString 方法内容以外的内容。
我最好的尝试(在运行时有效,但在编译时有警告)如下
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
@SuppressWarnings("unchecked")
public class PojoListRenderer<T> implements ListCellRenderer<Object>
{
public static interface Extractor<T>
{
public String extract(T fromThis);
}
private Extractor<T> myExtractor;
private ListCellRenderer renderer;
public PojoListRenderer(Extractor<T> extractor, ListCellRenderer parent)
{
myExtractor = extractor;
renderer = parent;
}
public PojoListRenderer(Extractor<T> extractor)
{
this(extractor, new DefaultListCellRenderer());
}
@Override
public Component getListCellRendererComponent(JList<?> list,
Object value, int index, boolean isSelected, boolean cellHasFocus)
{
String s = myExtractor.extract((T)value);
return renderer.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus);
}
}
然后可以按如下方式使用:
//Assume a class called Notification with methods name() and severity()
JComboBox myNotificationBox = ...;
myNotificationBox.setRenderer
(
new PojoListRenderer<Notification>
(
(notification) -> notification.name() + "/" + notifiation.severity(),
myNotification.getRenderer()
)
);
这种方法很好,因为它意味着我获得了 ComboBox 的默认 ListCellRenderer 的所有 highlighting/selection/etc,但我可以将 ComboBox 用作域对象的规范持有者,并且仍然可以很好地显示它们.
不利的一面是以上显然不是类型安全的。
所以我的问题是:
- 这是解决这个问题的明智方法吗(对我来说是这样)
- 我是否遗漏了 Swing 库中一些明显的东西(因为这看起来是非常明显的功能)
- 谁能建议如何在保留上述功能的同时消除编译器警告(并使上述类型安全)
so that I can populate the JComboBox with any objects, but display something other than the contents of the toString method.
您可以查看Combo Box With Custom Renderer。这是我处理 POJO 的方法。它确实支持类型安全。
可能不完全是您想要的,但它也解决了您的自定义渲染器存在的问题,即会破坏默认的键选择功能。
如果我有一个 JComboBox,根据平台的不同,它呈现单元格的方式也不同。我对它呈现字符串的方式感到满意。我想要实现的是定义一个从 Pojos 映射到字符串的 ListCellRenderer,这样我就可以用任何对象填充 JComboBox,但显示 toString 方法内容以外的内容。
我最好的尝试(在运行时有效,但在编译时有警告)如下
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
@SuppressWarnings("unchecked")
public class PojoListRenderer<T> implements ListCellRenderer<Object>
{
public static interface Extractor<T>
{
public String extract(T fromThis);
}
private Extractor<T> myExtractor;
private ListCellRenderer renderer;
public PojoListRenderer(Extractor<T> extractor, ListCellRenderer parent)
{
myExtractor = extractor;
renderer = parent;
}
public PojoListRenderer(Extractor<T> extractor)
{
this(extractor, new DefaultListCellRenderer());
}
@Override
public Component getListCellRendererComponent(JList<?> list,
Object value, int index, boolean isSelected, boolean cellHasFocus)
{
String s = myExtractor.extract((T)value);
return renderer.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus);
}
}
然后可以按如下方式使用:
//Assume a class called Notification with methods name() and severity()
JComboBox myNotificationBox = ...;
myNotificationBox.setRenderer
(
new PojoListRenderer<Notification>
(
(notification) -> notification.name() + "/" + notifiation.severity(),
myNotification.getRenderer()
)
);
这种方法很好,因为它意味着我获得了 ComboBox 的默认 ListCellRenderer 的所有 highlighting/selection/etc,但我可以将 ComboBox 用作域对象的规范持有者,并且仍然可以很好地显示它们.
不利的一面是以上显然不是类型安全的。
所以我的问题是:
- 这是解决这个问题的明智方法吗(对我来说是这样)
- 我是否遗漏了 Swing 库中一些明显的东西(因为这看起来是非常明显的功能)
- 谁能建议如何在保留上述功能的同时消除编译器警告(并使上述类型安全)
so that I can populate the JComboBox with any objects, but display something other than the contents of the toString method.
您可以查看Combo Box With Custom Renderer。这是我处理 POJO 的方法。它确实支持类型安全。
可能不完全是您想要的,但它也解决了您的自定义渲染器存在的问题,即会破坏默认的键选择功能。