定製JTableHeader

JTableHeader是管理JTable列頭的對象,有方法可以設置默認渲染器(在TableColumn未設置渲染器的情況下)public void setDefaultRenderer(TableCellRenderer defaultRenderer)  。這樣爲JTableHeader設置渲染器可以繪製出自己想要的效果來顯示列頭。還可以通過TableColumn來設置每一列的渲染器,以達到不同列具有不同的渲染效果。在生成JTable時會使用默認的數據模型DefaultTableModel,這樣通過調用toString()方法,就會將輸入的列名數組Object[] columnNames中的元素轉化爲String類型。所以就不可能實現根據列名類型的不同,執行相應的操作,例如,不可能使列名元素類型的Color的列,在列標題上顯示相應的顏色。所以要實現定製JTableHeader,步驟如下:

             1.根據要實現的效果實現TabelCellRenderer。

             2.用表內容,列名初始化JTable後,用上述兩種方法(JTableHeader,TableColumn)設

                置列頭的渲染器。

             3.調用TableColumn的setHeaderValue()方法,重新設置每一列的列名。

下面是兩個例子,1是實現列名顯示圖片,2是將列名顯示爲顏色

 

1是實現列名顯示圖片

[java] view plaincopyprint?

  1. import java.awt.*;     

  2. import javax.swing.*;         

  3. import javax.swing.table.*;      

  4. class IconHeaderCellRenderer implements TableCellRenderer {     

  5.   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,     

  6.       boolean hasFocus, int row, int column) {     

  7.         return (JLabel)value;//由於列名元素的類型爲JLabel,直接返回即可  

  8.   }     

  9. }     

  10. public class IconTableHeader extends JFrame{  

  11.     private Object cells[][] = { { "one""1" }, { "two""2" }, { "three""3" } };     

  12.     private String colName[] = { "1""2" };  

  13.     private JTable table;  

  14.     public IconTableHeader(){  

  15.         this.setTitle("IconTableHeader");  

  16.         table=new JTable(cells,colName);  

  17.         Icon[] colIcon=new Icon[colName.length];  

  18.         colIcon[0]=new ImageIcon("1.gif");  

  19.         colIcon[1]=new ImageIcon("2.gif");  

  20.         JLabel[] colLabel=new JLabel[colName.length];  

  21.         for(int i=0;i<colName.length;i++){  

  22.             colLabel[i]=new JLabel(colName[i], colIcon[i], JLabel.CENTER);    

  23.             //將JLabel的邊框設置爲TabelHeader的邊框  

  24.             colLabel[i].setBorder(UIManager.getBorder("TableHeader.cellBorder"));     

  25.         }  

  26.         IconHeaderCellRenderer renderer=new IconHeaderCellRenderer();  

  27.         TableColumnModel colModel=table.getColumnModel();  

  28.         for(int i=0;i<colModel.getColumnCount();i++){  

  29.             //設置每一列的渲染器,然後爲列名重新賦值  

  30.             colModel.getColumn(i).setHeaderRenderer(renderer);  

  31.             colModel.getColumn(i).setHeaderValue(colLabel[i]);  

  32.         }  

  33.         this.add(new JScrollPane(table),BorderLayout.CENTER);  

  34.         this.setSize(300150);     

  35.         this.setVisible(true);  

  36.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   

  37.     }  

  38.     public static void main(String args[]) {     

  39.         new IconTableHeader();  

  40.     }     

  41. }  

import java.awt.*;   import javax.swing.*;       import javax.swing.table.*;     class IconHeaderCellRenderer implements TableCellRenderer {    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,        boolean hasFocus, int row, int column) {   return (JLabel)value;//由於列名元素的類型爲JLabel,直接返回即可  }   }   public class IconTableHeader extends JFrame{ private Object cells[][] = { { "one", "1" }, { "two", "2" }, { "three", "3" } };   private String colName[] = { "1", "2" }; private JTable table; public IconTableHeader(){ this.setTitle("IconTableHeader"); table=new JTable(cells,colName); Icon[] colIcon=new Icon[colName.length]; colIcon[0]=new ImageIcon("1.gif"); colIcon[1]=new ImageIcon("2.gif"); JLabel[] colLabel=new JLabel[colName.length]; for(int i=0;i<colName.length;i++){ colLabel[i]=new JLabel(colName[i], colIcon[i], JLabel.CENTER);   //將JLabel的邊框設置爲TabelHeader的邊框 colLabel[i].setBorder(UIManager.getBorder("TableHeader.cellBorder"));   } IconHeaderCellRenderer renderer=new IconHeaderCellRenderer(); TableColumnModel colModel=table.getColumnModel(); for(int i=0;i<colModel.getColumnCount();i++){ //設置每一列的渲染器,然後爲列名重新賦值 colModel.getColumn(i).setHeaderRenderer(renderer); colModel.getColumn(i).setHeaderValue(colLabel[i]); } this.add(new JScrollPane(table),BorderLayout.CENTER); this.setSize(300, 150);   this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String args[]) {   new IconTableHeader(); }   }


 

 

 

2是將列名顯示爲顏色

 

[java] view plaincopyprint?

  1. import javax.swing.*;  

  2. import javax.swing.table.*;  

  3. import java.awt.*;  

  4.   

  5. public class ColorTableHeaderTest   

  6. {  

  7.     public static void main(String[] args)   

  8.     {  

  9.         new ColorTableHeaderFrame();  

  10.     }  

  11. }  

  12.   

  13. class ColorTableHeaderFrame extends JFrame  

  14. {  

  15.     private JTable table;  

  16.     private Object[][] cells=new Object[][]{ { "one""1" }, { "two""2" }, { "three""3" } };  

  17.     private String[] columnNames=new String[]{"red","yellow"};  

  18.     public ColorTableHeaderFrame(){  

  19.         table=new JTable(cells,columnNames);  

  20.         TableColumnModel colModel=table.getColumnModel();  

  21.         //設置列標題的渲染器,並重新賦值  

  22.         ColorTableHeaderRenderer renderer=new ColorTableHeaderRenderer();  

  23.         table.getTableHeader().setDefaultRenderer(renderer);  

  24.         colModel.getColumn(0).setHeaderValue(Color.RED);  

  25.         colModel.getColumn(1).setHeaderValue(Color.YELLOW);  

  26.           

  27.         add(new JScrollPane(table),BorderLayout.CENTER);  

  28.         setVisible(true);  

  29.         setSize(300,400);  

  30.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

  31.     }  

  32. }  

  33.   

  34. class ColorTableHeaderRenderer extends JLabel implements TableCellRenderer  

  35. {  

  36.     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,     

  37.       boolean hasFocus, int row, int column) {    

  38.         Color color=(Color)value;  

  39.         setText("  ");//標籤無內容,也不會顯示標題  

  40.         setBackground(color);  

  41.         setOpaque(true);//很重要,設置此組件爲不透明,不設置就不會顯示,  

  42.         setBorder(UIManager.getBorder("TableHeader.cellBorder"));//設置使具有列標題的邊框  

  43.         return this;     

  44.     }     

  45. }  

import javax.swing.*; import javax.swing.table.*; import java.awt.*; public class ColorTableHeaderTest { public static void main(String[] args) { new ColorTableHeaderFrame(); } } class ColorTableHeaderFrame extends JFrame { private JTable table; private Object[][] cells=new Object[][]{ { "one", "1" }, { "two", "2" }, { "three", "3" } }; private String[] columnNames=new String[]{"red","yellow"}; public ColorTableHeaderFrame(){ table=new JTable(cells,columnNames); TableColumnModel colModel=table.getColumnModel(); //設置列標題的渲染器,並重新賦值 ColorTableHeaderRenderer renderer=new ColorTableHeaderRenderer(); table.getTableHeader().setDefaultRenderer(renderer); colModel.getColumn(0).setHeaderValue(Color.RED); colModel.getColumn(1).setHeaderValue(Color.YELLOW); add(new JScrollPane(table),BorderLayout.CENTER); setVisible(true); setSize(300,400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class ColorTableHeaderRenderer extends JLabel implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,        boolean hasFocus, int row, int column) {   Color color=(Color)value; setText("  ");//標籤無內容,也不會顯示標題 setBackground(color); setOpaque(true);//很重要,設置此組件爲不透明,不設置就不會顯示, setBorder(UIManager.getBorder("TableHeader.cellBorder"));//設置使具有列標題的邊框 return this;      }   }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章