Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>+1 to mKorbel.</p> <p>Use <a href="http://www.oracle.com/technetwork/java/javafx/overview/index.html" rel="nofollow noreferrer">JavaFX</a> <a href="http://docs.oracle.com/javafx/2/api/javafx/scene/web/WebView.html" rel="nofollow noreferrer"><code>WebView</code></a> which supports HTML5 by integrating it with Swing.</p> <p>Here is an example:</p> <p><img src="https://i.stack.imgur.com/YZHHn.jpg" alt="enter image description here"></p> <pre><code>import java.awt.*; import java.awt.event.*; import java.net.MalformedURLException; import java.net.URL; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import static javafx.concurrent.Worker.State.FAILED; import javafx.embed.swing.JFXPanel; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.web.WebEngine; import javafx.scene.web.WebEvent; import javafx.scene.web.WebView; import javax.swing.*; public class SimpleSwingBrowser implements Runnable { private JFXPanel jfxPanel; private WebEngine engine; private JFrame frame = new JFrame(); private JPanel panel = new JPanel(new BorderLayout()); private JLabel lblStatus = new JLabel(); private JButton btnGo = new JButton("Go"); private JTextField txtURL = new JTextField(); private JProgressBar progressBar = new JProgressBar(); private void initComponents() { jfxPanel = new JFXPanel(); createScene(); ActionListener al = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { loadURL(txtURL.getText()); } }; btnGo.addActionListener(al); txtURL.addActionListener(al); progressBar.setPreferredSize(new Dimension(150, 18)); progressBar.setStringPainted(true); JPanel topBar = new JPanel(new BorderLayout(5, 0)); topBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5)); topBar.add(txtURL, BorderLayout.CENTER); topBar.add(btnGo, BorderLayout.EAST); JPanel statusBar = new JPanel(new BorderLayout(5, 0)); statusBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5)); statusBar.add(lblStatus, BorderLayout.CENTER); statusBar.add(progressBar, BorderLayout.EAST); panel.add(topBar, BorderLayout.NORTH); panel.add(jfxPanel, BorderLayout.CENTER); panel.add(statusBar, BorderLayout.SOUTH); frame.getContentPane().add(panel); } private void createScene() { Platform.runLater(new Runnable() { @Override public void run() { WebView view = new WebView(); engine = view.getEngine(); engine.titleProperty().addListener(new ChangeListener&lt;String&gt;() { @Override public void changed(ObservableValue&lt;? extends String&gt; observable, String oldValue, final String newValue) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { frame.setTitle(newValue); } }); } }); engine.setOnStatusChanged(new EventHandler&lt;WebEvent&lt;String&gt;&gt;() { @Override public void handle(final WebEvent&lt;String&gt; event) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { lblStatus.setText(event.getData()); } }); } }); engine.locationProperty().addListener(new ChangeListener&lt;String&gt;() { @Override public void changed(ObservableValue&lt;? extends String&gt; ov, String oldValue, final String newValue) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { txtURL.setText(newValue); } }); } }); engine.getLoadWorker().workDoneProperty().addListener(new ChangeListener&lt;Number&gt;() { @Override public void changed(ObservableValue&lt;? extends Number&gt; observableValue, Number oldValue, final Number newValue) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { progressBar.setValue(newValue.intValue()); } }); } }); engine.getLoadWorker() .exceptionProperty() .addListener(new ChangeListener&lt;Throwable&gt;() { public void changed(ObservableValue&lt;? extends Throwable&gt; o, Throwable old, final Throwable value) { if (engine.getLoadWorker().getState() == FAILED) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog( panel, (value != null) ? engine.getLocation() + "\n" + value.getMessage() : engine.getLocation() + "\nUnexpected error.", "Loading error...", JOptionPane.ERROR_MESSAGE); } }); } } }); jfxPanel.setScene(new Scene(view)); } }); } public void loadURL(final String url) { Platform.runLater(new Runnable() { @Override public void run() { String tmp = toURL(url); if (tmp == null) { tmp = toURL("http://" + url); } engine.load(tmp); } }); } private static String toURL(String str) { try { return new URL(str).toExternalForm(); } catch (MalformedURLException exception) { return null; } } @Override public void run() { frame.setPreferredSize(new Dimension(1024, 600)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); initComponents(); loadURL("http://oracle.com"); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new SimpleSwingBrowser()); } } </code></pre> <p><a href="http://docs.oracle.com/javafx/2/webview/jfxpub-webview.htm" rel="nofollow noreferrer">This link</a> also provides some helpful examples of <code>WebView</code> including demonstrating use <code>of</code> JavaScript</p> <p>References:</p> <ul> <li><a href="http://docs.oracle.com/javafx/2/swing/swing-fx-interoperability.htm" rel="nofollow noreferrer">Integrating JavaFX into Swing Applications</a></li> <li><a href="https://stackoverflow.com/questions/9671597/add-java-fx-2-0-to-existing-netbeans-project">Add Java FX 2.0 to existing Netbeans project</a></li> </ul>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload