Показать простое имя объекта файла в JList - PullRequest
0 голосов
/ 31 октября 2018

Когда я добавляю объект файла в DefaultListModel, который используется для создания JList, с model.addElement(file), отображаемый текст в JList является путем к файлу. Но я только хочу, чтобы имя файла отображалось. Однако я не могу сделать model.addElement(file.getName()), потому что в дальнейшем мне нужен доступ к объекту файла, а не только к строке.

Как добавить объект файла в список / модель, отображая только имя файла? Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Это можно сделать, создав пользовательский рендер:

class FileRenderer extends DefaultListCellRenderer
{
    public Component getListCellRendererComponent(
        JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

        File file = (File)value;
        setText( file.getName() );

        return this;
    }
}

Затем вы устанавливаете рендер для JList, используя:

list.setCellRenderer( new FileRenderer() );

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

0 голосов
/ 31 октября 2018

Один ужасный способ - создать свой собственный класс файла, отредактировать метод toString(). Посмотрите на мой фрагмент:

import java.io.File;

class OwnFile extends File {

    public OwnFile(String s) {
        super(s);
    }

    @Override
    public String toString() {
        String url = super.toString();
        String [] array = url.split("/");
        return array[array.length-1];
    }
}

Вот пример создания собственного JList с OwnFile. Это хорошо работает для моего случая и показывает spotify.txt в JList вместо src/spotify.txt

import javax.swing.*;
import java.io.File;

public class Main {
    public Main(){
        JFrame frame = new JFrame();
        JList list = new JList();
        list.setModel(new ListModel());
        frame.add(list);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    class ListModel extends DefaultListModel<File>{

        ListModel() {
            addElement(new OwnFile("src/spotify.txt"));
        }
    }
    public static void main(String[] args) {
        new Main();
    }
}
...