предварительная упаковка в JEditorPane - PullRequest
2 голосов
/ 24 сентября 2010

Я использую JEditorPane для отображения стилизованного текста, а также я использую тег <pre> для сохранения всех пробелов в тексте. Проблема в том, что я хочу иметь JEditorPane для переноса текстовых строк, но HTMLEditorKit (или связанный класс) не переносит текст внутри тега <pre>.

Я имею в виду, что мне нужен симулятор поведения для таблицы стилей "white-space: pre-wrap", которая, похоже, не поддерживается HTMLEditorKit.

Знаете ли вы, как заставить HTMLEditorKit обернуть текст внутри <pre>, возможно, расширить его.

Я сделал пример, чтобы показать, что я пытаюсь сделать.

<code>import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.text.*;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;

public class PreWrapApp extends javax.swing.JFrame {

    public class PreWrapHTMLEditorKit extends HTMLEditorKit {

        ViewFactory viewFactory = new HTMLFactory() {

            @Override
            public View create(Element elem) {
                AttributeSet attrs = elem.getAttributes();
                Object elementName = attrs.getAttribute(AbstractDocument.ElementNameAttribute);
                Object o = (elementName != null) ? null : attrs.getAttribute(StyleConstants.NameAttribute);
                if (o instanceof HTML.Tag) {
                    HTML.Tag kind = (HTML.Tag) o;
                    if (kind == HTML.Tag.PRE) {
                        //View view = new javax.swing.text.html.ParagraphView(elem); // Not wrapping
                        View view = new javax.swing.text.html.ParagraphView(elem.getElement(0)); // Don't show everything
                        return view;
                    }
                }
                return super.create(elem);
            }
        };

        @Override
        public ViewFactory getViewFactory() {
            return this.viewFactory;
        }
    }

    public PreWrapApp() {
        JEditorPane editorPane = new JEditorPane();
        JScrollPane scrollPane = new JScrollPane();

        this.setPreferredSize(new Dimension(300, 300));
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        //editorPane.setContentType("text/html");
        editorPane.setEditorKit(new PreWrapHTMLEditorKit());
        editorPane.setText(""
                + "<html>"
                + "<head>"
                + "<style type=\"text/css\">"
                + "pre.c1 { white-space: normal;}" // It is not wrapping
                + "pre.c2 { white-space: pre-wrap;}" // It is not wrapping
                + "p.c3 { white-space: pre;}" // It is not preserving white-spaces
                + "</style>"
                + "</head>"
                + "<body>"
                + "<pre class=\"c1\">long text line long text line long text line long text line (new line here!) \nlong text line long text line long text line long text line
» + "
 длинная текстовая строка длинная текстовая строка длинная текстовая строка длинная текстовая строка (новая строка здесь!) \ nlong длинная текстовая строка длинная текстовая строка длинная текстовая строка длинная текстовая строка 
" + "

длинная текстовая строка длинная текстовая строка длинная текстовая строка длинная текстовая строка (новая строка здесь!) \ nlong длинная текстовая строка длинная текстовая строка длинная текстовая строка длинная текстовая строка

" + "" + ""); scrollPane.setViewportView (editorPane); getContentPane () добавить (ScrollPane). упаковка (); } public static void main (String args []) { новый PreWrapApp (). setVisible (true); } }

Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 сентября 2010

Я наконец-то сделал это!

Все, что вам нужно сделать, это предотвратить создание javax.swing.text.html.LineView. Это представление, которое не переносится.

Ниже приведен полностью рабочий пример.

<code>import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.text.*;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;

public class PreWrapApp extends javax.swing.JFrame {

    public static class PreWrapHTMLEditorKit extends HTMLEditorKit {

        ViewFactory viewFactory = new HTMLFactory() {

            @Override
            public View create(Element elem) {
                AttributeSet attrs = elem.getAttributes();
                Object elementName = attrs.getAttribute(AbstractDocument.ElementNameAttribute);
                Object o = (elementName != null) ? null : attrs.getAttribute(StyleConstants.NameAttribute);
                if (o instanceof HTML.Tag) {
                    HTML.Tag kind = (HTML.Tag) o;
                    if (kind == HTML.Tag.IMPLIED) {
                        return new javax.swing.text.html.ParagraphView(elem);
                    }
                }
                return super.create(elem);
            }
        };

        @Override
        public ViewFactory getViewFactory() {
            return this.viewFactory;
        }
    }

    public PreWrapApp() {
        JEditorPane editorPane = new JEditorPane();
        JScrollPane scrollPane = new JScrollPane();

        this.setPreferredSize(new Dimension(300, 300));
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        editorPane.setEditorKit(new PreWrapHTMLEditorKit());
        editorPane.setText(""
                + "<html>"
                + "<head></head>"
                + "<body>"
                + "<pre>long text line long text line long text line long text line (two new lines here!)\n\n"
                + "long text line long text line long text line long text line long text line long text line
» + "" + ""); scrollPane.setViewportView (editorPane); getContentPane () добавить (ScrollPane). упаковка (); } public static void main (String args []) { новый PreWrapApp (). setVisible (true); } }
2 голосов
/ 24 сентября 2010

ОБНОВЛЕНИЕ2 (удален ошибочный ответ, который сейчас редактируется в вопросе)

Вам необходимо найти замену HTMLEditorKit, совместимую с CSS2 +. Вы можете подождать JWebPane навсегда или проверить некоторые из этих ответов . Другой маршрут будет браузер SWT , если у вас есть возможность немного выйти из Swing.

...