JTable实现行号-动态增删【转】

JTable实现的TableHeader应该算是ColumnHeader,显示的是列标题。这里说的RowHeader指的是行标题,也就是行号。JTable已经默认实现了ColumnHeader,但却没有实现RowHeader。那么如何实现RowHeader?这就要通过JScrollPane,实际上JTable的ColumnHeader也是这么实现的。先来看看JScrollPane的结构:

                                    

     可知,JScrollPane具有column header和row header区域,可以通过setColumnHeaderView(Component view) 和setRowHeaderView(Component view)分别为它们添加相应的外观组件。参数是Component,所以任何Swing组件都可以添加。在将JTable加入JScrollPane中时,Swing已经默认将JTable的标题设置为JScrollPane的column header。我们只要采取相同的的方法就可以为JTable生成RowHeader。要想为JTable显示行号,就要有与JTable一样的属性特质,那么什么组件适合呢?自然还是JTable了,我们只要在JScrollPane的row header区域添加一个只有一列的JTable,并保证它与中间显示的JTable同步具有相同列数就行了。当然还要实现,当选择某行时,该行号突出显示等等功能。这就要自己实现TableCellRenderer,并且还要让它实现ListSelectionListener以相应JTable的选择某行的事件。

     我已经将RowHeader封装成一个组件RowHeaderTable,构造方法是,

               public RowHeaderTable(JTable refTable,int columnWidth)

refTable是需要加RowHeader的表,columnWidth是RowHeader显示的宽度。只要将RowHeaderTable加入JScrollPane的row header区域即可为JTable生成行标题。不多说,贴代码:

      

效果图

Java代码   收藏代码
  1. import javax.swing.*;     
  2. import java.awt.*;     
  3. import javax.swing.table.*;     
  4. import javax.swing.event.*;     
  5. import java.awt.event.*;     
  6. class TableRowHeaderTest      
  7. {     
  8.     public static void main(String[] args)      
  9.     {     
  10.         new TableRowHeaderFrame();     
  11.     }     
  12. }     
  13. class TableRowHeaderFrame extends JFrame     
  14. {     
  15.     public TableRowHeaderFrame(){     
  16.         DefaultTableModel model = new DefaultTableModel(50,10);     
  17.         JTable table = new JTable(model);     
  18.         /*将table加入JScrollPane*/    
  19.         JScrollPane scrollPane = new JScrollPane(table);     
  20.         /*将rowHeaderTable作为row header加入JScrollPane的RowHeaderView区域*/    
  21.         scrollPane.setRowHeaderView(new RowHeaderTable(table,40));     
  22.         this.getContentPane().add(scrollPane,BorderLayout.CENTER);     
  23.         this.setVisible(true);     
  24.         this.setSize(400,200);     
  25.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
  26.     }     
  27. }     
  28.     
  29. /**   
  30.  * 用于显示RowHeader的JTable,只需要将其加入JScrollPane的RowHeaderView即可为JTable生成行标题   
  31.  */    
  32. class RowHeaderTable extends JTable     
  33. {     
  34.     private JTable refTable;//需要添加rowHeader的JTable     
  35.     /**   
  36.      * 为JTable添加RowHeader,   
  37.      * @param refTable 需要添加rowHeader的JTable     
  38.      * @param columnWideth rowHeader的宽度   
  39.      */    
  40.     public RowHeaderTable(JTable refTable,int columnWidth){     
  41.         super(new RowHeaderTableModel(refTable.getRowCount()));     
  42.         this.refTable=refTable;     
  43.         this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//不可以调整列宽     
  44.         this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth);     
  45.         this.setDefaultRenderer(Object.class,new RowHeaderRenderer(refTable,this));//设置渲染器     
  46.         this.setPreferredScrollableViewportSize (new Dimension(columnWidth,0));     
  47.     }     
  48. }     
  49. /**   
  50.  * 用于显示RowHeader的JTable的渲染器,可以实现动态增加,删除行,在Table中增加、删除行时RowHeader   
  51.  * 一起变化。当选择某行时,该行颜色会发生变化   
  52.  */    
  53. class RowHeaderRenderer extends JLabel implements TableCellRenderer,ListSelectionListener     
  54. {     
  55.     JTable reftable;//需要添加rowHeader的JTable     
  56.     JTable tableShow;//用于显示rowHeader的JTable     
  57.     public RowHeaderRenderer(JTable reftable,JTable tableShow)     
  58.     {     
  59.         this.reftable = reftable;     
  60.         this.tableShow=tableShow;     
  61.         //增加监听器,实现当在reftable中选择行时,RowHeader会发生颜色变化     
  62.         ListSelectionModel listModel=reftable.getSelectionModel();     
  63.         listModel.addListSelectionListener(this);      
  64.     }     
  65.     public Component getTableCellRendererComponent(JTable table,Object obj,     
  66.         boolean isSelected,boolean hasFocus,int row, int col)     
  67.     {     
  68.         ((RowHeaderTableModel)table.getModel()).setRowCount(reftable.getRowCount());     
  69.         JTableHeader header = reftable.getTableHeader();     
  70.         this.setOpaque(true);     
  71.         setBorder(UIManager.getBorder("TableHeader.cellBorder"));//设置为TableHeader的边框类型     
  72.         setHorizontalAlignment(CENTER);//让text居中显示     
  73.         setBackground(header.getBackground());//设置背景色为TableHeader的背景色       
  74.         if ( isSelect(row) )    //当选取单元格时,在row header上设置成选取颜色      
  75.         {     
  76.             setForeground(Color.white);     
  77.             setBackground(Color.lightGray);     
  78.         }     
  79.         else    
  80.         {     
  81.             setForeground(header.getForeground());        
  82.         }     
  83.         setFont(header.getFont());     
  84.         setText(String.valueOf(row+1));     
  85.         return this;     
  86.     }     
  87.     public void valueChanged(ListSelectionEvent e){     
  88.         this.tableShow.repaint();     
  89.     }     
  90.     private boolean isSelect(int row)     
  91.     {     
  92.         int[] sel = reftable.getSelectedRows();     
  93.         for ( int i=0; i<sel.length; i++ )     
  94.             if (sel[i] == row )      
  95.                 return true;     
  96.         return false;     
  97.     }     
  98. }     
  99.     
  100. /**   
  101.  * 用于显示表头RowHeader的JTable的TableModel,不实际存储数据   
  102.  */    
  103. class RowHeaderTableModel extends AbstractTableModel     
  104. {     
  105.     private int rowCount;//当前JTable的行数,与需要加RowHeader的TableModel同步     
  106.     public RowHeaderTableModel(int rowCount){     
  107.         this.rowCount=rowCount;     
  108.     }     
  109.     public void setRowCount(int rowCount){     
  110.         this.rowCount=rowCount;     
  111.     }     
  112.     public int getRowCount(){     
  113.         return rowCount;     
  114.     }     
  115.     public int getColumnCount(){     
  116.         return 1;     
  117.     }     
  118.     public Object getValueAt(int row, int column){     
  119.         return row;     
  120.     }     
  121. }    

 

你可能感兴趣的:(java,swing,jtable,显示行号)