11

DefaultListModelを使用するjListがあり、リストから取得したオブジェクトを入力します(コンテキスト:オブジェクトはABMシステムのエージェントの一種です)。

jListのオブジェクトに表示される名前を変更することはできますか?私はこれについて何も見つけることができませんでした...

4

2 に答える 2

10

(toString()が吐き出すものではなく)見たい情報がオブジェクト自体に含まれている場合、これを実現するための最も直接的な「Swing」方法は、ListCellRendererを使用することです。ListCellRenderer(実際には任意のCellRenderer)を、リスト内の各オブジェクトを描画するために使用されるゴム印と考えてください。オブジェクトが渡され、コンポーネントがセットアップされ、コンポーネントがオブジェクトを描画してから、次のオブジェクトに移動します。CellRendererには状態がありません。

この例を考えてみましょう。

// Extend DefaultListCellRenderer, takes care of most of the work for you
public class ExampleListCellRenderer extends DefaultListCellRenderer
{
    public Component getListCellRendererComponent(
        JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
        // I know DefaultListCellRenderer always returns a JLabel
        // super setups up all the defaults
        JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelect, cellHasFocus);

        // "value" is whatever object you put into the list, you can use it however you want here

        // I'm going to prefix the label text to demonstrate the point

       label.setText("PRE:" + label.getText());

       return label;

    }
}

// Some time later...

JList list = new JList();
list.setCellRenderer(new ExampleListCellRenderer());
于 2010-12-23T12:34:58.383 に答える
4

toString()名前はそれらのオブジェクトのメソッドによって生成されていると思います。あなたがそれを変えることができれば、それは最も簡単です。それ以外の場合、簡単な解決策は、JListのオブジェクトのビューを生成し、実際に操作する必要があるときに含まれているオブジェクトを簡単に取得できる、ある種のホルダーオブジェクトをそれぞれの周りにラップすることです。

ラッパーの概念を拡張するには:

class FooBarAgentHolder {
    // Simple javabean stuff
    private FooBarAgent agent;
    public FooBarAgentHolder(FooBarAgent agent) { this.agent = agent; }
    public FooBarAgent getAgent() { return agent; }

    // Produce the name for human consumption
    public String toString() {
        return agent.getDescriptiveName(); // Or whatever...
    }

    // Convenience conversion function
    public static DefaultListModel makeListModel(List<FooBarAgent> list) {
        DefaultListModel result = new DefaultListModel();
        for (FooBarAgent agent: list)
            result.addElement(new FooBarAgentHolder(agent));
        return result;
    }
}
于 2010-12-23T12:11:41.417 に答える