2013-09-11 3 views
0

프로젝트의 저장소 제품을 관리하는 응용 프로그램을 빌드하고 있습니다. 나는 문제에 직면하고있어 정말 그것을 해결하기 위해 당신의 생각이 필요합니다.JTable의 각 행에 다른 이미지 표시

DefaultTableCellRenderer를 사용하여 기본 화면에서 제품 기본 정보 테이블에 이미지를 성공적으로 보여줍니다. 하지만 모든 제품에 대해 1 개의 이미지 만 표시 할 수 있습니다. 각 제품마다 이미지가 다르므로 제품 기본 정보 JTable의 각 행마다 다른 이미지를 표시해야합니다.

여기 내 작품이 있습니다.

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); 
} 

이것은 :

내하는 DefaultTableCellRenderer 확장 클래스 내 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) 
) 

고맙습니다.

+0

당신은 항상 같은 이미지를 설정하는 : 렌더러는 위치와 무엇을해야 곳이 결정하는 테이블에 달려으로 stBounds를 사용하지 마십시오 S – nachokk

+0

, 그것은 아무런 영향을 미치지 않습니다 크기 – MadProgrammer

+0

'제품'과 그 '이미지'를 함께 묶는 것이 있습니까? –

답변

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; 
    } 
    
+0

좀 더 자세히 알려 주실 수 있습니까? 나는 아직도 내 마음 속에 당신의 생각을 세울 수 없다. –

+0

무엇에 관한 세부 사항? 너 이해 하지마? – camickr

+0

나는 당신이 말한 것처럼 렌더링을 사용하도록 테이블을 어떻게 말할 수 있을지 아직도 고민 중이다. 이것은 나와 아주 새로운 것입니다. –

관련 문제