Generating HTML
I am attempting to generate HTML within my application for printing
documents. Due to various restrictions, I am using the
javax.swing.text.html.HTMLDocument package. That can't change (unless
it is impossible to do what I want to do).
My method takes in a TableModel and attempts to create an HTML
document from the data in the table, replicating the table within HTML
code. However, when I run the method below, I get the following
exception:
javax.swing.text.StateInvariantError: Illegal cast to
MutableAttributeSet
at javax.swing.text.AbstractDocument
$AbstractElement.checkForIllegalCast(AbstractDocument.java:2055)
at javax.swing.text.AbstractDocument
$AbstractElement.addAttributes(AbstractDocument.java:1988)
at javax.swing.text.AbstractDocument
$AbstractElement.<init>(AbstractDocument.java:1781)
at javax.swing.text.AbstractDocument
$BranchElement.<init>(AbstractDocument.java:2248)
at javax.swing.text.html.HTMLDocument
$BlockElement.<init>(HTMLDocument.java:3674)
at
javax.swing.text.html.HTMLDocument.createBranchElement(HTMLDocument.java:
379)
at
hasrd.gui.components.print.HasrdDocument.generateHTML(MyHTMLDocumentGenerator.java:
152)
...
Is it even possible to do what I want to do? If so, what am I doing
wrong?
Thanks
Here is the method in question. It is self-contained.
protected void generateHTML(TableModel dataTable) {
AbstractDocument.AttributeContext ctx = getAttributeContext();
// create default root element
BranchElement root = (BranchElement) this.createDefaultRoot();
// create the table
AttributeSet atts = ctx.getEmptySet();
atts = ctx.addAttribute(atts, StyleConstants.NameAttribute,
HTML.Tag.TABLE);
BranchElement table = (BranchElement)
createBranchElement(root, atts); // ERROR HAPPENS HERE
root.replace(0, 0, new Element[] { table });
// for each row in the table, add a row to the html
for (int row = 0; row < dataTable.getRowCount(); row++) {
// create the table
atts = ctx.getEmptySet();
atts = ctx.addAttribute(atts,
StyleConstants.NameAttribute,
HTML.Tag.TR);
BranchElement rowTag = (BranchElement)
createBranchElement(table,
atts);
table.replace(0, 0, new Element[] { rowTag });
// for each column
for (int col = 0; col < dataTable.getColumnCount(); col++)
{
// create the cell
atts = ctx.getEmptySet();
atts = ctx.addAttribute(atts,
StyleConstants.NameAttribute,
HTML.Tag.TD);
BranchElement cellTag = (BranchElement)
createBranchElement(
rowTag, atts);
rowTag.replace(0, 0, new Element[] { cellTag });
// put data into leaf node
atts = ctx.getEmptySet();
atts = ctx.addAttribute(atts,
StyleConstants.NameAttribute,
HTML.Tag.CONTENT);
atts = ctx.addAttribute(atts,
StyleConstants.ComposedTextAttribute,
dataTable
.getValueAt(row, col));
Element leaf = createLeafElement(cellTag, atts, 0, 1);
cellTag.replace(0, 0, new Element[] { leaf });
}
}
}