2017-07-04 26 views
1

ちょっとした問題が出てきました。JComboBoxでEnumまたはStringを使用する必要がありますか?

下図のように私のコンボボックスは、私はオプションがすべて固定されているように、列挙型などのデータを保つために良いアイデアだろうと考えて、構築および初期化されています

private JComboBox<JobTitle> comboBox = new JComboBox<>();

が、要素を追加しますDefaultComboBoxModelに私は定数としてオプションを表示したくないことを認識しました(つまり、オプションを大文字で表示したくありません)。

jobTitleModel.addElement(JobTitle.Architect.getName()) コールするには、このような列挙型を作成しましたが、明らかに、ComboBoxは文字列ではなく列挙型であるため、動作しません。

public enum JobTitle { 
    ARCHITECT("Architect"), TOWN_PLANNER("Town Planner"), URBAN_DESIGNER("Urban Designer"), LANDSCAPE_GARDENER("Landscape Gardener"); 

    private final String name; 

    private JobTitle(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 
} 

私はこれにどのようにアプローチするのかよく分かりません。私はComboBoxとモデルをStringに変更することができましたが、ここではっきりと分からないものがあるはずです。ありがとう

+1

使用列挙型をしかし、コンボボックスに適切な列挙型のテキストを表示するカスタムレンダラを与えます。 –

+0

以下は、[列挙型変数値で 'JComboBox'を埋め込む方法]の例です(https://stackoverflow.com/a/42603111/2180785) – Frakcool

+0

' getName() 'という名前はお勧めしません。 'name()'メソッドと混同される可能性があります。 – shmosel

答えて

3

JComboBoxにカスタムレンダラを使用します。たとえば、以下のコードでは、デフォルトのリストセルレンダラーから拡張されたレンダラーを使用しています。それがないすべては、JComboBoxの、JobTitleオブジェクトの各セルに保持された値を取得することで、このオブジェクトから名前を抽出し、名前表示されます。

JComboBox<JobTitle> jobCombo = new JComboBox<>(JobTitle.values()); 
jobCombo.setRenderer(new DefaultListCellRenderer() { 

    public Component getListCellRendererComponent(JList<?> list, 
      Object value, 
      int index, 
      boolean isSelected, 
      boolean cellHasFocus) { 
     value = ((JobTitle) value).getName(); 
     return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
    } 

}); 

なぜこれを行うには?ユーザーがコンボボックスから項目を選択した場合、それはStringではなく本格的なJobTitle enumオブジェクトです。私はコンボボックスと列挙型のさまざまな上記を行う方法を作りたい場合

、スイッチがライン上でそのキャストに対処するための最もエレガントな方法である:あなたのコメントについて


9?

public enum JobTitle implements Textable { 
    ARCHITECT("Architect"), TOWN_PLANNER("Town Planner"), URBAN_DESIGNER(
      "Urban Designer"), LANDSCAPE_GARDENER("Landscape Gardener"); 

    private final String text; 

    private JobTitle(String name) { 
     this.text = name; 
    } 

    @Override 
    public String getText() { 
     return text; 
    } 
} 

public interface Textable { 
    String getText(); 
} 

そして、:のような全く新しい質問だと、おそらく、別途掲示しなければならない

が、一つの可能​​な解決策は、すべての列挙型を同じインタフェースを提供することです、何か自分自身のレンダラークラスを作成します。

public class TextableRenderer extends DefaultListCellRenderer { 
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, 
      boolean isSelected, boolean cellHasFocus) { 

     value = ((Textable) value).getText(); 

     return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
    } 
} 

これは、Textableインターフェイスを実装する任意の列挙型(またはクラス)で動作します。

そして使用:

final JComboBox<JobTitle> jobCombo = new JComboBox<>(JobTitle.values()); 
jobCombo.setRenderer(new TextableRenderer()); 
+1

ニース。長い時間あなたからの答えを見ていない。 – GhostCat

+0

@GhostCat:ええ、あまりにも忙しい閉鎖の質問! –

+0

おかげさまで、これは完璧です。レンダラーをもう少し調べ始めるのに役立ちます。私はそれらを避けている:) – NickW

関連する問題