HtmlGui.java:
package ca.sarah_happy.sandbox; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.net.URL; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JTextPane; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.text.BadLocationException; import javax.swing.text.Element; import javax.swing.text.html.HTMLDocument; public class HtmlGui implements Runnable { public static void main(String[] args) { SwingUtilities.invokeLater(new HtmlGui()); } private JTextPane viewer; private HTMLDocument document; @Override public void run() { try { viewer = new JTextPane(); viewer.setEditable(false); viewer.setPreferredSize(new Dimension(400, 300)); JFrame frame = new JFrame("screen"); frame.setContentPane(new JScrollPane(viewer)); frame.pack(); frame.setLocationByPlatform(true); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); URL screen = HtmlGui.class.getResource("screen.html"); viewer.setPage(screen); document = (HTMLDocument) viewer.getDocument(); viewer.addPropertyChangeListener("page", onLoad); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } private JSlider slider; private PropertyChangeListener onLoad = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent e) { JButton button = new JButton("Button"); button.addActionListener(onButton); insertComponent("button", button); slider = new JSlider(); slider.addChangeListener(onSlider); insertComponent("slider", slider); } }; private ChangeListener onSlider = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { addOutput("changed slider: " + slider.getValue()); } }; private void insertComponent(String id, Component component) { Element e = document.getElement(id); viewer.setCaretPosition(e.getStartOffset()); viewer.moveCaretPosition(e.getEndOffset()); viewer.insertComponent(component); } private ActionListener onButton = new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { addOutput("pressed button"); } }; private void addOutput(String text) { try { Element out = document.getElement("output"); document.insertString(out.getEndOffset() - 1, text + "\n", null); } catch (BadLocationException ex) { ex.printStackTrace(); } } }
screen.html:
<html><body> Some stuff... <p><span id="button">button</span> <span id="slider">slider</span></p> <p><i>Output:</i> <div id="output"></div></p> </body></html>