📄 table.java
字号:
/*
* $Id: Table.java 2766 2007-05-20 11:40:29Z blowagie $
* $Name$
*
* Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*
* Some methods in this class were contributed by Geert Poels, Kris Jespers and
* Steve Ogryzek. Check the CVS repository.
*/
package com.lowagie.text;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Iterator;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
/**
* A <CODE>Table</CODE> is a <CODE>Rectangle</CODE> that contains <CODE>Cell</CODE>s,
* ordered in some kind of matrix.
* <P>
* Tables that span multiple pages are cut into different parts automatically.
* If you want a table header to be repeated on every page, you may not forget to
* mark the end of the header section by using the method <CODE>endHeaders()</CODE>.
* <P>
* The matrix of a table is not necessarily an m x n-matrix. It can contain holes
* or cells that are bigger than the unit. Believe me or not, but it took some serious
* thinking to make this as userfriendly as possible. I hope you wil find the result
* quite simple (I love simple solutions, especially for complex problems).
* I didn't want it to be something as complex as the Java <CODE>GridBagLayout</CODE>.
* <P>
* Example:
* <BLOCKQUOTE><PRE>
* // Remark: You MUST know the number of columns when constructing a Table.
* // The number of rows is not important.
* <STRONG>Table table = new Table(3);</STRONG>
* <STRONG>table.setBorderWidth(1);</STRONG>
* <STRONG>table.setBorderColor(new Color(0, 0, 255));</STRONG>
* <STRONG>table.setPadding(5);</STRONG>
* <STRONG>table.setSpacing(5);</STRONG>
* Cell cell = new Cell("header");
* cell.setHeader(true);
* cell.setColspan(3);
* <STRONG>table.addCell(cell);</STRONG>
* <STRONG>table.endHeaders();</STRONG>
* cell = new Cell("example cell with colspan 1 and rowspan 2");
* cell.setRowspan(2);
* cell.setBorderColor(new Color(255, 0, 0));
* <STRONG>table.addCell(cell);</STRONG>
* <STRONG>table.addCell("1.1");</STRONG>
* <STRONG>table.addCell("2.1");</STRONG>
* <STRONG>table.addCell("1.2");</STRONG>
* <STRONG>table.addCell("2.2");</STRONG>
* <STRONG>table.addCell("cell test1");</STRONG>
* cell = new Cell("big cell");
* cell.setRowspan(2);
* cell.setColspan(2);
* <STRONG>table.addCell(cell);</STRONG>
* <STRONG>table.addCell("cell test2");</STRONG>
* </PRE></BLOCKQUOTE>
* The result of this code is a table:
* <TABLE ALIGN="Center" BORDER="1" BORDERCOLOR="#0000ff" CELLPADDING="5" CELLSPACING="5">
* <TR ALIGN="Left" VALIGN="Left">
* <TH ALIGN="Left" COLSPAN="3" VALIGN="Left">
* header
* </TH>
* </TR>
* <TR ALIGN="Left" VALIGN="Left">
* <TD ALIGN="Left" BORDERCOLOR="#ff0000" ROWSPAN="2" VALIGN="Left">
* example cell with colspan 1 and rowspan 2
* </TD>
* <TD ALIGN="Left" VALIGN="Left">
* 1.1
* </TD>
* <TD ALIGN="Left" VALIGN="Left">
* 2.1
* </TD>
* </TR>
* <TR ALIGN="Left" VALIGN="Left">
* <TD ALIGN="Left" VALIGN="Left">
* 1.2
* </TD>
* <TD ALIGN="Left" VALIGN="Left">
* 2.2
* </TD>
* </TR>
* <TR ALIGN="Left" VALIGN="Left">
* <TD ALIGN="Left" VALIGN="Left">
* cell test1
* </TD>
* <TD ALIGN="Left" COLSPAN="2" ROWSPAN="2" VALIGN="Left">
* big cell
* </TD>
* </TR>
* <TR ALIGN="Left" VALIGN="Left">
* <TD ALIGN="Left" VALIGN="Left">
* cell test2
* </TD>
* </TR>
* </TABLE>
*
* @see Rectangle
* @see Element
* @see Row
* @see Cell
*/
public class Table extends Rectangle {
// membervariables
/** This is the number of columns in the <CODE>Table</CODE>. */
private int columns;
/** This is the list of <CODE>Row</CODE>s. */
private ArrayList rows = new ArrayList();
/** The current Position in the table. */
private Point curPosition = new Point(0, 0);
/** This Empty Cell contains the DEFAULT layout of each Cell added with the method addCell(String content). */
private Cell defaultLayout = new Cell(true);
/** This is the number of the last row of the table headers. */
private int lastHeaderRow = -1;
/** This is the horizontal alignment. */
private int alignment = Element.ALIGN_CENTER;
/** This is cellpadding. */
private float cellpadding;
/** This is cellspacing. */
private float cellspacing;
/** This is the width of the table (in percent of the available space). */
private float width = 80;
/** Is the width a percentage (false) or an absolute width (true)? */
private boolean locked = false;
/** This is an array containing the widths (in percentages) of every column. */
private float[] widths;
/** Boolean to track if a table was inserted (to avoid unnecessary computations afterwards) */
private boolean mTableInserted = false;
/**
* Boolean to automatically fill empty cells before a table is rendered
* (takes CPU so may be set to false in case of certainty)
*/
protected boolean autoFillEmptyCells = false;
/** If true this table may not be split over two pages. */
boolean tableFitsPage = false;
/** If true cells may not be split over two pages. */
boolean cellsFitPage = false;
/** This is the offset of the table. */
float offset = Float.NaN;
/** if you want to generate tables the old way, set this value to false. */
protected boolean convert2pdfptable = false;
// constructors
/**
* Constructs a <CODE>Table</CODE> with a certain number of columns.
*
* @param columns The number of columns in the table
* @throws BadElementException if the creator was called with less than 1 column
*/
public Table(int columns) throws BadElementException {
this(columns, 1);
}
/**
* Constructs a <CODE>Table</CODE> with a certain number of columns
* and a certain number of <CODE>Row</CODE>s.
*
* @param columns The number of columns in the table
* @param rows The number of rows
* @throws BadElementException if the creator was called with less than 1 column
*/
public Table(int columns, int rows) throws BadElementException {
// a Rectangle is create with BY DEFAULT a border with a width of 1
super(0, 0, 0, 0);
setBorder(BOX);
setBorderWidth(1);
defaultLayout.setBorder(BOX);
// a table should have at least 1 column
if (columns <= 0) {
throw new BadElementException("A table should have at least 1 column.");
}
this.columns = columns;
// a certain number of rows are created
for (int i = 0; i < rows; i++) {
this.rows.add(new Row(columns));
}
curPosition = new Point(0, 0);
// the DEFAULT widths are calculated
widths = new float[columns];
float width = 100f / columns;
for (int i = 0; i < columns; i++) {
widths[i] = width;
}
}
/**
* Copy constructor (shallow copy).
* @throws BadElementException
*/
public Table(Table t) {
super(0, 0, 0, 0);
this.cloneNonPositionParameters(t);
this.columns = t.columns;
this.rows = t.rows;
this.curPosition = t.curPosition;
this.defaultLayout = t.defaultLayout;
this.lastHeaderRow = t.lastHeaderRow;
this.alignment = t.alignment;
this.cellpadding = t.cellpadding;
this.cellspacing = t.cellspacing;
this.width = t.width;
this.widths = t.widths;
this.autoFillEmptyCells = t.autoFillEmptyCells;
this.tableFitsPage = t.tableFitsPage;
this.cellsFitPage = t.cellsFitPage;
this.offset = t.offset;
this.convert2pdfptable = t.convert2pdfptable;
}
// implementation of the Element-methods
/**
* Processes the element by adding it (or the different parts) to an
* <CODE>ElementListener</CODE>.
*
* @param listener an <CODE>ElementListener</CODE>
* @return <CODE>true</CODE> if the element was processed successfully
*/
public boolean process(ElementListener listener) {
try {
return listener.add(this);
}
catch(DocumentException de) {
return false;
}
}
/**
* Gets the type of the text element.
*
* @return a type
*/
public int type() {
return Element.TABLE;
}
/**
* Gets all the chunks in this element.
*
* @return an <CODE>ArrayList</CODE>
*/
public ArrayList getChunks() {
return new ArrayList();
}
// getters and setters
/**
* Gets the number of columns.
*
* @return a value
*/
public int getColumns() {
return columns;
}
/**
* Gets the number of rows in this <CODE>Table</CODE>.
*
* @return the number of rows in this <CODE>Table</CODE>
*/
public int size() {
return rows.size();
}
/**
* Gets the dimension of this table
*
* @return dimension
*/
public Dimension getDimension() {
return new Dimension(columns, size());
}
/**
* Gets the default layout of the Table.
* @return a cell with all the defaults
*/
public Cell getDefaultLayout() {
return defaultLayout;
}
/**
* Sets the default layout of the Table to
* the provided Cell
* @param value a cell with all the defaults
*/
public void setDefaultLayout(Cell value) {
defaultLayout = value;
}
/**
* Gets the last number of the rows that contain headers.
*
* @return a rownumber
*/
public int getLastHeaderRow() {
return this.lastHeaderRow;
}
/**
* Sets the horizontal alignment.
*
* @param value the new value
*/
public void setLastHeaderRow(int value) {
lastHeaderRow = value;
}
/**
* Marks the last row of the table headers.
*
* @return the number of the last row of the table headers
*/
public int endHeaders() {
lastHeaderRow = curPosition.x - 1;
return lastHeaderRow;
}
/**
* Gets the horizontal alignment.
*
* @return a value
*/
public int getAlignment() {
return alignment;
}
/**
* Sets the horizontal alignment.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -