Использование JLists и ListModels - PullRequest
1 голос
/ 13 мая 2010

Я определил класс DirectoryListModel, который расширяет класс AbstractListModel из Java Api.

Внутри у меня есть список File объектов. Я определил метод getElementAt(int index) как:

@Override
public Object getElementAt(int index) {
    return directoryElements.get(index)
}

Проблема в том, что когда я пытаюсь запустить свой JList с моим DirectoryListModel, он показывает полные пути файлов, а не только имена файлов. Я мог бы изменить этот код на:

@Override
public Object getElementAt(int index) {
    return directoryElements.get(index).getName();

}

и это творит чудеса, но проблема в том, что в событии onclick я хочу иметь объекты File, чтобы я мог проверить их (проверить, являются ли они каталогами и т. Д.). Если я заставлю getElementAt() вернуть строку, я теряю эту возможность, поэтому я хотел бы узнать, есть ли способ отформатировать мои объекты File до того, как JList покажет их в моем окне или, если есть, простой и элегантный способ сделать это.

Спасибо

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

Я бы расширил DefaultListCellRenderer, чтобы добавить ваш пользовательский код по двум причинам:

a) вы получите поведение по умолчанию для рендерера по умолчанию, например Границы, выделение выделения строк ...
б) Рендерер (как и все рендеры Swing) оптимизирован для ускорения рисования.

class MyRenderer extends DefaultListCellRenderer
{
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
        Component c = super.getListCellRendererComponent(list,value,index,false,false) ;
        JLabel label = (JLabel)c;

        label.setText(...);

        return c ;
    }
}

Прочтите раздел из учебника по Swing на Как использовать списки для получения дополнительной информации о средствах визуализации.

2 голосов
/ 13 мая 2010

Лучшее, что вы можете сделать, - это использовать средства визуализации. Средства визуализации, как вы можете понять из названия, используются для воспроизведения V для данных поддержки M в парадигме MVC. В этом случае ваши File являются данными поддержки, и средство визуализации используется для отображения только той части File, которую вы хотите отобразить.

Если бы вы внедрили пользовательский рендерер ячеек, расширив JLabel и реализовав ListCellRenderer, вы могли бы начать с простой попытки, реализовав один интерфейсный метод, подобный этому:

 public Component getListCellRendererComponent(JList list,
                                               Object value,
                                               int index,
                                               boolean isSelected,
                                               boolean cellHasFocus) {

     setText(((File)value).getName());
     return this;
 }

Взгляните на ListCellRenderer javadoc для получения дополнительных указаний.

...