2011-04-10 2 views
5

JTable의 첫 번째 열의 모든 행에서 열의 머리글을 설정할 수 있지만 아이콘을 설정할 수 없습니다. JTable의 열에 아이콘을 설정하는 방법은 무엇입니까?

public class iconRenderer extends DefaultTableCellRenderer{ 
    public Component getTableCellRendererComponent(JTable table,Object obj,boolean isSelected,boolean hasFocus,int row,int column){ 
     imageicon i=(imageicon)obj; 
     if(obj==i) 
      setIcon(i.imageIcon); 
     setBorder(UIManager.getBorder("TableHeader.cellBorder")); 
     setHorizontalAlignment(JLabel.CENTER); 
     return this; 
    } 
} 

public class imageicon{ 
    ImageIcon imageIcon; 
    imageicon(ImageIcon icon){ 
     imageIcon=icon; 
    } 
} 

내 BuildTable() 메소드에 선 아래

.

public void SetIcon(JTable table, int col_index, ImageIcon icon){ 
     table.getTableHeader().getColumnModel().getColumn(col_index).setHeaderRenderer(new iconRenderer()); 
     table.getColumnModel().getColumn(col_index).setHeaderValue(new imageicon(icon)); 
} 

우리는 어떻게 첫번째 컬럼의 모든 행을 위해 그것을 설정할 수 있습니까? for 루프를 시도했지만 아직 아이콘을 설정하는 반복 행을 얻지 못했습니다. 아니면 다른 방법이 있습니까?

+0

이 코드는 현재 어떤 기능을 수행합니까? 무엇이 잘못 되었는가? – jzd

+1

또한 imageicon 클래스의 요점은 무엇입니까? 해당 열에 이미지를 저장하고이 다른 클래스를 다루는 대신 직접 사용하십시오. – jzd

+0

설정 열 머리글 만. 그러나 첫 번째 열의 모든 행에 아이콘을 넣으려고합니다. – bsm

답변

9

사용자 지정 렌더링을 만들 필요가 없습니다. JTable는 이미 아이콘 렌더러를 지원합니다. 테이블에이 렌더러를 사용하기 만하면됩니다. 이 작업은 테이블 모델의 getColumnClass (...) 메소드를 재정 의하여 수행됩니다.

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

} 
2

머리글 렌더링을 위해 iconRenderer를 사용하고 있습니다. 또한 Column의 Cell Reneder를 iconRenderer의 인스턴스로 설정합니다. 열에서 setCellRenderer으로 전화하십시오.

http://download.oracle.com/javase/6/docs/api/javax/swing/table/TableColumn.html#setCellRenderer(javax.swing.table.TableCellRenderer)

사이드 참고 : 자바 표준 클래스 이름은 대문자로 시작해야 지정 코딩, 그래서 iconRenderer 대신 IconRenderer을해야합니다.

+0

고마워. 오 어떻게 내가 그것을 잊을 수 있었느냐! !!! (사이드 노트에 관해서) 미안하다 실수. – bsm