Как добавить изображение в ячейку JTable?

У меня есть JTable, созданный в режиме разработки Netbeans. В своем коде я решил разместить следующую строку кода при запуске:

model = new TableModel();
tbShares.setAutoCreateColumnsFromModel(false);
tbShares.setModel(model);

tbShares — это мой объект JTable.

JFrame, содержащий мой JTable, показан ниже:

менеджер общих ресурсов

Первый столбец был установлен как тип Object (два других — строки), поэтому он может отображать изображение. У меня есть этот код, который я набрал для загрузки изображения, но он не работает (часть list.add, остальное должно дать вам представление о том, как устроен мой код). Это расширение AbstractTableModel.

public void addRegister(String status, String name, String clients){
        ImageIcon activeStatus = new ImageIcon(CleanSheets.class.getResource("res/img/active.png"));
        ImageIcon inactiveStatus = new ImageIcon(CleanSheets.class.getResource("res/img/inactive.png"));
        list.add(new Register((status.equals("true") ? activeStatus : inactiveStatus), name, clients));
        this.fireTableDataChanged();
    }

    class Register{
        Object status;
        String name;
        String clients;

        public Register(Object status, String name, String clients) {
            this.status = status;
            this.name = name;
            this.clients = clients;
        }
    }

Предположительно, он берет изображения из указанной мной папки, но затем просто выводит текст в этом столбце вместо фактического изображения. Как мне заставить его показывать правильное изображение? Спасибо.


person swiftcode    schedule 07.06.2012    source источник


Ответы (2)


Вам следует повторно реализовать TableCellRenderer попытаться прочитать эту короткая статья

person Sergii Zagriichuk    schedule 07.06.2012

ImageIcon activeStatus = новый ImageIcon(CleanSheets.class.getResource("res/img/active.png")); ImageIcon inactiveStatus = новый ImageIcon(CleanSheets.class.getResource("res/img/inactive.png"));

  • подготовьте Icon/ImageIcon как локальную переменную, потому что Renderer воссоздавая эти Objects на каждом из Mouse or Key events, происходит куча событий в сумасшедший период

this.fireTableDataChanged();

  • правильный уведомитель для добавления/удаления целых JTable содержимого, для TableCell есть fireTableCellXxx()

  • в этом контексте (добавьте только одну строку к TableModel) о fireTableRowsInserted()

Как мне заставить его показывать правильное изображение?

  • как я вижу, вы добавляете новую строку, затем добавляете Icon / ImageIcon к TableModel напрямую, больше никаких преобразований, объявляете обязательным, нет проблем, JTable реализовал Icon / ImageIcon в API

  • не используйте Renderer, если Icon / ImageIcon не изменена форма Mouse or Key events

person mKorbel    schedule 07.06.2012
comment
Хорошо, я поместил их как локальные переменные. Однако fireTableRowsInserted() запрашивает строку и столбец. Как получить текущую строку и столбец, которые были вставлены? А что касается ImageIcon, то тут я в растерянности. Изображение меняется при включении/отключении общего ресурса, потому что значок общего ресурса должен быть обновлен. - person swiftcode; 07.06.2012
comment
Да, эта реализация использует векторы для хранения данных, это не имеет ничего общего с моей. Я сделал это с помощью this.fireTableRowsInserted(tbShares.getRowCount(), tbShares.getColumnCount()); Однако это не моя главная цель - я просто хочу показать изображение. - person swiftcode; 07.06.2012
comment
Хорошо...? Вот почему я задал конкретный вопрос о Stack Overflow, чтобы люди с большим опытом не осуждали меня и пытались помочь, а не критиковать. Я много раз объяснял, что хочу только, чтобы изображение работало. Но поскольку вы продолжаете ссылаться на документацию, которую я уже прочитал, мне не потребуется от вас никакой дополнительной «помощи». Хорошего дня, сэр. - person swiftcode; 07.06.2012