Продолжайте получать одно и то же изображение на jTable

ПеременнаяimgPath продолжает печатать различные ссылки в консоли. Но он дает только последнее изображение (изображение последней назначенной ссылки) в каждой строке.

private void fillTable(){
try {
    DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
    ArrayList<Cab> allCabs = ServerConnector.getInstance().getCabController().getAllCabs();
    for (Cab cab : allCabs) {
        Object[] row = {cab.getId(), "", cab.getLicenceNo()}; 
        dtm.addRow(row);
        imgPath = cab.getImgLink();
        Sysytem.out.println(imgPath);
        jTable1.getColumnModel().getColumn(1).setCellRenderer(new ImageRenderer());
    }

} catch (ClassNotFoundException ex) {
    Logger.getLogger(NewJFrame4.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
    Logger.getLogger(NewJFrame4.class.getName()).log(Level.SEVERE, null, ex);
} catch (NotBoundException ex) {
    Logger.getLogger(NewJFrame4.class.getName()).log(Level.SEVERE, null, ex);
} 

}

////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //////////

class ImageRenderer extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table,Object value, boolean isSelected,boolean hasFocus, int row, int column){
        JLabel label = new JLabel();
        if (value!=null) {
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setIcon(new ImageIcon(imgPath));
        }
        return label;
    }
}

1 ответ

Но он дает только последнее изображение (изображение последней назначенной ссылки) в каждой строке.

Для столбца есть только каждый рендер. Когда ячейка визуализируется, средство визуализации ссылается на переменную "imgPath" (которая может содержать только одну ссылку за раз), которая, конечно, является последним значением, которое вы ей присвоили.

Если вы хотите отобразить изображение в таблице, вам следует сохранить ImageIcon в TableModel. Поэтому вы должны добавить Icon в TableModel, например:

String imgPath = cab.getImgLink();
Object[] row = {cab.getId(), new ImageIcon(imgPath), cab.getLicenceNo()}; 
dtm.addRow(row);

Затем, когда вы создаете DefaultTableModel, вам нужно переопределить getColumnClass() Метод TableModel и JTable будет использовать рендерер по умолчанию для отображения Icon, поэтому вам не нужно писать собственный рендерер.

Вот простой пример:

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableIcon extends JPanel
{
    public TableIcon()
    {
        Icon aboutIcon = new ImageIcon("about16.gif");
        Icon addIcon = new ImageIcon("add16.gif");
        Icon copyIcon = new ImageIcon("copy16.gif");

        String[] columnNames = {"Picture", "Description"};
        Object[][] data =
        {
            {aboutIcon, "About"},
            {addIcon, "Add"},
            {copyIcon, "Copy"},
        };

        DefaultTableModel model = new DefaultTableModel(data, columnNames)
        {
            //  Returning the Class of each column will allow different
            //  renderers to be used based on Class
            public Class getColumnClass(int column)
            {
                return getValueAt(0, column).getClass();
            }
        };
        JTable table = new JTable( model );
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Table Icon");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TableIcon());
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

}
Другие вопросы по тегам