📄 tablecontent.java
字号:
package test.table;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.DefaultTableModel;
/**
*
* @author fanhoujun
*
*/
public class TableContent {
private static final int MAX_COLUMN=128;//定义表格的最大列数
private List<CellData> list=new ArrayList<CellData>();
private int rowCount=0;
private boolean isNewLine=true;
/**
* 连续多次调用等同于一次调用。
*/
public void println(){
if(isNewLine){
return;
}
list.add(null);
rowCount++;
isNewLine=true;
}
public void append(Object value){
append(value,1,1);
}
public void append(Object value,int colSpan){
append(value,colSpan,1);
}
public void append(Object value,int colSpan,int rowSpan){
if(colSpan<1||rowSpan<1){
throw new IllegalArgumentException("colSpan和rowSpan都必需大于0(colSpan:+"+colSpan+",rowSpan:"+rowSpan+")");
}
if(isNewLine){
isNewLine=false;
}
list.add(new CellData(value,colSpan,rowSpan));
}
public DTable createTable(){
return createTable(null);
}
@SuppressWarnings("unchecked")
public DTable createTable(Object[]columnHeaders){
println();
List<CellData>[] listData=new List[rowCount];
for (int i = 0; i < listData.length; i++) {
listData[i]=new ArrayList<CellData>();
}
CellData[][] cover=new CellData[rowCount][100];//记录被跨过(覆盖的)单元格
int cusorRow=0;//行游标
int cusorCol=0;//列游标
int column=0;//记录表格的列数(取所有行的最多列)
for (CellData cellData : list) {
if(cellData!=null){
if(cusorCol==MAX_COLUMN){
throw new RuntimeException("表格的列数不能超过"+MAX_COLUMN+"列");
}
while(cover[cusorRow][cusorCol]!=null){
cusorCol++;
listData[cusorRow].add(null);
}
listData[cusorRow].add(cellData);
setSpanHidden(cusorRow, cusorCol, cellData, cover);
while(cover[cusorRow][++cusorCol]!=null){
listData[cusorRow].add(null);
}
}else{
column=column<cusorCol?cusorCol:column;
cusorCol=0;
cusorRow++;
}
}
if(columnHeaders==null){
columnHeaders=new Object[column];
}
return new DTable(new GridSplitImpl(listData,cover),createTableModel(listData,columnHeaders));
}
private DefaultTableModel createTableModel(List<CellData>[] listData,Object[] columnHeaders){
Object[][]data=new Object[listData.length][columnHeaders.length];
int row=0;
for(List<CellData> rowList:listData){
int col=0;
for(CellData cellData:rowList){
data[row][col++]=cellData==null?null:cellData.getValue();
}
row++;
}
return new DefaultTableModel(data,columnHeaders);
}
/**
* 将该单元跨过的其他单元格的状态设为隐藏
* @param row
* @param col
*/
private void setSpanHidden(int row,int col,CellData cellData,CellData[][] cover){
if(cellData.getColSpan()<2&&cellData.getRowSpan()<2){
return;
}
CellData coverData=CellData.creatHiddenCell(row, col);
if(col+cellData.getColSpan()>=MAX_COLUMN){
throw new RuntimeException("表格的列数不能超过"+MAX_COLUMN+"列");
}
for(int i=0;i<cellData.getColSpan();i++){
for(int j=0;j<cellData.getRowSpan();j++){
if(row+j<cover.length){
cover[row+j][col+i]=coverData;
}else{
cellData.setRowSpan(j);
}
}
}
cover[row][col]=null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -