Skip to content

Latest commit

 

History

History
119 lines (87 loc) · 5.09 KB

abrindo-páginas-web.md

File metadata and controls

119 lines (87 loc) · 5.09 KB

Abrindo e renderizando páginas WEB em uma aplicação JavaFX

Nesse capítulo vamos falar sobre como carregar páginas WEB dentro de sua aplicação JavaFX. Mais uma vez: essa é uma tarefa muito fácil em JavaFX!

Um conto de duas classes: WebView e WebEngine

Vamos à parte teórica primeiramente e relembrar que tudo que é visual em uma aplicação JavaFX herda da classe Node, que abordamos anteriomente. O WebView é a classe que você vai usar para mostrar o conteúdo de uma página e ele herda de Node, ou seja, é passível de efeitos, animações, CSS, transformações, entre outros.

Já a classe WebEngine é onde manipulamos a DOM da página, executamos javascript, entre outros. É simplesmente o browser em sí, baseado no WebKit, o mesmo motor de navegadores famosos, como o Chrome.

A relação entre essas classes é simples: O WebView usa uma instância de WebEngine e cria a representação visual de um conteúdo HTML na sua aplicação JavaFX. Mas como usar os mesmo?

Usando WebView

O uso de WEBView consiste em três passos:

  • Instanciar a classe javafx.scene.web.WebView;

  • Acessar a WebEngine usando o método getEngine_e usar o método _load para carregar a página WEB;

  • Adicionar o WebView ao Scenegraph da sua aplicação.

    Em código, isso fica assim:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.web.WebView;
import javafx.scene.Scene;

public class SimplesWEBView extends Application {

    @Override
    public void start(Stage s) {
        // O nó em sí, que será mostrado
        WebView webView = new WebView();
        // A engine é do tipo WebEngine
        webView.getEngine().load("http://aprendendo-javafx.blogspot.com");
        // criamos a cena e adicionamos no nosso stage
        s.setScene(new Scene(webView));
        // mostramos
        s.show();
    }    
}

O resultado disso é uma aplicação simples que mostra o nosso blog:

Exatamente, meus caros amigos. Foram 3 linhas de código e uma página WEB na sua app JavaFX.

Uma aplicação um pouco mais elaborada

Agora vamos fazer uma aplicação que mostra alguns componentes JavaFX interagindo com a WEB Engine. Vamos fazer o básico, pois, como quase todos os componentes JavaFX, isso tomaria muitas páginas desse livro que deveria ser o arroz com feijão, não a feijoada, o filé, lazanha...

Nessa aplicação temos uma lista de URLs no lado esquerdo e quando o usuário seleciona uma, temos a mesma carregada no lado direito no nosso WEB View , vejam:

O funcionamento é simples: a ListView e o WebView ficam em um gerenciador de layout do tipo HBox. Quando o usuário seleciona um elemento na lista, pegamos a URL selecionada e carregamos na WebEngine usando o WebView. Quando a WebEngine está carregando a página, nós desabilitamos a lista. Fácil, não? Vejam o código inteiro:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.web.WebView;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.HBox;
import java.util.stream.Stream;

/**
 *
 * @author william
 */
public class NavegaSites extends Application {

    public static void main(String[] args) {
        launch();
    }

    final String[] sites = {
        "aprendendo-javaee.blogspot.com",
        "aprendendo-javafx.blogspot.com",
        "aprendendo-javase.blogspot.com",
        "aprendendo-jboss.blogspot.com",
        "jugvale.com",
        "javafx.com",
        "java.com",
        "google.com"
    };

    @Override
    public void start(Stage s) {
        // criando uma lista visual de Strings, um webView e uma caixinha pra colocar as coisas
    ListView<String> listaSites = new ListView<>();
    WebView webView = new WebView();
        HBox raiz = new HBox(20);

    // Para cada site no array adicionamos na lista visual
    Stream.of(sites).forEach(listaSites.getItems()::add);

    // Quando o usuário seleciona um item, carregamos a página
    listaSites.getSelectionModel().selectedItemProperty().addListener(
        (obs, o, n) -> {
            if(n != null) webView.getEngine().load("http://www." + n);
    });

    // a lista não permite seleção de página quando uma página está sendo carregada
    listaSites.disableProperty().bind(webView.getEngine().getLoadWorker().runningProperty());

    // formalidades...
    raiz.getChildren().addAll(listaSites, webView);
        s.setScene(new Scene(raiz));
        s.show();
    }    
}