Чистая программа просмотра / рендеринга HTML для использования в области прокрутки - PullRequest
35 голосов
/ 13 марта 2010

Какие чистые средства просмотра и рендеринга Java HTML доступны? Требования:

  • Он должен реализовывать интерфейс JComponent для размещения на панели Scrollable.
  • Это должно быть предпочтительно бесплатное решение; Открытый исходный код является плюсом.
  • Наличие в качестве артефакта Maven является плюсом.

Мне известны только несколько компонентов и проектов, некоторые из которых сейчас не существуют:

Ответы [ 7 ]

33 голосов
/ 10 апреля 2012

Начиная с Java 8, вы можете использовать JavaFX WebView Component , который также может использоваться в Swing .

Код так же просто, как:

JFXPanel jfxPanel = new JFXPanel(); // Scrollable JCompenent
Platform.runLater( () -> { // FX components need to be managed by JavaFX
   WebView webView = new WebView();
   webView.getEngine().loadContent( "<html> Hello World!" );
   webView.getEngine().load( "http://www.stackoverflow.com/" );
   jfxPanel.setScene( new Scene( webView ) );
});

Он поддерживается механизмом WebKit (версия зависит от JRE и является достаточно актуальной). Но имейте в виду, что это не полноценный браузер, поэтому не рассчитывайте на поддержку, скажем, HTML5 аудио / видео. В противном случае, он работает HTML + CSS + JS так же хорошо, как ваш браузер.

Технически, базовым движком является C ++, а не нативный Java. Но он входит в официальный JRE Oracle, не требует библиотеки, имеет нулевой конфиг, такой же кроссплатформенный, как Java FX, и активно обновляется и поддерживается.

Думаю, он так же хорош, как и нативная Java для большинства случаев использования?


Приведенная ниже информация устарела, поскольку теперь у нас есть WebView на Java.

Пробовал Кобра / Лобо , CSSBox и Летающая тарелка , все на чистой Java. Другие являются либо родными, либо коммерческими.

Содержимое: простой HTML, сгенерированный на лету (в виде строки), встроенный CSS 2.1, без JS.

Короткая история: «Летающая тарелка» наиболее проста в использовании, а рендеринг наиболее корректен, но вам лучше иметь полный контроль над контентом. В противном случае ищите нативное решение.

Длинная история:

CSSBox, кажется, более активен, но, похоже, зависит от некоторых сторонних библиотек. Например, демонстрация зависит от nekohtml, который использует Apache Xerces, который изменил способ работы стандартного синтаксического анализатора Java 1.7 и сломал мою программу, но когда я заставляю его использовать встроенные в Java Xerces, я получаю ClassCastException (InlineBox to BlockBox). Не могу заставить его работать в конце. Плюс еще не нашли способ заменить документ в существующем BrowserCanvas.

Cobra больше не поддерживается, необходимо вручную исправить проблему несовместимости , чтобы она работала в 1.7. Также нужно захватить Mozilla Rhino (не используя JS), но это все. После этого он довольно плавный, просто нужно попросить Logger скрыть сообщения рисования. Рендеринг правильный, а скорость справедлива - до тех пор, пока документ прост. Когда вы начинаете использовать менее распространенные теги или более сложный макет, Cobra довольно быстро разваливается.

Летающая тарелка имеет лучшую поддержку CSS из трех на момент написания (февраль 2011 г.). Настройка очень проста (например, нет необходимости настраивать документ, такой как cobo или domparser, например, cssbox), имеет небольшую зависимость - что также означает отсутствие javascript. Но Летающая тарелка очень строга к тому, что ты ее кормишь. Источник должен быть правильно сформированным XML, например, стиль и сценарий, возможно, должны быть обернуты в CDATA, и если вы используете html-сущности, вы должны объявить DTD (поэтому нет html5 doctype). Однако, если вы встраиваете контент, которым можете управлять, это может быть вашим лучшим выбором.

10 голосов
/ 30 января 2014

Если вы используете Swing, вы можете встроить JavaFX WebView.

1) Должен быть реализован интерфейс JComponent для размещения на панели прокрутки.

Чтобы добавить WebView в Swing, вам нужно добавить его в JFXPanel, который является JComponent. Чтобы WebView заполнил всю JFXPanel, я использовал AnchorPane примерно так:

                final AnchorPane anchorPane = new AnchorPane();
                WebView webBrowser = new WebView();

                //Set Layout Constraint
                AnchorPane.setTopAnchor(webBrowser, 0.0);
                AnchorPane.setBottomAnchor(webBrowser, 0.0);
                AnchorPane.setLeftAnchor(webBrowser, 0.0);
                AnchorPane.setRightAnchor(webBrowser, 0.0);

                //Add WebView to AnchorPane
                anchorPane.getChildren().add(webBrowser);

                //Create Scene
                final Scene scene = new Scene(anchorPane);

                // Obtain the webEngine to navigate
                final WebEngine webEngine = webBrowser.getEngine();
                webEngine.load("http://www.google.com");
                _jfxPanel.setScene(scene);

При каждом запуске кода JavaFX обязательно запустите его в Platform.runLater ().

2) Должно быть предпочтительно бесплатное решение; OpenSource является плюсом.

Ну, это чистый Oracle Java.

3) Наличие в качестве артефакта maven является плюсом.

См. Ответ StackOverflow Проект Maven с JavaFX (с файлом JAR в `lib`) для получения рекомендаций по интеграции JavaFX и Maven.

С Java8 на JavaFX будет полностью интегрирован в Java.

Дополнительные плюсы: -поддерживает HTML5 и JavaScript (использует webkit) -поддерживает взаимодействие платформ - даже поддерживает взаимодействие с DOM, запуск JavaScript, получение уведомлений о событиях из Webview.

Минусы: -JavaFX должен быть установлен. Но он поставляется в комплекте с Java начиная с v7u6 (август 2012 г.)

Другие впечатления:

Я пытался djproject , но у меня было много проблем с совместимостью платформы. Работал довольно хорошо на Windows, но только с большими усилиями на Linux, и я не мог заставить его работать на Mac. Для каждой платформы вам также необходимо собрать 32-битную и 64-битную версию фляги. С большими усилиями и огромным файлом фляги вы могли бы объединить все вместе в одну флягу. Но это было далеко не удобно.

По сравнению с решением JavaFX, о котором я упоминал выше, DJProject был гораздо более болезненным.

2 голосов
/ 10 декабря 2011

CSSBox может быть тем, что вы ищете: http://cssbox.sourceforge.net

2 голосов
/ 14 марта 2010

Вы также можете получить доступ к собственному браузеру через что-то вроде: http://djproject.sourceforge.net/ns/

Для некоторых веб-страниц это иногда единственный путь. Всегда есть компромиссы.

Мне еще предстоит найти компонент браузера, который хорошо отрисовывается, имеет открытый исходный код и в то же время достаточно гибкий. Cobra близка, но есть страницы, которые она не будет отображать, и трудно (невозможно?) Делать такие вещи, как избавление от собственных полос прокрутки и т. Д.

1 голос
/ 13 марта 2010

Проверьте эту статью: http://devdaily.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-java

Он использует JEditorPane и некоторые другие классы Swing для анализа и рендеринга не только HTML, но и CSS.

0 голосов
/ 10 февраля 2016

Летающая тарелка хорошо выполняла свою работу, но следующий пример визуализированного текста стал огромным поворотом для разработки моего мобильного приложения на Linux Java:

Sometimes the period at the end changes line without the text beside .

Кроме того, этот текст нельзя выделить в отличие от JTextPanel.

Парсер, похоже, принимает только кодировку UTF-8. Мне не удалось заставить мою собственную кодировку при разборе.

0 голосов
/ 10 сентября 2015

Ничего себе, я никогда не думал, что найду то, что мне нравится в JavaFX. Но реализация браузера действительно хороша. Для тех (как я), которые никогда раньше не использовали JavaFx, вот полный класс (для фрагмента haferblues):

import com.sun.javafx.application.PlatformImpl;

import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

public class SwingBrowser extends JFXPanel {
    private static final long serialVersionUID = 1L;

    public SwingBrowser(String url) {
        PlatformImpl.startup(new Runnable() {
            @Override
            public void run() {
                final AnchorPane anchorPane = new AnchorPane();
                WebView webBrowser = new WebView();

                // Set Layout Constraint
                AnchorPane.setTopAnchor(webBrowser, 0.0);
                AnchorPane.setBottomAnchor(webBrowser, 0.0);
                AnchorPane.setLeftAnchor(webBrowser, 0.0);
                AnchorPane.setRightAnchor(webBrowser, 0.0);

                // Add WebView to AnchorPane
                anchorPane.getChildren().add(webBrowser);

                // Create Scene
                final Scene scene = new Scene(anchorPane);

                // Obtain the webEngine to navigate
                final WebEngine webEngine = webBrowser.getEngine();
                webEngine.load(url);

                setScene(scene);
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...