2016-09-06 12 views
-1

私はJavaでプログラミングしているEclipseを使用しています。問題は:JListへのArrayList - 複数のオブジェクト要素

1 - Dante 
2 - William 
3 - Jaime 
etc... 

は今、数字は、オブジェクトのIDであり、名前はよく、名前のとおりです。

これは私が私のJListを表示したい方法です。

ArrayListの名前はTraitListです。

これは私がEclipseの[ウィンドウビルダーからのJListの「モデル」プロパティとしてという置くときに私が得るものです:

TraitL.setModel(new AbstractListModel() { 
     String [] values = new String []; 
     for (int jln = 0; jln < TraitList.size(); jln++){ 
      values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
     } 
     public int getSize() { 
      return values.length; 
     } 
     public Object getElementAt(int index) { 
      return values[index]; 
     } 
    }); 

それ:

TraitL.setModel(new AbstractListModel() { 
     String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"}; 
     public int getSize() { 
      return values.length; 
     } 
     public Object getElementAt(int index) { 
      return values[index]; 
     } 
    }); 

だから私はそれを変更うまくいかなかった。私は数十種類の変種を試しました。何も働かなかった。だから、どのように私はオブジェクトの複数の要素をこのリストで表示させるのですか?私はそれがDefaultListModelかAbstractListModelか、あるいはListModelであれば気にしません。 ありがとうございます。

編集:私が試したものにすべての行のエラーは、次の画像である: errors

ボーナス質問:何かが起こるよう がどのように私は、このリストの要素に「のactionPerformed」をクリックして作るのですか私はそれをクリックした後?

+0

実際にどのようなエラーが発生しているかを言うと、この質問は簡単に答えることができます。とにかく、Guilhermeの答えで言及されているエラー以外の問題の原因の1つは、 'TraitList'がリストであるクラス内の' id'と 'Name'がパブリックフィールドであるかどうかです。そうでない場合は、取得するためにゲッターを使用する必要があります。もしそうであれば、おそらくカプセル化について読むべきでしょう。 –

+0

Guilhermeの提案に対する質問を画像として追加しました。 また、私はTraitクラスのフィールドに公的または私的な分類を与えていないので、それらは公開されていると思います。私はカプセル化を読むでしょう。それをはっきりと覚えていない、それは長い時間前に勉強した。 – Werneck

答えて

0
new AbstractListModel() { 
    String [] values = new String []; 
    for (int jln = 0; jln < TraitList.size(); jln++){ 
     values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
    } 
    public int getSize() { 
     return values.length; 
    } 
    public Object getElementAt(int index) { 
     return values[index]; 
    } 
} 

これは無効な匿名クラス定義です。クラス本体にコードが浮かんでいます。

それはプライベートメソッドに初期化を移動のいずれかによって固定することができる。

String [] values = initTraitList(); 
private String[] initTraitList() { 
    String [] values = new String [TraitList.size()]; 
    for (int jln = 0; jln < TraitList.size(); jln++){ 
     values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
    } 
    return values; 
} 

またはインスタンス初期化ブロックを使用して:

String [] values = new String [TraitList.size()]; 
{ 
    for (int jln = 0; jln < TraitList.size(); jln++){ 
     values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 
    } 
} 
+0

ありがとうございますKiskae! 私は問題を解決しましたが、テストを進めると何かが間違っていました。 どうもありがとうございました。 – Werneck

+0

@Werneckコードが突然警告とエラーの雪崩を引き起こした場合、ソースは通常始めにあります。このような問題を見つけ出すときに覚えておいてください。 – Kiskae

+0

文字列ベクトルの値を与える方法を理解できませんでした戻り値;私のために行をしました – Werneck

0

私は

String [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 

ラインが

values[jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name); 

右すべきですか?だと思いますか

+0

ありがとうGuilherme、あなたの応答のために! デイヴィッド・ウォレスが尋ねたように私はそれを試して、エラーをマークしました。編集された質問の画像にあります。 – Werneck

+0

よろしくお願いします! (: –

0

リストをローカル変数にコピーする必要はありません。あなたが望むことができますが、それは必要ではありません。ここにあなたのモデルに直接元のリストにアクセスする例を示します

public static void main(String[] args) { 
    List<String> values = Arrays.asList("A", "B", "C"); 
    JList list = new JList(new AbstractListModel() { 
     public int getSize() { 
      return values.size(); 
     } 

     public Object getElementAt(int index) { 
      return index + " - " + values.get(index); 
     } 
    }); 
    list.addListSelectionListener(e -> 
      System.out.println("Clicked " + list.getSelectedValue())); 
    JFrame frame = new JFrame("List Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(list); 
    frame.pack(); 
    frame.setVisible(true); 
} 

あなたが特に値に埋め込まインデックスを持つモデル内の配列にそれをしたい場合は、:

String[] valueCopy = IntStream.range(0, values.size()) 
    .mapToObj(i -> i + " - " + values.get(i)) 
    .toArray(new String[0]); 
public int getSize() { 
    return valueCopy.length; 
} 

public Object getElementAt(int index) { 
    return valueCopy[index]; 
} 
+0

答えてくれてありがとう、sprinter。 私がもっと簡単に感じたので、私はKiskaeの答えを最も役立つとマークしましたが、それは私にリスト要素をクリックした後の行動の例を与えてくれたので、 。 ありがとうたくさん! – Werneck

0

これは、モデルなしで達成することができる。

String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"}; 
JList jlist = new JList(values); 
scrollpane = new JScrollPane(jlist); 
scrollpane.setViewportView(jlist); 
+0

"1 - Dante 2 - William 3 - Jaime" は、私がそれをどのように表示したかの例でした。さらに、Window BuilderがJListをどのように作成するかを知りました。 また、JListを作成するときに、最後の2行がデフォルトで表示されます。 – Werneck

関連する問題