0

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 をドメイン オブジェクトの正規のホルダーとして使用しても、それらを適切に表示できます。

欠点は、上記が明らかに型安全ではないことです。

だから私の質問は:

  1. これは、この問題に取り組むための正気な方法でもありますか (私にはそう思われます)
  2. Swing ライブラリで明らかな何かを見逃していませんか (これは非常に明白な機能のように思われるため)。
  3. 上記の機能を維持しながら、コンパイラの警告を排除する (および上記をタイプセーフにする) 方法を誰かが提案できますか?
4

1 に答える 1

2

JComboBox に任意のオブジェクトを設定できますが、toString メソッドのコンテンツ以外のものを表示できます。

Combo Box With Custom Rendererを確認できます。これは、POJO を処理するための私のアプローチです。型安全性をサポートします。

おそらくあなたが望むものではありませんが、カスタムレンダラーがデフォルトのキー選択機能を壊してしまうという問題も解決します。

于 2015-09-09T01:24:36.197 に答える