# table **Repository Path**: youngboyvip/table ## Basic Information - **Project Name**: table - **Description**: Java使用JTable生成表格图片并带跨行跨列功能 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 0 - **Created**: 2018-09-05 - **Last Updated**: 2024-06-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # table #### 项目介绍 Java使用JTable生成表格图片并带跨行跨列功能 #### 效果展示 ![效果展示](https://images.gitee.com/uploads/images/2018/0913/212428_a080a86a_1388604.png "image.png") #### 原理说明 自定义`TableModel`使用`CellData`类抽象每个表格中的格子(`cell`),每个cell都有自己的属性比如跨行跨列的属性等等, 然后再覆盖表格的绘制器,在遇到跨行跨列的格子时把跨行跨列的格子画大一点,被跨行挤掉的格子就不绘制出来, 然后使用自定义的JTable把表格渲染出来,然后再生成图片 #### 软件架构 ``` ---CellData.java 格子类描述表格中的每一个单元格 ---ColumnGroup.java 可合并的列 ---DTable.java 自定义JTable继承JTable ---DTableModel.java table模型类继承AbstractTableModel ---DTableUI.java 自定义ui类,渲染表格时会调用 ---GridSplit.java 单元格服务类 主要时对单元格的一些操作 ---GridSplitImpl.java 服务实现类 ---GroupableTableHeader.java 可合并的表头 ---GroupableTableHeaderUI.java 可合并表头ui类 ---GroupHeader.java 合并表头 ---GroupRenderer.java 组渲染器 ---TableContent.java 统一调度类,创建模型和表格 --TestMain.java 测试类 ``` #### 生成图片时注意的问题 使用jframe作为容器绘制 ``` JTable table = createTable(); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JFrame frame = new JFrame(); frame.setSize(0, 0); frame.setLayout(new GridBagLayout()); frame.add(new JScrollPane(table),new GBC(0,0).setWeight(100,100).setFill(GBC.BOTH)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); // frame.setVisible(true); BufferedImage image = createImage(table); frame.dispose(); ImageIO.write(image, "png", new File("D:\\test\\table\\bin\\image.png")); ``` > frame.pack() 窗口不会显示,并且会开始渲染,在没有掉用pack方法之前table是没有渲染的 使用SwingUtilities直接绘制 ``` SwingUtilities.paintComponent(g2D,tableHeaderComp,jPanel,0,0,tableImage.getWidth(),tableImage.getHeight()); ``` > tableHeaderComp jtable组件 jPanel 绘制容器 #### 参与贡献 1. Fork 本项目 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request 参考文章 [https://blog.csdn.net/pandakong/article/details/8727744](https://blog.csdn.net/pandakong/article/details/8727744)