2011-04-10 64 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 2011-04-10 21:39:28

+1

imageicon類還有什麼意義。只需將圖像存儲在該列中,並直接使用它,而不是處理這個其他類。 – jzd 2011-04-10 21:40:35

+0

它只是設置列的標題。但要將圖標放在第一列的所有行中。 – bsm 2011-04-10 21:40:49

回答

9

沒有必要創建自定義渲染。 JTable已經支持一個Icon渲染器。你只需要告訴桌子使用這個渲染器。這是通過覆蓋表模型的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

邊注:Java編碼標準規定的類名應以大寫字母開始,所以iconRenderer應該是IconRenderer代替。

+0

謝謝。哦,我怎麼能忘記這個! (關於附註)對不起我的錯誤。 – bsm 2011-04-10 21:47:54