/* * {{{ header & license * Copyright (c) 2008 Patrick Wright * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * * This program 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * }}} */ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xhtmlrenderer.simple.FSScrollPane; import org.xhtmlrenderer.simple.XHTMLPanel; import org.xhtmlrenderer.simple.extend.XhtmlNamespaceHandler; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Date; /** * This sample shows how to add nodes to a DOM Document object that has already been rendered to the screen, and * render the updates. */ public class AddNodeToDocument { private JFrame frame; private XHTMLPanel panel; private Document domDocument; private Element documentRoot; public static void main(String[] args) { new AddNodeToDocument().run(); } private void run() { SwingUtilities.invokeLater(new Runnable() { public void run() { initFrame(); initPanel(); // here's where the real work takes place Action addDocAction = new AbstractAction("Add Node") { public void actionPerformed(ActionEvent event) { // we'll add a single node on each click documentRoot.appendChild(domDocument.createTextNode("adding node at " + new Date())); documentRoot.appendChild(domDocument.createElement("br")); // note that we just pass in the same DOM instance we already // rendered; no need to pass through the XML parser again panel.setDocument(domDocument); // alternately, this will work as well--doDocumentLayout() followed by repaint() // setDocument() is still the recommended approach in this case, as it's a top-level entry // point which ensures that proper setup takes place for the layout and render // panel.doDocumentLayout(panel.getGraphics()); // panel.repaint(); } }; JButton btn = new JButton(addDocAction); frame.getContentPane().add(BorderLayout.SOUTH, btn); frame.pack(); frame.setSize(1024, 768); frame.setVisible(true); } }); } private void initPanel() { panel = new XHTMLPanel(); try { panel.setDocumentFromString( "" + "This line was in the original document. Press the button to add a new node to " + "the same document
" + "", null, new XhtmlNamespaceHandler()); // our panel already has a DOM Document; this is what we'll modify domDocument = panel.getDocument(); // root element of the document--you could grab any other element // by traversing, XPath, etc. documentRoot = domDocument.getDocumentElement(); } catch (Exception e) { messageAndExit("Could not render page: " + e.getMessage(), -1); } FSScrollPane fsScrollPane = new FSScrollPane(panel); frame.getContentPane().add(BorderLayout.CENTER, fsScrollPane); } private void initFrame() { frame = new JFrame("XHTMLPanel"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void messageAndExit(final String msg, final int rtnCode) { System.out.println(msg); System.exit(rtnCode); } }