Tanto o JxBrowser como o JavaFX WebView permitem que você integre tecnologias Web na sua aplicação de ambiente de trabalho Java multiplataforma para obter o melhor dos dois mundos: a ubiquidade da plataforma Web e a potência da plataforma Java.

Antes de escolherem o JxBrowser, os nossos clientes nos perguntam as vezes sobre a diferença entre o JxBrowser e o JavaFX WebView. Neste artigo, vamos comparar estas soluções em termos de sua arquitetura, renderização, suporte  das mais recentes normas Web, incluindo HTML5, CSS3, JavaScript e muito mais.

Em poucas palavras 

Se você desenvolve o seu software utilizando JavaFX e necessitar  apresentar uma página Web simples sem necessidade de utilizar funcionalidades HTML5 ou funcionalidades avançadas do navegador Web, o JavaFX WebView funcionará bem para o caso.

Para o desenvolvimento de software comercial com certa urgência em JavaFX, Swing, ou SWT, em que a estabilidade, o suporte sem firulas e a comunicação eficaz são essenciais, o JxBrowser é a escolha mais fiável.

Instalação 

O JavaFX WebView foi introduzido em JavaFX 2.0, que se tornou uma parte  do JDK 8 em 2014. Se você utiliza Java 8, então não precisa fazer nada de especial para começar a utilizar JavaFX WebView. Com o JDK 11 e superior, o JavaFX não é  mais incluído, portanto para desenvolver usando o JavaFX 11 ou superior você deve baixar ele separadamente.

O JxBrowser é uma biblioteca de terceiros que você precisa adicionar ao seu projeto como uma dependência. Pode simplesmente transferir e adicionar ela ao classpath da sua aplicação, ou adicionar rapidamente ela ao seu projeto Gradle ou Maven.

Obtenha 30 dias de teste para indivíduos e empresas
Teste agora

Engine 

O JavaFX WebView utiliza internamente o WebKit. O JxBrowser utiliza um Chromium sob o capô totalmente funcional. Ambas as soluções incluem todos os binários da engine necessários e não exigem que os usuários finais instalem o Chromium ou o Safari.

Renderização 

O WebKit não renderiza páginas Web, então os programadores de JavaFX tiveram que  implementar um renderizador leve (fora da tela) separado. O JavaFX 17 WebView processa bem as páginas Web, então não’haverá quaisquer diferenças visíveis em relação ao Safari, Mozilla Firefox ou Google Chrome.

No JxBrowser, as páginas Web são processadas pelo Chromium utilizando GPU. Assim, são exatamente iguais ao Google Chrome. O JxBrowser suporta dois modos de renderização: fora da tela e acelerado por hardware.

Arquitetura 

O JavaFX inicializa e executa o WebKit no seu processo Java. A vantagem desta abordagem é o fato de o JavaFX permitir criar e apresentar WebView muito rapidamente em comparação com o  JxBrowser, onde um processo externo Chromium tem de ser lançado primeiro. No entanto, para obter essa velocidade  o WebKit atribui e utiliza a memória e a CPU do seu processo Java. Algumas páginas Web modernas podem atribuir mais de 1 GB de RAM. Quanto mais instâncias WebView criar e carregar páginas Web, mais RAM da aplicação Java será utilizada.

Arquitetura JavaFX WebView

Arquitetura JavaFX WebView

O JxBrowser executa o Chromium em um processo nativo separado e se comunica com ele através da ponte de Comunicação Inter-Processos (IPC). Com esta solução, o Chromium não afeta a utilização de memória da sua aplicação Java. Além disso, o JxBrowser suporta a arquitetura multi-processos do Chromium. Se uma página Web ou JavaScript falhar por algum motivo, o Chromium continuará a funcionar e pode até restaurar a página Web que falhou.

Arquitetura do JxBrowser

Arquitetura do JxBrowser

Segurança 

O WebKit é escrito em C++. Para chamar a funcionalidade WebKit, o JavaFX WebView utiliza JNI. Uma vez que o WebKit é executado dentro da JVM, qualquer erro ou comportamento inesperado pode causar uma falha na JVM e terminar a sua aplicação Java inesperadamente. Os dados do usuário final podem ser perdidos ou corrompidos.

No caso de  um erro no Chromium, o seu programa Java continuará a ser executado. O JxBrowser fornece ainda uma API para informá-lo sobre um encerramento inesperado do Chromium ou uma falha num processo do Chromium, para que possa reinicializar e restaurar uma sessão de usuário para uma melhor experiência de usuário.

Normas Web 

Se carregar https://html5test.teamdev.com/ em JavaFX 21 WebView e JxBrowser 8.2.1 (Chromium 131), obterá os seguintes resultados:

Suporte de funcionalidades HTML5 no JavaFX WebView e no JxBrowser

Suporte de funcionalidades HTML5 no JavaFX WebView e no JxBrowser

Diferentes versões do JavaFX suportam diferentes normas Web. Por exemplo, JavaFX 8 não reproduz vídeos no YouTube de forma alguma:

JavaFX WebView YouTube

E apresenta o Google com alguns artefatos:

JavaFX WebView Google

O JavaFX 17 funciona bem para as mesmas tarefas:

JavaFx 17 WebView YouTube

JavaFx 17 WebView Google

O WebGL não é suportado pelo JavaFX.

Suporte WebGL

Suporte WebGL no JavaFX WebView e no JxBrowser

O Google Maps não é apresentado corretamente mesmo em JavaFX 17:

Google Maps

Toolkits de IU suportados 

O JavaFX WebView pode ser utilizado sem problemas para aplicações JavaFX . Se desenvolver a sua aplicação utilizando Java Swing ou SWT, pode incorporar JavaFX WebView através de JFXPanel e FXCanvas.

O JxBrowser suporta todos os Toolkits UI Java, incluindo JavaFX, Swing, e SWT. O site fornece os seguintes componentes para incorporação:

  • com.teamdev.jxbrowser.view.swing.BrowserView
  • com.teamdev.jxbrowser.view.javafx.BrowserView
  • com.teamdev.jxbrowser.view.swt.BrowserView

Incorporação 

Os esforços necessários para escrever uma aplicação JavaFX simples com uma barra de endereço e uma web view que apresenta a página Web atualmente carregada são bastante semelhantes.

JavaFX WebView
JxBrowser
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public final class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        WebView view = new WebView();
        WebEngine engine = view.getEngine();

        BorderPane root = new BorderPane(view);

        TextField addressBar = new TextField("https://google.com");
        addressBar.setOnAction(event -> 
                engine.load(addressBar.getText()));
        root.setTop(addressBar);

        // Atualiza a barra de endereço com o URL da página Web carregada.
        engine.locationProperty().addListener((observable, oldValue, newValue) ->
                addressBar.setText(newValue));

        primaryStage.setTitle("JavaFX WebView");
        primaryStage.setScene(new Scene(root, 1000, 600));
        primaryStage.show();

        engine.load(addressBar.getText());
    }
}
import static com.teamdev.jxbrowser.engine.RenderingMode.HARDWARE_ACCELERATED;

import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.navigation.event.NavigationFinished;
import com.teamdev.jxbrowser.view.javafx.BrowserView;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public final class SmokeTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Engine engine = Engine.newInstance(HARDWARE_ACCELERATED);
        Browser browser = engine.newBrowser();
        BrowserView view = BrowserView.newInstance(browser);

        BorderPane root = new BorderPane(view);

        TextField addressBar = new TextField("https://google.com");
        addressBar.setOnAction(event -> 
                browser.navigation().loadUrl(addressBar.getText()));
        root.setTop(addressBar);

        // Atualiza a barra de endereço com o URL da página Web carregada.
        browser.navigation().on(NavigationFinished.class, event -> {
            if (event.isInMainFrame()) {
                addressBar.setText(event.url());
            }
        });

        primaryStage.setTitle("JxBrowser");
        primaryStage.setScene(new Scene(root, 1000, 600));
        primaryStage.show();

        browser.navigation().loadUrl(addressBar.getText());

        // Fecha o engine quando o estágio está prestes a fechar.
        primaryStage.setOnCloseRequest(event -> engine.close());
    }
}

API e funcionalidades 

API JavaFX WebView: ~1 pacote , ~10 classes & interfaces. O JavaFX WebView representa um controle simples do navegador Web. Não havia objetivos para fornecer a funcionalidade de um navegador Web totalmente funcional, como rede, SSL, autenticação, cookies, DevTools, plugins, visualizador de PDF, etc.

A API fornece a funcionalidade básica do navegador Web que permite carregar uma página Web, obter vários eventos de carregamento, acessar e modificar o DOM, executar JavaScript, chamar Java a partir de JavaScript através de injecção de objetos Java em JavaScript, tratar popups e apresentar caixas de diálogo JavaScript como alert, confirm, prompt.

API do JxBrowser: ~60 pacotes, ~580 classes & interfaces. O JxBrowser envolve e utiliza uma aplicação de browser Web totalmente funcional.

A API fornece acesso a centenas de funcionalidades do Chromium, tais como como gestão de perfis, incluindo incógnito, plugins, proxy, cookies, verificação ortográfica, transferências, permissões, autenticação (proxy, básico, digest, NTLM, certificados de cliente SSL, SuisseID, U2F, autenticação integrada do Windows e Kerberos), senhas, zoom, impressão, DevTools, rede, protocolos personalizados e mais.

Suporte e atualizações 

O JavaFX é um projeto open source. Se encontrar um bug  ou houver uma funcionalidade em falta, pode contribuir. O JavaFX segue o ciclo de lançamento de 6 meses do OpenJDK. Uma nova versão  é lançada a cada 6 meses. É ainda desconhecida a frequência com que o engine WebKit é atualizado para a última versão estável que suporta as mais recentes normas Web e inclui as correções das vulnerabilidades de segurança comunicadas.

O JxBrowser é um produto comercial concebido e criado para empresas comerciais com elevados requisitos de qualidade e suporte de soluções integradas de terceiros e que desenvolvem software utilizando a tecnologia Java. O JxBrowser tem sido desenvolvido e suportado pela TeamDev desde 2007.

Todos os clientes com uma inscrição ativa Suporte Padrão podem utilizar todas as novas versões do JxBrowser gratuitamente e receber suporte técnico diretamente dos engenheiros do JxBrowser. Se encontrar um bug ou houver uma funcionalidade em falta, nós aplicaremos a correção, implementaremos a funcionalidade necessária e forneceremos uma nova versão da biblioteca num prazo razoável de tempo.

Uma nova versão do JxBrowser é lançada quase todos os meses. Nós atualizamos o Chromium para a última versão estável (com os mais recentes patches de segurança e vulnerabilidades corrigidas) no prazo de 3–4 semanas após o seu lançamento oficial.