如何为 JComboBox 定义一个通用"POJO" ListCellRenderer



如果我有一个JComboBox,根据平台的不同,它呈现单元格的方式是不同的。我对它渲染字符串的方式很满意。我想要实现的是定义一个从Pojos映射到string的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的所有高亮/选择等,但是我可以使用ComboBox作为域对象的规范持有人,并且仍然可以很好地显示它们。

缺点是上面的代码显然不是类型安全的。

我的问题是:

  1. 这是解决这个问题的一个合理的方法吗(对我来说似乎是这样)
  2. 我错过了一些明显的Swing库(因为这似乎是相当明显的功能)
  3. 谁能建议如何保持上述功能,同时也消除编译器警告(并使上述类型安全)

以便我可以用任何对象填充JComboBox,但显示toString方法的内容以外的内容。

你可以检查组合框与自定义渲染器。这是我处理POJO的方法。它支持类型安全。

可能不是你想要的,但它也解决了你的自定义渲染器的问题,因为它会破坏默认的键选择功能

相关内容

  • 没有找到相关文章

最新更新