2016-11-11 4 views
0

JComboBoxesをすべて同じように作成する必要があります。私はDefaultComboBoxModelを使用してモデルを生成しようとしています。しかし、リストに含めるデータに基づいていくつかの異なるモデルを作成する必要もあります。したがって、モデルを生成するために使用したいクラスを作成しました。DefauitComboBoxModelクラスを作成する

public class ModelComboBox<T> { 

    public ModelComboBox(ArrayList<String> list_) { 
     DefaultComboBoxModel<String> model=new DefaultComboBoxModel<String>(); 
     for (String entry : list_) { 
      model.addElement(entry); 
     } 
    } 
} 

私はModelComboBox.ModelComboBoxは型エラーに解決することはできません取得モデルを使用してみてください。

meatNames=new JComboBox<String>(new ModelComboBox.ModelComboBox<String>(meats)); 

ModelComboBox.ModelComboBoxのタイプを教えてくれる構文を教えてもらえますか?私は引数で(DefaultComboBoxModel)のさまざまなプレースメントを試しましたが、何も試してみませんでした。 TIA。

答えて

0

ここには多くの問題があります。

まず、ModelComboBoxは最上位クラスです。その他のトップレベルクラスと同様に、そのコンストラクターを呼び出す構文はnew ModelComboBox.ModelComboBox<String>()ではなくnew ModelComboBox<String>()です。

第2に、このクラスは汎用クラスですが、ジェネリックタイプ(T)はどこでも使用しません。したがって、それは一般的な理由が全くありません。

第3に、そのコンストラクタはDefaultComboBoxModelを作成し、それをローカル変数に割り当てます。コンストラクタが完了すると、DefaultComboBoxModelは範囲外になり、GCに適格になり、どこでも使用できなくなります。

最後に、ModelComboBoxのインスタンスをJComboBoxのコンストラクタに渡します。しかし、JComboBoxはModelComboBoxのインスタンスではなく、ComboBoxModelのインスタンスを必要とします。だからそれはコンパイルできません。

あなたは完全にこれを思い描いています。必要なのはList<String>を取るようにし、そのリストからたDefaultComboBoxModelを作成することができますいくつかのヘルパーメソッドです:

public DefaultComboBoxModel<String> createComboBoxModel(List<String> list) { 
    return new DefaultComboBoxModel<String>(new Vector<>(list)); 
} 
+0

これは確かに簡単です。ただし、ヘルパーメソッドを作成すると、このエラーが発生します。DefaultComboBoxModelは生の型です。ジェネリック型の参照DefaultComboBoxModel はパラメータ化する必要があります –

+0

訂正、つまりエラーではありません。私はそれを無視することができますが、それを取り除く方法はありますか?私を正しい軌道に乗せてくれてありがとう。 –

+0

私の編集を参照してください。私はジェネリック型を忘れてしまった。 –

0

JB Nizetの説明は非常に良いですが、私は少しそれを変更したいです。

public ModelComboBox(ArrayList<String> list) { 
    setModel(new DefaultComboBoxModel<String>(list.toArray()); 
} 

Vectorを作成する必要はありません。 ArrayListListインターフェイスを実装しており、.toArray()メソッドが保証されています。

モデルをサポートするすべてのSwingコンポーネントには、がサポートするモデルのタイプをとるsetModel(...)関数があります。

+0

これはコンパイルされません。 toArray()はObject []を返しますが、コンストラクタではString []が必要です。 'list.toArray(new String [list.size()])'を使う必要があります。 –

+0

@JBNizetメモリから何度もタイプするので、コンパイラで実行しませんでした。私もlist.toArray ()を使うことができると信じています。しかし –

+0

それは有効なJavaではないでしょうし、toArray()は汎用的な方法ではありません。 –

関連する問題