5

CDのタイプであるオブジェクトのArrayListがあります。すべてのオブジェクトを JList に追加し、名前のフィールドをユーザーに表示したいと考えています。String 型を JList に追加することはできますが、オブジェクトの特定のフィールドについてはどうでしょうか?

CDは:

class CD{
    public CD(String n){name = n;}
    private String name;
    public String getName(){return name;}
    public void setName(String n){name = n;}
}

ArrayList は次のとおりです。

ArrayList<CD> myList = new ArrayList<CD>();

そして今、myList を JList に追加したいと思います。

JList list = new JList(myList);
panel.add(list);
JScrollPane scrol = new JScrollPane(list);
frame.add(scrol,BorderLayout.EAST);
frame.add(panel);
frame.setVisible(true);

まず、この方法は正しいですか?次に、オブジェクトのユーザー名フィールドをリストに表示するにはどうすればよいですか? 私の希望するインターフェースは次のとおりです。

ここに画像の説明を入力

左側は私のオブジェクトの名前です! 前もって感謝します。バーナード

4

3 に答える 3

11

DefaultListCellRenderer に基づくカスタム レンダラーを使用します。

import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.swing.DefaultListCellRenderer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class TestJList {

    class CD {
        public CD(String n) {
            name = n;
        }

        private String name;

        public String getName() {
            return name;
        }

        public void setName(String n) {
            name = n;
        }
    }

    protected void initUI() {
        List<CD> cds = new ArrayList<CD>();
        cds.add(new CD("MJ - Bad"));
        cds.add(new CD("Mozart - Concerto 123"));
        cds.add(new CD("Nadeah - Odile"));
        JFrame frame = new JFrame(TestJList.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JList list = new JList(new Vector<CD>(cds));
        list.setVisibleRowCount(10);
        list.setCellRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                Component renderer = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (renderer instanceof JLabel && value instanceof CD) {
                    // Here value will be of the Type 'CD'
                    ((JLabel) renderer).setText(((CD) value).getName());
                }
                return renderer;
            }
        });
        frame.add(new JScrollPane(list));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestJList().initUI();
            }
        });
    }
}
于 2012-09-18T14:37:18.423 に答える
3

CDでクラスを直接操作したい場合は、クラスで動作JListする独自のレンダラーを作成する必要があると思いますCDJLabelレンダラーは、フィールドの内容を拡張して表示する場合がありnameます。

他の方法もあります:for()を反復処理し、フィールドArrayListのみを に追加します。あなたがそれを行う方法はあなたの選択です。nameDefaultListRenderer

ListSelectionListener選択したリスト アイテムのアルバムの詳細を表示するように追加することもできます。

あなたが知る必要があるすべてはここにあります:

// クレオパトラに感謝 :)

于 2012-09-18T14:14:36.890 に答える
0

ArrayListを受け取るJListのコンストラクターはありませんが、VectorまたはArrayを使用できます(ArrayListは簡単にArrayに変換できます)。

ユーザーに必要なものを表示するには、カスタムレンダラーを使用できます。または、CDのtoString()メソッドをオーバーライドすることもできます。これは、正しく思い出せば、何を表示するかを決定するために使用するデフォルトのメソッドです。

于 2012-09-18T14:18:02.010 に答える