Можно ли изменить * показанные * имена для элементов в Java Swing jList? - PullRequest
11 голосов
/ 23 декабря 2010

У меня есть jList, который использует DefaultListModel, и я заполняю его объектами, полученными из списка (контекст: объекты являются типом агента в системе ПРО).

Можно ли изменить имя, которое показано для объектов в списке jList?Я не смог ничего найти по этому поводу ...

Ответы [ 2 ]

10 голосов
/ 23 декабря 2010

Если информация, которую вы хотите увидеть (вместо того, что выдает 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());
4 голосов
/ 23 декабря 2010

Я думаю, что имена создаются методами 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;
    }
}
...