Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为JTable中的每一行显示不同的图像_Java_Swing_Jtable_Icons_Abstracttablemodel - Fatal编程技术网

Java 为JTable中的每一行显示不同的图像

Java 为JTable中的每一行显示不同的图像,java,swing,jtable,icons,abstracttablemodel,Java,Swing,Jtable,Icons,Abstracttablemodel,我正在为我的项目构建一个应用程序来管理商店的产品。我正面临一个问题,我真的需要你的想法来解决它 我使用DefaultTableCellRenderer在主屏幕上成功地显示了产品基本信息表中的图像。但我只能为所有产品显示一个图像。每个产品都有不同的图像,因此我需要在product basic info JTable中为每一行显示不同的图像 这是我的一些作品 这是我的DefaultTableCellRenderer扩展类: class ImageRenderer extends DefaultTab

我正在为我的项目构建一个应用程序来管理商店的产品。我正面临一个问题,我真的需要你的想法来解决它

我使用DefaultTableCellRenderer在主屏幕上成功地显示了产品基本信息表中的图像。但我只能为所有产品显示一个图像。每个产品都有不同的图像,因此我需要在product basic info 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;
    }

非常感谢。

无需创建自定义渲染器。JTable已经支持渲染器显示图标。因此,您需要做的就是:

  • 在模型中为每行存储图标,与为每行存储其他文本的方式相同
  • 重写模型的getColumnClass()方法,以告知表使用图标渲染器。比如:

    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;
    }
    
    public类getColumnClass(int列)
    {
    对于(int row=0;row

  • 您总是在设置相同的图像:SDon不使用stBounds,它没有任何效果,因为它取决于表来确定渲染器的位置和大小。您是否有将
    product
    及其
    image
    连接在一起的东西?是什么将产品链接到实际图片?照片存放在哪里?你能告诉我更多细节吗?我还是无法在脑海中建立你的想法关于什么的细节?你还不明白什么?我还在研究如何告诉表使用你说的渲染。你知道,这对我来说是很新的。我告诉过你要重写什么方法,并给了你要添加到模型中的代码。
    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)
    )
    
    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;
    }