List icon 目录

有很多桌面应用程序集成了 Web Browser 控件来显示现代 HTML 内容,并直接从应用程序与 Web 服务和 Web 应用程序通信:iTunes、Adobe Brackets、Evernote、Amazon Music、Steam Client 等。如果您使用 Java 技术开发类似类型的桌面应用程序,并且需要嵌入安全、快速、轻量的 Web Browser 控件,支持所有现代 Web 技术如 HTML5、CSS3、JavaScript、Flash 等,那么 JxBrowser 就是您所需要的。

借助 JxBrowser,您的 Java 桌面应用程序 GUI 可以用 HTML/CSS/JavaScript 构建。这意味着您实际上可以使用任何现代的 HTML5 UI 工具包来构建现代、用户友好的 Java 桌面应用程序界面。您不需要雇用 Swing/AWT/JavaFX 开发人员。您的 Java 应用程序的 GUI 可以由 HTML/CSS/JavaScript 开发人员构建。这大大降低了 Java 项目开发的成本。

以下简单的应用程序演示了如何创建一个 Java Swing 对话框,其 GUI 表示用 HTML/CSS/JavaScript 技术构建的网页。

首先,我们创建一个包含对话框内容的 HTML 文档。在下面的文档中,我们使用了最流行的 Bootstrap HTML UI 框架来构建对话框的 GUI:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>注册表单</title>
    <link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" 
        rel="stylesheet">
    <link href='http://fonts.googleapis.com/css?family=Roboto:300' 
        rel='stylesheet' type='text/css'>
    <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
    <style>
        body{
            font:12px/15px Roboto, "Helvetica Neue", Helvetica, sans-serif;
        }
        select,
        input,
        .btn {
            font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
        }
        #wrapper{
            margin:0 auto;
        }
        .main-form {
            width: 360px;
            min-height: 360px;
            background: #fff;
            border-radius: 60px;
            margin:0px auto 20px;
            padding: 20px;
        }
        .form-logo {
            font-size: 100px;
            color: #708090;
        }
    </style>
</head>
<body>
<script>
function newAccount() {
    var firstName = document.getElementById("firstname").value;
    var lastName = document.getElementById("lastname").value;
    var phone = document.getElementById("phone").value;
    var email = document.getElementById("email").value;
    AccountService.createAccount(firstName, lastName, phone, email);
}
</script>
<div id="wrapper">
    <div class="main-form">
        <form action="#" method="POST">
            <fieldset>
                <div class="text-center">
                    <span class="form-logo glyphicon glyphicon-user"></span>
                </div>
                <div class="form-body">
                    <h1 class="form-title text-center">New Account</h1>
                    <div class="form-group">
                        <input class="form-control" type="text" id="firstname" 
                            name="firstname" placeholder="First Name">
                    </div>
                    <div class="form-group">
                        <input class="form-control" type="text" id="lastname" 
                            name="surname" placeholder="Last Name">
                    </div>
                    <div class="form-group">
                        <input class="form-control" type="text" id="phone" 
                            name="phone" placeholder="Phone">
                    </div>
                    <div class="form-group">
                        <input class="form-control" type="email" id="email" 
                            name="email" placeholder="Email">
                    </div>
                    <div class="form-group text-center">
                        <button class="btn btn-default btn-lg" type="button" 
                            onclick="newAccount();">New Account</button>
                    </div>
                </div>
            </fieldset>
        </form>
    </div>
</div>
</body>
</html>

该对话框包含 First Name(名字)Last Name(姓氏)Phone(手机)、*Email(邮箱)*这些文本字段,以及 *New Account(新建账户)*按钮。在我们的 Java 应用程序中,我们需要显示一个包含此 HTML 内容的对话框,让用户填写所有文本字段并点击 New Account 按钮。在我们的 Java 代码中,我们需要在用户点击按钮时收到通知,读取文本字段的值以在我们的应用程序中创建一个新账户。以下 Java 示例演示了如何使用 JxBrowser 来实现这一功能:

import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.engine.EngineOptions;
import com.teamdev.jxbrowser.engine.RenderingMode;
import com.teamdev.jxbrowser.js.JsAccessible;
import com.teamdev.jxbrowser.js.JsObject;
import com.teamdev.jxbrowser.navigation.event.FrameLoadFinished;
import com.teamdev.jxbrowser.view.swing.BrowserView;
import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * 本示例演示了如何将使用 HTML/CSS/JavaScript 构建的 GUI 集成到 Java Swing 桌面应用程序中。
 */
public final class HelloWorld {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JButton newAccountButton = new JButton("New Account...");
            newAccountButton.addActionListener(e -> createAccount());

            JPanel contentPane = new JPanel();
            contentPane.add(newAccountButton);

            JFrame frame = new JFrame("HTML GUI Example");
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.add(contentPane, BorderLayout.CENTER);
            frame.setSize(300, 75);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }

    private static void createAccount() {
        JDialog dialog = new JDialog();
        dialog.setTitle("New Account");
        dialog.setModal(true);

        // 创建并初始化 Engine
        EngineOptions options = EngineOptions.newBuilder(
                RenderingMode.HARDWARE_ACCELERATED).build();
        Engine engine = Engine.newInstance(options);

        // 创建 Browser
        Browser browser = engine.newBrowser();
        browser.navigation().on(FrameLoadFinished.class, event -> {
            JsObject window = event.frame().executeJavaScript("window");
            if (window != null) {
                // 将 Java 对象注入到 JavaScript 中
                AccountService accountService = new AccountService();
                accountService.dialog = dialog;
                window.putProperty("AccountService", accountService);
            }
        });

        // 加载包含 HTML/CSS/JavaScript GUI 的 HTML 文件
        browser.navigation().loadUrl("file:///Users/me/dialog.html");

        dialog.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                // 关闭 Engine 实例
                engine.close();
                // 关闭对话框
                dialog.setVisible(false);
                dialog.dispose();
            }
        });
        dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        // 将 BrowserView Swing 组件嵌入到对话框中。
        dialog.add(BrowserView.newInstance(browser), BorderLayout.CENTER);
        dialog.setSize(400, 500);
        dialog.setResizable(false);
        dialog.setVisible(true);
    }

    public static final class AccountService {

        JDialog dialog;

        @JsAccessible
        public void createAccount(String firstName, String lastName,
                String phone, String email) {
            Account account = new Account();
            account.firstName = firstName;
            account.lastName = lastName;
            account.phone = phone;
            account.email = email;
            SwingUtilities.invokeLater(() -> {
                dialog.dispose();
                JOptionPane.showMessageDialog(null,
                        "Created Account: " + account);
            });
        }
    }

    public static final class Account {

        String firstName;
        String lastName;
        String phone;
        String email;

        @Override
        public String toString() {
            return "Account {" +
                    "firstName='" + firstName + '\'' +
                    ", lastName='" + lastName + '\'' +
                    ", phone='" + phone + '\'' +
                    ", email='" + email + '\'' +
                    '}';
        }
    }
}

现在,您可以运行这个 Java 应用程序并点击 New Account 按钮:

Cross-Desktop App

填写打开对话框中的所有文本字段,并点击 New Account 按钮:

HTML Dialog

一旦您点击 New Account 按钮,Java 应用程序将收到点击通知,并从对话框中读取新账户信息:

Account Details

通过使用这种技术和 JxBrowser 库,您可以在 Java 跨桌面应用程序中构建和显示任何 HTML/CSS/JavaScript GUI。