Показать разные изображения для каждой строки в JTable

Я создаю приложение для управления продуктом магазина для своего проекта. Я столкнулся с проблемой, и мне очень нужна ваша идея, чтобы решить ее.

Я успешно показываю изображение в таблице базовой информации о продукте на главном экране, используя DefaultTableCellRenderer. Но я могу показать только 1 изображение для всего продукта. Каждый продукт имеет свое изображение, поэтому мне нужно отображать разные изображения для каждой строки в основной информации о продукте JTable.

Вот некоторые фрагменты моей работы.

Это мой расширенный класс DefaultTableCellRenderer:

class ImageRenderer extends DefaultTableCellRenderer {
 JLabel lbl = new JLabel();

 ImageIcon icon = new ImageIcon("./src/comicbookandgamingzone/productpicture/NFS-Shift-2-Unleashed-Limited-Edition-Revealed-2.jpg");
 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
  boolean hasFocus, int row, int column) {
lbl.setText((String) value);
lbl.setIcon(icon);
lbl.setBounds(0, 0, 100, 100);
return lbl;
 }
}

Пользовательская модель таблицы с базовой информацией о продукте

class ProductTableModel extends AbstractTableModel{
String[] colname = {"ID","Picture","Name","Cost","In stock"};
ArrayList<Product> list;
public ProductTableModel(ArrayList<Product> prolist){
    this.list=prolist;
}
public String getColumnName(int col){
    return colname[col];
}
@Override
public int getRowCount() {
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    return list.size();
}

@Override
public int getColumnCount() {
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    return colname.length;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    switch(columnIndex){
        case 0: return list.get(rowIndex).ID;
        case 1: return list.get(rowIndex).Picture;
        case 2: return list.get(rowIndex).Name;
        case 3: return list.get(rowIndex).Cost;
        case 4: return list.get(rowIndex).Stock;
        default : return null;
    }

... и в методе результата показа

public void ShowResult(ArrayList<Product> list){
    tabProduct.setModel(new ProductTableModel(list));
    tabProduct.getColumnModel().getColumn(1).setCellRenderer(new ImageRenderer());
    tabProduct.setRowHeight(100);
}

Это мой сценарий создания таблицы SQL. Я сохраняю путь к изображению продукта в базе данных

create table ProductDetails
(
ProductID int identity (1,1) not null,
ProductTypeID int foreign key references ProductType(TypeID),
ProductName text,
ProductPicture text,
ProductCost float,
ProductPoint int,
ProductStock int,
primary key (ProductID)
)

Спасибо большое.


person Minh Hikari    schedule 11.09.2013    source источник
comment
вы всегда устанавливаете одно и то же изображение: S   -  person nachokk    schedule 11.09.2013
comment
Не используйте stBounds, это не имеет никакого эффекта, так как таблица определяет, где должен находиться рендерер и какого размера.   -  person MadProgrammer    schedule 11.09.2013
comment
У вас есть что-то, что связывает product и его image вместе?   -  person PM 77-1    schedule 11.09.2013
comment
Что связывает продукт с реальным изображением? Где хранятся картинки?   -  person MadProgrammer    schedule 11.09.2013


Ответы (1)


Нет необходимости создавать собственный рендерер. JTable уже поддерживает визуализатор для отображения значка. Итак, все, что вам нужно сделать, это:

  1. сохраните значок в модели для каждой строки так же, как вы сохраняете другой текст для каждой строки.
  2. Переопределите метод модели getColumnClass(), чтобы указать таблице использовать средство визуализации Icon. Что-то типа:

    public Class getColumnClass(int column)
    {
        for (int row = 0; row < getRowCount(); row++)
        {
            Object o = getValueAt(row, column);
    
            if (o != null)
                return o.getClass();
        }
    
        return Object.class;
    }
    
person camickr    schedule 11.09.2013
comment
Можете ли вы дать мне более подробную информацию, пожалуйста? Я все еще не могу построить твою идею в своем уме - person Minh Hikari; 11.09.2013
comment
Подробности о чем? Что ты не понимаешь? - person camickr; 11.09.2013
comment
Я все еще работаю над тем, как я могу сказать таблице использовать рендеринг, как вы сказали. Это совершенно новое для меня, вы знаете. - person Minh Hikari; 11.09.2013
comment
Я сказал вам, какой метод переопределить, и дал вам код, который нужно добавить в вашу модель. - person camickr; 11.09.2013