【问题待解】JTable中如何实现多行表头

dachang19 2008-02-18 08:43:55
JTable中如何实现多行表头
例如下面这样的样式:
| 2007年1月 | 2007年2月 | 2007年3月 | 2007年4月 |
|1|2|3|…… |1|2|3|…… |1|2|3|…… |1|2|3|…… |

...全文
1537 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuxingguo0 2010-07-09
  • 打赏
  • 举报
回复
学习了
jaguarlsl 2008-02-29
  • 打赏
  • 举报
回复
如果要是能够让用户拖动宽度就更好了
Jonsen_zyh 2008-02-29
  • 打赏
  • 举报
回复
学习下
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
自问自答。。。。。。table.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF)
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
借冷月的地盘问个问题,在上面代码的基础上,已完成多表头,但是如果我要做12个月,界面肯定太小了,请问如何在上面代码的基础上加水平滚动条?
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.DefaultTableModel;
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("4444444444(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("33333333"+MAX_COLUMN+"2");
}
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);
}
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("11111111"+MAX_COLUMN+"2");
}
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;
}
}


以上就是全部代码。。。。。。。。。。。。。。。
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;

class GroupRenderer extends DefaultTableCellRenderer{
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JTableHeader header = table.getTableHeader();
if (header != null) {
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
setHorizontalAlignment(JLabel.CENTER);
setText((value == null) ? "" : value.toString());
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
return this;
}
}
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class GroupHeader {
public static final String EMPTY_LABEL="EMPTY";

public static boolean isEmpty(TableColumn tableColumn) {
return EMPTY_LABEL.equals(tableColumn.getHeaderValue());
}
private String name;
private int begin = -1;
private int end = -1;
private List<GroupHeader> subHeaders = new ArrayList<GroupHeader>();

public GroupHeader(String name) {
this.name = name;
}

public GroupHeader(String name, int index) {
this(name, index, index);
}

public GroupHeader(String name, int begin, int end) {
this.name = name;
setSpan(begin, end);
}

public int getBeginColumn() {
return begin;
}

public GroupHeader setSpan(int begin, int end) {
this.begin = begin;
this.end = end;
return this;
}

public int getEnd() {
return end;
}

public String getName() {
return name;
}

public GroupHeader setName(String name) {
this.name = name;
return this;
}

public GroupHeader addSubHeader(GroupHeader subHeader) {
subHeaders.add(subHeader);
return this;
}

public ColumnGroup createColumnGroup(TableColumnModel tableColumnModel) {
ColumnGroup columnGroup = new ColumnGroup(name);
if (begin > 0) {
for (int i = begin; i <= end; i++) {
columnGroup.add(tableColumnModel.getColumn(i));
}
}

for (GroupHeader groupHeader : subHeaders) {
columnGroup.add(groupHeader.createColumnGroup(tableColumnModel));
}
return columnGroup;
}
}

RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.JComponent;
import javax.swing.plaf.basic.BasicTableHeaderUI;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.JTableHeader;
class GroupableTableHeaderUI extends BasicTableHeaderUI {

public GroupableTableHeaderUI(JTableHeader header) {
super();
this.header = header;
}

public void paint(Graphics g, JComponent c) {
Rectangle clipBounds = g.getClipBounds();
if (header.getColumnModel() == null)
return;
int column = 0;
Dimension size = header.getSize();
Rectangle cellRect = new Rectangle(0, 0, size.width, size.height);
Hashtable<ColumnGroup, Rectangle> h = new Hashtable<ColumnGroup, Rectangle>();
Enumeration enumeration = header.getColumnModel().getColumns();
while (enumeration.hasMoreElements()) {
cellRect.height = size.height;
cellRect.y = 0;
TableColumn aColumn = (TableColumn) enumeration.nextElement();
Enumeration cGroups = ((GroupableTableHeader) header).getColumnGroups(aColumn);
if (cGroups != null) {
int groupHeight = 0;
while (cGroups.hasMoreElements()) {
ColumnGroup cGroup = (ColumnGroup) cGroups.nextElement();
Rectangle groupRect = (Rectangle) h.get(cGroup);
if (groupRect == null) {
groupRect = new Rectangle(cellRect);
Dimension d = cGroup.getSize(header.getTable());
groupRect.width = d.width;
groupRect.height = d.height;
h.put(cGroup, groupRect);
}
groupHeight += groupRect.height;
cellRect.height = size.height - groupHeight;
cellRect.y = groupHeight;
if(GroupHeader.isEmpty(aColumn)&&!cGroups.hasMoreElements()){
groupRect.height+=cellRect.height;
}
paintCell(g, groupRect, cGroup);
}
}
cellRect.width = aColumn.getWidth();
if (cellRect.intersects(clipBounds)&&!GroupHeader.isEmpty(aColumn)) {
paintCell(g, cellRect, column);
}
cellRect.x += cellRect.width;
column++;
}
}

private void paintCell(Graphics g, Rectangle cellRect, int columnIndex) {
TableColumn aColumn = header.getColumnModel().getColumn(columnIndex);
TableCellRenderer renderer = aColumn.getHeaderRenderer();
Component component = renderer.getTableCellRendererComponent(header
.getTable(), aColumn.getHeaderValue(), false, false, -1,
columnIndex);
rendererPane.add(component);
rendererPane.paintComponent(g, component, header, cellRect.x,
cellRect.y, cellRect.width, cellRect.height, true);
}

private void paintCell(Graphics g, Rectangle cellRect, ColumnGroup cGroup) {
TableCellRenderer renderer = cGroup.getHeaderRenderer();
Component component = renderer.getTableCellRendererComponent(header
.getTable(), cGroup.getHeaderValue(), false, false, -1, -1);
rendererPane.add(component);
rendererPane.paintComponent(g, component, header, cellRect.x,
cellRect.y, cellRect.width, cellRect.height, true);
}

private int getHeaderHeight() {
int height = 0;
TableColumnModel columnModel = header.getColumnModel();
for (int column = 0; column < columnModel.getColumnCount(); column++) {
TableColumn aColumn = columnModel.getColumn(column);
TableCellRenderer renderer = aColumn.getHeaderRenderer();
Component comp = renderer.getTableCellRendererComponent(header
.getTable(), aColumn.getHeaderValue(), false, false, -1,column);
int cHeight= comp.getPreferredSize().height;
Enumeration em = ((GroupableTableHeader) header)
.getColumnGroups(aColumn);
if (em != null) {
while (em.hasMoreElements()) {
ColumnGroup cGroup = (ColumnGroup) em.nextElement();
cHeight += cGroup.getSize(header.getTable()).height;
}
}
height = Math.max(height, cHeight);
}
return height;
}

private Dimension createHeaderSize(long width) {
TableColumnModel columnModel = header.getColumnModel();
width += columnModel.getColumnMargin() * columnModel.getColumnCount();
if (width > Integer.MAX_VALUE) {
width = Integer.MAX_VALUE;
}
return new Dimension((int) width, getHeaderHeight());
}

public Dimension getPreferredSize(JComponent c) {
long width = 0;
Enumeration enumeration = header.getColumnModel().getColumns();
while (enumeration.hasMoreElements()) {
TableColumn aColumn = (TableColumn) enumeration.nextElement();
width = width + aColumn.getPreferredWidth();
}
return createHeaderSize(width);
}
}
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
class GroupableTableHeader extends JTableHeader {
//private static final String uiClassID = "GroupableTableHeaderUI";
protected Vector<ColumnGroup> columnGroups = null;

public GroupableTableHeader(TableColumnModel model) {
super(model);
setUI(new GroupableTableHeaderUI(this));
setReorderingAllowed(false);
}

public void setReorderingAllowed(boolean b) {
reorderingAllowed = false;
}

public void addColumnGroup(ColumnGroup g) {
if (columnGroups == null) {
columnGroups = new Vector<ColumnGroup>();
}
columnGroups.addElement(g);
}

public Enumeration getColumnGroups(TableColumn col) {
if (columnGroups == null)
return null;
Enumeration em = columnGroups.elements();
while (em.hasMoreElements()) {
ColumnGroup cGroup = (ColumnGroup) em.nextElement();
Vector v_ret = (Vector) cGroup.getColumnGroups(col, new Vector());
if (v_ret != null) {
return v_ret.elements();
}
}
return null;
}

public void setColumnMargin() {
if (columnGroups == null)
return;
int columnMargin = getColumnModel().getColumnMargin();
Enumeration em = columnGroups.elements();
while (em.hasMoreElements()) {
ColumnGroup cGroup = (ColumnGroup) em.nextElement();
cGroup.setColumnMargin(columnMargin);
}
}

}

RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
import java.util.List;
class GridSplitImpl implements GridSplit{
List<CellData>[] listData;
CellData[][] cover;
public GridSplitImpl(List<CellData>[] listData,CellData[][] cover){
this.listData=listData;
this.cover=cover;
}
public boolean isVisible(int row, int column) {
if(row>=listData.length||row<0) return true;
return cover[row][column]==null;
}

public int spanCol(int row, int column) {
if(listData[row].size()<column+1||listData[row].get(column)==null){
return 1;
}
return listData[row].get(column).getColSpan();
}

public int spanRow(int row, int column) {
if(listData[row].size()<column+1||listData[row].get(column)==null){
return 1;
}
return listData[row].get(column).getRowSpan();
}

public int visibleColCell(int row, int column) {
if(row>=listData.length||row<0) return -1;
return isVisible(row, column)?column:cover[row][column].getPosCol();
}

public int visibleRowCell(int row, int column) {
if(row>=listData.length||row<0) return -1;
return isVisible(row, column)?row:cover[row][column].getPosRow();
}
}
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
interface GridSplit {
int spanCol(int row, int column);
int visibleColCell(int row, int column);
int spanRow(int row, int column);
int visibleRowCell(int row, int column);
boolean isVisible(int row, int column);
}
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
import javax.swing.table.*;
import javax.swing.plaf.basic.*;
import java.awt.*;
import javax.swing.*;

class DTableUI extends BasicTableUI {
public void paint(Graphics g, JComponent c) {
for(int i=0;i< table.getRowCount();i++){
paintRow(i, g);
}
}

private void paintRow(int row, Graphics g) {
Rectangle clipBounds = g.getClipBounds();
GridSplit gridSplit = ((DTable) table).getGridSplit();
for (int i = 0; i < table.getColumnCount(); i++) {
if (gridSplit.isVisible(row, i)) {
Rectangle rec = table.getCellRect(row, i, true);
if (rec.intersects(clipBounds)) {
paintCell(row, i, g, rec);
}
}
}
}

private void paintCell(int row, int column, Graphics g, Rectangle area) {
int verticalMargin = table.getRowMargin();
int horizontalMargin = table.getColumnModel().getColumnMargin();

Color c = g.getColor();
g.setColor(table.getGridColor());
g.drawRect(area.x, area.y, area.width - 1, area.height - 1);
g.setColor(c);

area.setBounds(area.x + horizontalMargin / 2, area.y + verticalMargin
/ 2, area.width - horizontalMargin, area.height
- verticalMargin);

if (table.isEditing() && table.getEditingRow() == row
&& table.getEditingColumn() == column) {
Component component = table.getEditorComponent();
component.setBounds(area);
component.validate();
} else {
TableCellRenderer renderer = table.getCellRenderer(row, column);
Component component = table.prepareRenderer(renderer, row, column);
if (component.getParent() == null)
rendererPane.add(component);
rendererPane.paintComponent(g, component, table, area.x, area.y,area.width, area.height, true);
}
}

}
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
import java.util.List;
import javax.swing.table.AbstractTableModel;
class DTableModel extends AbstractTableModel{
private List<CellData>[] listData;
private int column;
public DTableModel(List<CellData>[] listData,int column){
this.listData=listData;
this.column=column;
}
public int getColumnCount() {
return column;
}

public int getRowCount() {
return listData.length;
}

public Object getValueAt(int rowIndex, int columnIndex) {
CellData cellData=listData[rowIndex].get(columnIndex);
return cellData==null?null:cellData.getValue();
}
}
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.List;

import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;

public class DTable extends JTable {
private GridSplit gridSplit;
public static DTable create(TableContent tableContent,Object[]columnHeaders,List<GroupHeader> goupColumnHeaderList){
DTable table=tableContent.createTable(columnHeaders);

table.addGroupColumnHeaderList(goupColumnHeaderList);
return table;
}
public DTable(TableModel tableModel){
super(tableModel);
}
public DTable(GridSplit gridSplit, TableModel tbl) {
super(tbl);
this.gridSplit = gridSplit;
setUI(new DTableUI());// ノ靹テJtableオト葷ネセUI
}
protected JTableHeader createDefaultTableHeader() {
return new GroupableTableHeader(columnModel);
}
public void addGroupColumnHeaderList(List<GroupHeader> goupColumnHeaderList){
GroupableTableHeader header = (GroupableTableHeader)getTableHeader();
TableColumnModel tableColumnModel = getColumnModel();
for(GroupHeader groupHeader:goupColumnHeaderList){
header.addColumnGroup(groupHeader.createColumnGroup(tableColumnModel));
}
for (int i = 0; i < tableColumnModel.getColumnCount(); i++) {
tableColumnModel.getColumn(i).setHeaderRenderer(new GroupRenderer());
}
getTableHeader().setUI(new GroupableTableHeaderUI(getTableHeader()));
}
public Rectangle getCellRect(int row, int column, boolean includeSpacing) {
if (gridSplit == null) {
return super.getCellRect(row, column, includeSpacing);
}

int colCell = gridSplit.visibleColCell(row, column);
int rowCell = gridSplit.visibleRowCell(row, column);

Rectangle rec = super.getCellRect(rowCell, colCell, includeSpacing);
for (int i = 1; i < gridSplit.spanCol(rowCell, colCell); i++) {
rec.width += getColumnModel().getColumn(colCell + i).getWidth();
}
for (int i = 1; i < gridSplit.spanRow(rowCell, colCell); i++) {
rec.height += getRowHeight(rowCell + i);
}
return rec;
}

public int columnAtPoint(Point p) {
int y = super.columnAtPoint(p);
if(gridSplit==null){
return y;
}
if (y < 0)
return y;
int x = super.rowAtPoint(p);
return gridSplit.visibleColCell(x, y);

}
public int rowAtPoint(Point p) {
int x = super.rowAtPoint(p);
if (gridSplit == null) {
return x;
}
if (x < 0)
return x;
int y = super.columnAtPoint(p);
return gridSplit.visibleRowCell(x, y);
}
public boolean isCellSelected(int row, int col) {
return getSelectedColumn()==col&&getSelectedRow()==row;
}
public GridSplit getGridSplit() {
return gridSplit;
}
}
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;

import java.awt.Component;
import java.awt.Dimension;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

class ColumnGroup {

protected TableCellRenderer renderer;

protected Vector v;

protected String text;

protected int margin = 0;

public ColumnGroup(String text) {
this(null, text);
}

public ColumnGroup(TableCellRenderer renderer, String text) {
if (renderer == null) {
this.renderer = new DefaultTableCellRenderer() {
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JTableHeader header = table.getTableHeader();
if (header != null) {
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
setHorizontalAlignment(JLabel.CENTER);
setText((value == null) ? "" : value.toString());
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
return this;
}
};
} else {
this.renderer = renderer;
}
this.text = text;
v = new Vector();
}

/**
* param obj TableColumn or ColumnGroup
*/
@SuppressWarnings("unchecked")
public void add(Object obj) {
if (obj == null) {
return;
}
v.addElement(obj);
}

/**
* param c TableColumn
* param v ColumnGroups
*/
@SuppressWarnings("unchecked")
public Vector getColumnGroups(TableColumn c, Vector g) {
g.addElement(this);
if (v.contains(c))
return g;
Enumeration em = v.elements();
while (em.hasMoreElements()) {
Object obj = em.nextElement();
if (obj instanceof ColumnGroup) {
Vector groups = (Vector) ((ColumnGroup) obj).getColumnGroups(c,
(Vector) g.clone());
if (groups != null)
return groups;
}
}
return null;
}

public TableCellRenderer getHeaderRenderer() {
return renderer;
}

public void setHeaderRenderer(TableCellRenderer renderer) {
if (renderer != null) {
this.renderer = renderer;
}
}

public Object getHeaderValue() {
return text;
}

public Dimension getSize(JTable table) {
Component comp = renderer.getTableCellRendererComponent(table,
getHeaderValue(), false, false, -1, -1);
int height = comp.getPreferredSize().height;
int width = 0;
Enumeration em = v.elements();
while (em.hasMoreElements()) {
Object obj = em.nextElement();
if (obj instanceof TableColumn) {
TableColumn aColumn = (TableColumn) obj;
width += aColumn.getWidth();
width += margin;
} else {
width += ((ColumnGroup) obj).getSize(table).width;
}
}
return new Dimension(width, height);
}

public void setColumnMargin(int margin) {
this.margin = margin;
Enumeration em = v.elements();
while (em.hasMoreElements()) {
Object obj = em.nextElement();
if (obj instanceof ColumnGroup) {
((ColumnGroup) obj).setColumnMargin(margin);
}
}
}
}
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
package One.table;
class CellData{
public static CellData creatHiddenCell(int posRow,int posCol){
CellData cellData=new CellData(null,-1,-1);
cellData.setPosRow(posRow);
cellData.setPosCol(posCol);
return cellData;
}
private Object value;
private int colSpan;
private int rowSpan;
private int posRow;
private int posCol;
public int getPosCol() {
return posCol;
}

public void setPosCol(int posCol) {
this.posCol = posCol;
}

public int getPosRow() {
return posRow;
}

public void setPosRow(int posRow) {
this.posRow = posRow;
}

CellData(Object value,int colSpan,int rowSpan){
this.value=value;
this.colSpan=colSpan;
this.rowSpan=rowSpan;
}

public int getColSpan() {
return colSpan;
}

public void setColSpan(int colSpan) {
this.colSpan = colSpan;
}

public int getRowSpan() {
return rowSpan;
}

public void setRowSpan(int rowSpan) {
this.rowSpan = rowSpan;
}

public Object getValue() {
return value;
}

public void setValue(Object value) {
this.value = value;
}
public boolean isVisible(){
return getRowSpan()<1;
}
}

RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
可以的,没事我把代码也贴下,这个贴子好,麻烦斑竹加精,代码如下:
package One;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableColumn;

import One.table.DTable;
import One.table.GroupHeader;
import One.table.TableContent;
public class TestTable {
public static void main(String[] args) {
final JTable table = createTable();
JFrame frame = new JFrame("duoJTable");
frame.setSize(600, 350);
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.setVisible(true);
}
public static JTable createTable() {
TableContent tableContent = new TableContent();
tableContent.append("1", 1, 3);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("2", 1, 3);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("プロジェクト3", 1, 3);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("4", 1, 3);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("5", 1, 3);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("6", 1, 3);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("7", 1, 3);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();
tableContent.append("", 1, 1);
tableContent.println();

List<GroupHeader> list=new ArrayList<GroupHeader>();
list.add(new GroupHeader("08年1月",1,31));
list.add(new GroupHeader("08年2月",32,60));
return DTable.create(tableContent
,new Object[]{"プロジェクト","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15",
"16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31",
"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15",
"16","17","18","19","20","21","22","23","24","25","26","27","28","29"
}
,list);

}

}

class GBC extends GridBagConstraints {
public GBC(int gridx, int gridy) {
this.gridx = gridx;
this.gridy = gridy;
}
public GBC(int gridx, int gridy, int gridwidth, int gridheight) {
this.gridx = gridx;
this.gridy = gridy;
this.gridwidth = gridwidth;
this.gridheight = gridheight;
}

public GBC setAnchor(int anchor) {
this.anchor = anchor;
return this;
}

/**
Sets the fill direction.
@param fill the fill direction
@return this object for further modification
*/
public GBC setFill(int fill) {
this.fill = fill;
return this;
}

/**
Sets the cell weights.
@param weightx the cell weight in x-direction
@param weighty the cell weight in y-direction
@return this object for further modification
*/
public GBC setWeight(double weightx, double weighty) {
//super.w
this.weightx = weightx;
this.weighty = weighty;
return this;
}

/**
Sets the insets of this cell.
@param distance the spacing to use in all directions
@return this object for further modification
*/
public GBC setInsets(int distance) {
this.insets = new Insets(distance, distance, distance, distance);
return this;
}

/**
Sets the insets of this cell.
@param top the spacing to use on top
@param left the spacing to use to the left
@param bottom the spacing to use on the bottom
@param right the spacing to use to the right
@return this object for further modification
*/
public GBC setInsets(int top, int left, int bottom, int right) {
this.insets = new Insets(top, left, bottom, right);
return this;
}

/**
Sets the internal padding
@param ipadx the internal padding in x-direction
@param ipady the internal padding in y-direction
@return this object for further modification
*/
public GBC setIpad(int ipadx, int ipady) {
this.ipadx = ipadx;
this.ipady = ipady;
return this;
}
}
gtlang78 2008-02-23
  • 打赏
  • 举报
回复

class Header extends JTableHeader
{
private int rowHeight = 20;

public Header(int rowHeight)
{
setLayout(new HeaderLayout());

this.rowHeight = rowHeight;
}

@Override
public Dimension getPreferredSize()
{
Dimension d = super.getPreferredSize();
HeaderLayout layout = (HeaderLayout) getLayout();
d.height = layout.getRowCount() * rowHeight;

return d;
}
}

class HeaderCellLabel extends JLabel
{

public HeaderCellLabel(Icon icon, int top, int left, int bottom, int right)
{
this("", icon, top, left, bottom, right);
}

public HeaderCellLabel(String text, Icon icon, int top, int left, int bottom, int right)
{
super(text, icon, JLabel.CENTER);

setBorder(BorderFactory.createMatteBorder(top, left, bottom, right, Color.gray));
// setBorder(BorderFactory.createCompoundBorder(
// BorderFactory.createMatteBorder(0, 0, 1, 1, SystemColor.controlShadow),
// BorderFactory.createMatteBorder(1, 1, 0, 0, SystemColor.controlLtHighlight)));
}

public HeaderCellLabel(String text, int top, int left, int bottom, int right)
{
this(text, null, top, left, bottom, right);
}
}

class HeaderCellConstraints {
public final int x;
public final int y;
public final int colSpan;
public final int rowSpan;

public HeaderCellConstraints(final int x, final int y, final int colSpan, final int rowSpan)
{
this.x = x;
this.y = y;
this.colSpan = colSpan;
this.rowSpan = rowSpan;
}

public HeaderCellConstraints(final int x, final int y, final int colSpan)
{
this(x, y, colSpan, 1);
}

public HeaderCellConstraints(final int x, final int y)
{
this(x, y, 1, 1);
}
}

class HeaderLayout implements LayoutManager2 {
private HashMap<Component, HeaderCellConstraints> compCellMap =
new HashMap<Component, HeaderCellConstraints>();

private int rowCount = 0;

public void addLayoutComponent(Component comp, Object constraints)
{
if (constraints == null || !(constraints instanceof HeaderCellConstraints)) {
return;
}

HeaderCellConstraints cell = (HeaderCellConstraints) constraints;
compCellMap.put(comp, cell);
rowCount = Math.max(rowCount, cell.y + cell.rowSpan);
}

public HeaderCellConstraints getCellConstraint(HeaderCellLabel headerCell) {
return compCellMap.get(headerCell);
}

public int getRowCount()
{
return rowCount;
}

public float getLayoutAlignmentX(Container target)
{
return 0;
}

public float getLayoutAlignmentY(Container target)
{
return 0;
}

public void invalidateLayout(Container target)
{
}

public Dimension maximumLayoutSize(Container target)
{
return preferredLayoutSize(target);
}

public void addLayoutComponent(String name, Component comp)
{
throw new IllegalArgumentException();
}

public void layoutContainer(Container parent)
{
JTableHeader header = (JTableHeader) parent;
JTable table = header.getTable();

TableColumnModel columnModel = table.getColumnModel();
int rowHeight = header.getHeight() / rowCount;

Component[] cellComps = parent.getComponents();
for (Component cellComp : cellComps) {
HeaderCellConstraints cell = compCellMap.get(cellComp);
if (cell == null) {
continue;
}

int cellX = 0;
for (int i = 0; i < cell.x; i++) {
cellX += columnModel.getColumn(i).getWidth();
}

int cellWid = 0;
for (int i = 0; i < cell.colSpan; i++) {
cellWid += columnModel.getColumn(cell.x + i).getWidth();
}

int cellY = rowHeight * cell.y;
int cellHei = rowHeight * cell.rowSpan;

cellComp.setBounds(cellX, cellY, cellWid, cellHei);
}
}

public Dimension minimumLayoutSize(Container parent)
{
return preferredLayoutSize(parent);
}

public Dimension preferredLayoutSize(Container parent)
{
return new Dimension(1,1);
}

public void removeLayoutComponent(Component comp)
{
compCellMap.remove(comp);
rowCount = 0;

for (HeaderCellConstraints cell : compCellMap.values()) {
rowCount = Math.max(rowCount, cell.y + cell.rowSpan);
}
}
}
gtlang78 2008-02-23
  • 打赏
  • 举报
回复
用POI导出

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;

import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.hssf.util.Region;

//复杂表头的JTable
public class ComplexTableHeader
{
public static void main(String[] args) throws Exception
{
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}

final JTable table = new JTable(20, 4) {
@Override
protected JTableHeader createDefaultTableHeader()
{
Header header = new Header(18);
header.add(new HeaderCellLabel("abc", 0, 0, 1, 1), new HeaderCellConstraints(0, 0));
header.add(new HeaderCellLabel("ss", 0, 0, 1, 1), new HeaderCellConstraints(1, 0));
header.add(new HeaderCellLabel("s", 0, 0, 1, 1), new HeaderCellConstraints(2, 0));
header.add(new HeaderCellLabel("dhc", 0, 0, 1, 1), new HeaderCellConstraints(3, 0));
header.add(new HeaderCellLabel("aaaabbbb", 0, 0, 1, 1), new HeaderCellConstraints(0, 1, 3));
header.add(new HeaderCellLabel("abc", 0, 0, 1, 1), new HeaderCellConstraints(0, 2, 1, 2));
header.add(new HeaderCellLabel("ss", 0, 0, 1, 1), new HeaderCellConstraints(1, 2));
header.add(new HeaderCellLabel("ss", 0, 0, 1, 1), new HeaderCellConstraints(1, 3));
header.add(new HeaderCellLabel("s", 0, 0, 1, 1), new HeaderCellConstraints(2, 2));
header.add(new HeaderCellLabel("s", 0, 0, 1, 1), new HeaderCellConstraints(2, 3));
header.add(new HeaderCellLabel("zzz", 0, 0, 1, 1), new HeaderCellConstraints(3, 1, 1, 3));

return header;
}
};
for (int i = 0; i < table.getRowCount(); i++) {
for (int k = 0; k < table.getColumnCount(); k++) {
table.setValueAt("Cell(" + i + ", " + k + ")", i, k);
}
}
JScrollPane sp = new JScrollPane(table);
JPanel p = new JPanel(new BorderLayout(0, 10));
p.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
p.add(sp);

JButton exportBtn = new JButton("Export");
exportBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
exportTable(table);
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
p.add(exportBtn, BorderLayout.SOUTH);

JFrame f = new JFrame();
f.getContentPane().add(p, BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}

protected static void exportTable(JTable table) throws IOException {
// create a new file
FileOutputStream out = new FileOutputStream("workbook.xls");
// create a new workbook
HSSFWorkbook wb = new HSSFWorkbook();
// create a new sheet
HSSFSheet s = wb.createSheet();
// declare a row object reference
HSSFRow r = null;
// declare a cell object reference
HSSFCell c = null;
// create 3 cell styles
HSSFCellStyle cellStyle = wb.createCellStyle();
HSSFCellStyle headerCellStyle = wb.createCellStyle();
// create font object
HSSFFont headerCellFont = wb.createFont();

//set font 2 to 10 point type
headerCellFont.setFontHeightInPoints((short) 10);
//make it bold
headerCellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

headerCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
headerCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
headerCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
headerCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

headerCellStyle.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index);
headerCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

headerCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
headerCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

// set the font
headerCellStyle.setFont(headerCellFont);

// set the sheet name in Unicode
wb.setSheetName(0, "测试");

short rowOffset = 1;
short colOffset = 1;

Header header = (Header) table.getTableHeader();
HeaderLayout layout = (HeaderLayout) header.getLayout();

HSSFRow[] rows = new HSSFRow[layout.getRowCount()];
for (int i = 0; i < layout.getRowCount(); i++) {
rows[i] = s.createRow(i + rowOffset);
}

int headerCellCount = header.getComponentCount();
for (int i = 0; i < headerCellCount; i++) {
if (header.getComponent(i) instanceof HeaderCellLabel) {
HeaderCellLabel headerCell = (HeaderCellLabel) header.getComponent(i);
String headerCellValue = headerCell.getText();

HeaderCellConstraints constraint = layout.getCellConstraint(headerCell);
if (constraint.rowSpan > 1 || constraint.colSpan > 1) {
s.addMergedRegion(new Region(
constraint.y + rowOffset,
(short) (constraint.x + colOffset),
constraint.y + constraint.rowSpan + rowOffset - 1,
(short) (constraint.x + constraint.colSpan + colOffset - 1)));
for (int m = 0; m < constraint.colSpan; m++) {
for (int n = 0; n < constraint.rowSpan; n++) {
rows[constraint.y + n].createCell(
(short) (constraint.x + colOffset + m)).setCellStyle(headerCellStyle);
}
}
}

c = rows[constraint.y].createCell((short) (constraint.x + colOffset));
c.setCellStyle(headerCellStyle);
c.setCellValue(new HSSFRichTextString(headerCellValue));
}
}

rowOffset += (short) layout.getRowCount();

for (short row = 0; row < table.getRowCount(); row++)
{
// create a row
r = s.createRow(row + rowOffset);

// create 10 cells (0-9) (the += 2 becomes apparent later
for (short column = (short) 0; column < table.getColumnCount(); column ++)
{
// create a numeric cell
c = r.createCell((short)(column + colOffset));

Object cellValue = table.getValueAt(row, column);

c.setCellStyle(cellStyle);
c.setCellValue( new HSSFRichTextString(cellValue == null ? "" : cellValue.toString()) );

// make this column a bit wider
s.setColumnWidth((short)(column + colOffset), (short) (15 * 256));
}
}

// write the workbook to the output stream
// close our file (don't blow out our file handles
wb.write(out);
out.close();
}
}
加载更多回复(15)

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧