【问题标题】:Show different image for each row in JTable为 JTable 中的每一行显示不同的图像
【发布时间】:2013-09-11 02:23:50
【问题描述】:

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

我使用 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)
)

非常感谢。

【问题讨论】:

  • 你总是设置相同的图像:S
  • 不要使用stBounds,它没有任何效果,因为它取决于表格来确定渲染器的位置和大小
  • 你有什么东西可以将product 和它的image 联系在一起吗?
  • 什么将产品与实际图片联系起来?图片存放在哪里?

标签: java swing jtable icons abstracttablemodel


【解决方案1】:

无需创建自定义渲染器。 JTable 已经支持渲染器来显示图标。所以你需要做的就是:

  1. 在模型中为每一行存储图标,就像为每一行存储其他文本一样。
  2. 重写模型的 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;
    }
    

【讨论】:

  • 你能给我更多的细节吗?我仍然无法在脑海中建立你的想法
  • 关于什么的详细信息?你不明白什么?
  • 我仍在研究如何告诉表格使用您所说的渲染。这对我来说很新鲜,你知道的。
  • 我告诉了你要覆盖什么方法,并给了你要添加到模型中的代码。
猜你喜欢
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
相关资源
最近更新 更多