Principais alterações
API & arquitetura
No JxBrowser 7, a arquitetura da biblioteca foi melhorada. Agora o JxBrowser permite criar duas instâncias Browser
absolutamente independentes e controla os seus ciclos de vida. Juntamente com esta alteração da arquitetura interna, a API pública também foi melhorada e estendida com as novas funcionalidades.
Consulte a seção Mapeamento para saber como a funcionalidade principal da versão 6.x é mapeada para a versão 7.0.
Requisitos do sistema
A partir desta versão, o JxBrowser deixa de suportar os JREs 1.6 e 1.7 da Oracle, os JREs da Apple e da IBM, o macOS 10.9 e o OSGi. Os requisitos atuais do sistema estão disponíveis aqui.
JARs
A estrutura da biblioteca mudou. Agora a biblioteca consiste nos seguintes JARs:
jxbrowser-7.41.3.jar
— as classes e interfaces principais;jxbrowser-swing-7.41.3.jar
— as classes e interfaces para incorporação em uma aplicação Swing;jxbrowser-javafx-7.41.3.jar
— as classes e interfaces para incorporação numa aplicação JavaFX;jxbrowser-win32-7.41.3.jar
— os binários de 32 bits do Chromium para Windows;jxbrowser-win64-7.41.3.jar
— os binários do Chromium de 64 bits para Windows;jxbrowser-linux64-7.41.3.jar
— os binários do Chromium 64-bit para Linux;jxbrowser-mac-7.41.3.jar
— os binários do Chromium para macOS.
Conceitos básicos
A forma de criar e eliminar os objetos foi alterada na nova API.
Para criar um objeto de serviço, utilize o método estático <ServiceObject>.newInstance()
. Por exemplo:
Engine engine = Engine.newInstance(options);
val engine = Engine.newInstance(options)
Para criar um objeto de dados imutável, utilize o método estático Object.newBuilder()
. Por exemplo:
EngineOptions engineOptions = EngineOptions.newBuilder(...)
.setLanguage(Language.ENGLISH_US)
.build();
val options = EngineOptions.newBuilder(...)
.language(Language.ENGLISH_US)
.build()
Todo objeto que deve ser descartado manualmente implementa a interface com.teamdev.jxbrowser.Closable
, por exemplo, com.teamdev.jxbrowser.Browser
. Para descartar o objeto, chame o método com.teamdev.jxbrowser.Closable.close()
. Por exemplo:
browser.close();
browser.close()
Note-se que alguns objetos de serviço dependem de outros objetos de serviço. Quando se elimina um objeto de serviço, todos os objetos de serviço que dependem dele são eliminados automaticamente, portanto, não é necessário fechá-los manualmente. Consulte o guia Arquitetura para obter mais informações sobre os principais objetos e os seus princípios de interação.
Se um método pode retornar null
, o seu valor de retorno é envolvido no java.util.Optional
. Por exemplo:
browser.mainFrame().ifPresent(frame -> {});
browser.mainFrame().ifPresent { frame -> }
Eventos
A forma de registar um listener de eventos foi alterada.
v6.x
Usamos um padrão Observer clássico que consiste nos métodos addXxxListener(XxxListener listener)
e removeXxxListener(XxxListener listener)
que permitem registrar e cancelar o registro de um listener de eventos. Por exemplo:
TitleListener titleListener = new TitleListener() {
@Override
public void onTitleChange(TitleEvent event) {}
};
browser.addTitleListener(titleListener);
val titleListener = object: TitleListener {
override fun onTitleChanged(event: TitleEvent) {}
}
browser.addTitleListener(titleListener)
O registo do listener de eventos deve ser anulado utilizando um método adequado quando não se pretende receber as notificações de eventos:
browser.removeTitleListener(titleListener);
browser.removeTitleListener(titleListener)
v7.0
Um objeto de serviço que permite registar observadores de eventos, implementa a interface com.teamdev.jxbrowser.event.Observable
. Para registar um observador de eventos utilize o método on(Class<E> eventClass, Observer<E> observer)
. Este método devolve Subscription
. Utilize esta instância para cancelar a subscrição da recepção dos eventos necessários. Por exemplo:
Subscription subscription = browser.on(TitleChanged.class, event -> {});
...
subscription.unsubscribe();
val subscription = browser.on(TitleChanged::class.java) { event -> }
...
subscription.unsubscribe()
Chamadas de retorno
A lógica de registo dos handlers de eventos (chamadas de retorno) também mudou.
v6.x
Para registar um handler de eventos, utilize o método setXxxHandler(XxxHandler handler)
para definir e remover um handler de eventos. Por exemplo:
browser.setDialogHandler(new DialogHandler() {
...
@Override
public CloseStatus onConfirmation(DialogParams params) {
return CloseStatus.OK;
}
...
});
browser.setDialogHandler(null);
browser.setDialogHandler(object: DialogHandler {
...
override fun onConfirmation(params: DialogParams): CloseStatus = CloseStatus.OK
...
})
v7.0
Os handlers de eventos agora são chamados de Callbacks. Cada objeto que permite o registo de callbacks implementa a interface com.teamdev.jxbrowser.callback.Advisable
. Para registar e anular o registo de um retorno de chamada, devem ser utilizados os métodos set(Class<C> callbackClass, C callback)
e remove(Class<C> callbackClass)
. Por exemplo:
browser.set(ConfirmCallback.class, (params, tell) -> tell.ok());
browser.remove(ConfirmCallback.class);
browser.set(ConfirmCallback::class.java, ConfirmCallback { params, tell -> tell.ok() })
browser.remove(ConfirmCallback::class.java)
Não se esqueça de devolver o resultado através do parâmetro tell
, caso contrário o motor ficará bloqueado até ao fim.
Segurança da thread
A biblioteca não é thread-safe, por isso não trabalhe com a biblioteca a partir de diferentes threads ao mesmo tempo.
Licenciamento
No JxBrowser 7, o formato da licença e a forma como a biblioteca verifica a licença foram melhorados.
v6.x
Na versão anterior, a licença representa um arquivo JAR (por exemplo, license.jar
) com o arquivo de texto teamdev.licenses
no seu interior. Este arquivo de texto contém o texto simples da licença. Para configurar a licença, tem de incluir este arquivo JAR no classpath da sua aplicação Java.
A licença do projeto está vinculada a um nome de classe totalmente qualificado (por exemplo, com.company.product.MyClass
). Pode ser qualquer classe da sua aplicação. O único requisito é que esta classe seja incluída no classpath da sua aplicação Java onde utiliza o JxBrowser.
v7.0
Agora, a biblioteca requer uma chave de licença que representa uma cadeia de caracteres com uma combinação de letras e dígitos. Você pode adicionar a licença ao seu projeto através da propriedade de sistema jxbrowser.license.key
ou através da API.
A licença do projeto agora está associada a um nome de pacote. Espera-se que o nome do pacote esteja no formato com.company.product.module
. Deve ser um pacote de nível superior para as classes onde se cria uma instância Engine
.
Por exemplo, se a licença do projeto está ligada ao nome do pacote com.company.product
, então você pode criar instâncias Engine
somente nas classes localizadas nos pacotes com.company.product.*
.
O Engine
foi introduzido no JxBrowser 7. Recomendamos que consulte o documento guia que descreve a nova arquitetura, como criar um Engine
e gerenciar o ciclo de vida de vários Browser
.
Você pode trabalhar com a instância criada Engine
e fazer chamadas à API da biblioteca a partir das classes localizadas em outros pacotes sem quaisquer restrições.
Funcionalidade abandonada
A partir desta versão, o JxBrowser deixa de suportar os JREs 1.6 e 1.7 da Oracle, os JREs da Apple e da IBM, o macOS 10.9 e o OSGi.
Na nova versão, a seguinte funcionalidade foi temporariamente abandonada. Iremos fornecer alternativas nas próximas atualizações:
- Registrar capturas de tela da página Web carregada. Restaurado em 7.1.
- Supressão de eventos do mouse e do teclado. Restaurado em 7.1.
- Exibição da caixa de diálogo
BeforeUnload
ao fechar oBrowser
. A possibilidade de mostrar o diálogo ao fechar oBrowser
foi restaurada na versão 7.6. Leia mais. - Fundo transparente no modo de renderização fora de tela. Restaurado em 7.2.
- IME, Acessibilidade e “Pinçar para ampliar” no macOS no modo de renderização acelerada por hardware (heavyweight).
- API
WebStorage
. Restaurado em 7.1. - As bridges
SWT_AWT
eFXCanvas
que permitem embutir Swing/JavaFXBrowserView
em SWT UI. Em vez disso, utilize o SWTBrowserView
introduzido em 7.7.