`

为JTable添加RowHeader(行号等..)

阅读更多

 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生成行标题。不多说,贴代码:

      

效果图

import javax.swing.*;   
import java.awt.*;   
import javax.swing.table.*;   
import javax.swing.event.*;   
import java.awt.event.*;   
class TableRowHeaderTest    
{   
    public static void main(String[] args)    
    {   
        new TableRowHeaderFrame();   
    }   
}   
class TableRowHeaderFrame extends JFrame   
{   
    public TableRowHeaderFrame(){   
        DefaultTableModel model = new DefaultTableModel(50,10);   
        JTable table = new JTable(model);   
        /*将table加入JScrollPane*/  
        JScrollPane scrollPane = new JScrollPane(table);   
        /*将rowHeaderTable作为row header加入JScrollPane的RowHeaderView区域*/  
        scrollPane.setRowHeaderView(new RowHeaderTable(table,40));   
        this.getContentPane().add(scrollPane,BorderLayout.CENTER);   
        this.setVisible(true);   
        this.setSize(400,200);   
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    }   
}   
  
/**  
 * 用于显示RowHeader的JTable,只需要将其加入JScrollPane的RowHeaderView即可为JTable生成行标题  
 */  
class RowHeaderTable extends JTable   
{   
    private JTable refTable;//需要添加rowHeader的JTable   
    /**  
     * 为JTable添加RowHeader,  
     * @param refTable 需要添加rowHeader的JTable    
     * @param columnWideth rowHeader的宽度  
     */  
    public RowHeaderTable(JTable refTable,int columnWidth){   
        super(new RowHeaderTableModel(refTable.getRowCount()));   
        this.refTable=refTable;   
        this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//不可以调整列宽   
        this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth);   
        this.setDefaultRenderer(Object.class,new RowHeaderRenderer(refTable,this));//设置渲染器   
        this.setPreferredScrollableViewportSize (new Dimension(columnWidth,0));   
    }   
}   
/**  
 * 用于显示RowHeader的JTable的渲染器,可以实现动态增加,删除行,在Table中增加、删除行时RowHeader  
 * 一起变化。当选择某行时,该行颜色会发生变化  
 */  
class RowHeaderRenderer extends JLabel implements TableCellRenderer,ListSelectionListener   
{   
    JTable reftable;//需要添加rowHeader的JTable   
    JTable tableShow;//用于显示rowHeader的JTable   
    public RowHeaderRenderer(JTable reftable,JTable tableShow)   
    {   
        this.reftable = reftable;   
        this.tableShow=tableShow;   
        //增加监听器,实现当在reftable中选择行时,RowHeader会发生颜色变化   
        ListSelectionModel listModel=reftable.getSelectionModel();   
        listModel.addListSelectionListener(this);    
    }   
    public Component getTableCellRendererComponent(JTable table,Object obj,   
        boolean isSelected,boolean hasFocus,int row, int col)   
    {   
        ((RowHeaderTableModel)table.getModel()).setRowCount(reftable.getRowCount());   
        JTableHeader header = reftable.getTableHeader();   
        this.setOpaque(true);   
        setBorder(UIManager.getBorder("TableHeader.cellBorder"));//设置为TableHeader的边框类型   
        setHorizontalAlignment(CENTER);//让text居中显示   
        setBackground(header.getBackground());//设置背景色为TableHeader的背景色     
        if ( isSelect(row) )    //当选取单元格时,在row header上设置成选取颜色    
        {   
            setForeground(Color.white);   
            setBackground(Color.lightGray);   
        }   
        else  
        {   
            setForeground(header.getForeground());      
        }   
        setFont(header.getFont());   
        setText(String.valueOf(row+1));   
        return this;   
    }   
    public void valueChanged(ListSelectionEvent e){   
        this.tableShow.repaint();   
    }   
    private boolean isSelect(int row)   
    {   
        int[] sel = reftable.getSelectedRows();   
        for ( int i=0; i<sel.length; i++ )   
            if (sel[i] == row )    
                return true;   
        return false;   
    }   
}   
  
/**  
 * 用于显示表头RowHeader的JTable的TableModel,不实际存储数据  
 */  
class RowHeaderTableModel extends AbstractTableModel   
{   
    private int rowCount;//当前JTable的行数,与需要加RowHeader的TableModel同步   
    public RowHeaderTableModel(int rowCount){   
        this.rowCount=rowCount;   
    }   
    public void setRowCount(int rowCount){   
        this.rowCount=rowCount;   
    }   
    public int getRowCount(){   
        return rowCount;   
    }   
    public int getColumnCount(){   
        return 1;   
    }   
    public Object getValueAt(int row, int column){   
        return row;   
    }   
}  

 

分享到:
评论
1 楼 liuwangxia 2011-07-15  
很好!
不过RowHeader似乎不能Resize,能否实现此功能?

相关推荐

    JTable数据导出到Excel.rar

    综上所述,"JTable数据导出到Excel.rar"的资源为开发者提供了一种实现方式,将Java Swing应用中的`JTable`数据导出到Excel,方便数据处理和分享。通过理解和应用这些知识点,我们可以创建更加功能丰富的Java桌面应用...

    带有行号显示功能的JTable

    自己写的一个继承自JTable的带有行号显示功能的表格,支持增删,设置行高等动态操作。

    2.高级Swing组件JTable应用[归纳].pdf

    JTable 的展示方式可以通过设置表格的宽度和高度、显示表头、添加列、设置列的编辑器等方式进行美化。例如,可以设置表格的宽度和高度,以适应不同的屏幕分辨率。 JTable 事件响应 JTable 支持事件响应,可以监听...

    JTable的使用收藏

    JTable的使用收藏 1.JTable与TableModel 1.TableModel与JTable的关系 2.TableModel实践 3.使用JTable+TableModel展示java中的数据对象 2.JTable展示方式的美化 1.设置表格的宽度和高度 2.要显示表头 3.新加列,将...

    JTable添加CheckBox

    同时,我们还需要为表头添加一个可选的`JCheckBox`,这可以通过自定义`TableCellRenderer`实现。`CheckHeaderCellRenderer.java`应该包含了这个自定义渲染器的实现。 ```java public class TestFrame extends ...

    java 给JTable更换表标题Demo.rar

    主要代码: DefaultTableModel model = (DefaultTableModel) table.getModel(); model.setColumnIdentifiers(new String[] {"标题一", "标题二", "标题三"});

    一个jTable的示例文件.rar

    在Java Swing库中,JTable是一个非常重要的组件,它用于展示二维数据,通常与数据库、数组或Vector等数据源关联。这个"一个jTable的示例文件.rar"应该包含了一个演示如何使用JTable的Java程序。尽管标签是"C#",但...

    Jtable动态添加删除搜索

    `JTable` 提供了丰富的功能,如数据编辑、排序、筛选等。在这个特定的场景中,"Jtable动态添加删除搜索"指的是在`JTable`上实现动态的数据增删查改功能。 1. **动态添加**:在`JTable`中动态添加数据通常涉及以下...

    JTable的介绍.doc

    `JFrame`的`contentPane`添加了`JScrollPane`,并设置布局管理器为`BorderLayout.CENTER`,使得表格居中显示。最后,`JFrame`设置了标题、调整大小并显示出来。 表格由两部分构成:行标题(Column Header)和行对象...

    一个jTable的示例文件.zip

    尽管标签指定为"C#",但这里我们将主要讨论与`JTable`相关的Java知识点,因为标题和描述并未明确指出是在C#中实现。 1. **JTable的基本结构**: `JTable`是`javax.swing.JTable`类的实例,它由`TableModel`(数据...

    JTable (动态添加数据)

    DefaultTableModel model = (DefaultTableModel) jTable.getModel(); model.addRow(new Object[]{myBean.getValue1(), myBean.getValue2(), myBean.getValue3()}); ``` 5. **数据持久化:Sql Server数据库**: ...

    javaswingJtable资源

    JTable 是java窗体应用,关于布局,JTable的方法和一些其他的运用

    JAVA表格控件JTable常用操作详解.doc

    1. **关闭自动调整宽度**:`table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF)`,防止列宽随窗口大小改变而自动调整。 2. **设置列宽限制**:通过`TableColumn`对象的`setPreferredWidth`, `setMaxWidth`和`...

    java表格控件JTable常用操作详解.pdf

    1. 设置列不可随容器组件大小变化自动调整宽度:`table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);` 这种方式可以禁止表格列的自动调整宽度。 2. 限制某列的宽度:`TableColumn firsetColumn = table....

    Jtable中加入复选框的两种方法

    JTable中加入复选框的两种方法 在Java中,JTable是一个常用的表格控件,用于显示和编辑表格...通过使用CheckBoxRenderer类和CheckButtonEditor类,我们可以轻松地将复选框添加到JTable中,并实现复杂的表格编辑功能。

    JTable常见用法细则.doc

    - **代码示例**:`table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);` - **解释**:这将禁止列宽随着容器大小的变化而自动调整。 2. **固定某列的宽度**: - **代码示例**: ```java TableColumn firstColumn...

    Swing中JTABLE中添加JBUTTON控件

    将`JButton`添加到`JTable`中可以为用户提供更丰富的交互体验,例如编辑、删除或自定义操作。本文将详细讲解如何在`JTable`中添加`JButton`控件,并探讨其可能的拓展应用。 首先,我们需要理解`JTable`的基本结构。...

    jtable中放多个Button.rar

    在Java的Swing库中,JTable是一种非常重要的组件,用于展示二维数据表格。而将多个Button放入JTable的同一单元格中,可以提供更丰富的交互性,这在某些复杂的应用场景下是必要的。本教程将详细介绍如何在JTable中...

    基于java的学籍管理系统.实现了JTable控件的封装

    基于java的学籍管理系统.实现了JTable控件的封装.-.rar基于java的学籍管理系统.实现了JTable控件的封装.-.rar基于java的学籍管理系统.实现了JTable控件的封装.-.rar

    将JTable数据导出到Excel

    cell.setCellValue(jTable.getColumnModel().getColumn(i).getHeaderValue().toString()); } // 将JTable的数据写入Excel的剩余行 for (int i = 0; i ; i++) { Row dataRow = sheet.createRow(i + 1); for ...

Global site tag (gtag.js) - Google Analytics