Подтвердить что ты не робот

Pure Java HTML viewer/renderer для использования в прокручиваемой панели

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

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

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

4b9b3361

Ответ 1

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

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

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 так же хорошо, как ваш браузер.

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

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


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

Пробовал Cobra/Lobo, CSSBox, и Flying Saucer, вся чистая Java. Другие являются либо родными, либо коммерческими.

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

Рассказ: Flying Saucer прост в использовании и рендеринг является наиболее правильным, но лучше иметь полный контроль над контентом. В противном случае найдите собственное решение.

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

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

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

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

Ответ 2

Если вы используете 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 был причиной большей боли.

Ответ 3

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

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

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

Ответ 6

Ничего себе, я никогда не думал, что найду что-то, что мне нравится в 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);
            }
        });
    }
}

Ответ 7

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

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

Кроме того, текст не выбирается в отличие от JTextPanel.

Parser только, кажется, принимает кодировку UTF-8. Я не смог заставить свою собственную кодировку при разборе.