JComboBox がある場合、プラットフォームによっては、セルをレンダリングする方法が異なります。文字列をレンダリングする方法に満足しています。私が達成したいのは、Pojos から Strings にマップする 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 をドメイン オブジェクトの正規のホルダーとして使用しても、それらを適切に表示できます。
欠点は、上記が明らかに型安全ではないことです。
だから私の質問は:
- これは、この問題に取り組むための正気な方法でもありますか (私にはそう思われます)
- Swing ライブラリで明らかな何かを見逃していませんか (これは非常に明白な機能のように思われるため)。
- 上記の機能を維持しながら、コンパイラの警告を排除する (および上記をタイプセーフにする) 方法を誰かが提案できますか?