使用HTMLDocument在JTextPane中启用自动换行

Yan*_*hon 5 html java swing jtextpane word-wrap

在任何地方,我都会读到人们寻找启用自动换行的方法的答案JTextPane,但这些都不适合我.我正在使用HTMLDocument(显示"text/html"内容),到目前为止我发现的任何内容都无法正常工作.该JTextPane 总是导致JScrollPane的水平滚动条.我需要JTextPane可滚动,但只能垂直.

有没有人有一个可行的演示文字包装JTextPane显示HTML内容?

Sta*_*avL 5

以此为例实现自定义包装(无论您需要什么) http://java-sl.com/tip_html_letter_wrap.html

http://java-sl.com/wrap.html


val*_*tis 2

这个问题有几个重复项,也有很多答案,但我发现没有一个可以解决该问题。此类基于 Stanislav 针对纯文本换行的类似问题的解决方案之一,并进行了一些更改。此解决方案已使用 Java 1.7.0_55 进行测试。

import javax.swing.text.Element;
import javax.swing.text.LabelView;
import javax.swing.text.StyleConstants;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;

public class WrappedHtmlEditorKit extends HTMLEditorKit
{
    private static final long serialVersionUID = 1L;

    private ViewFactory viewFactory = null;

    public WrappedHtmlEditorKit()
    {
        super();
        this.viewFactory = new WrappedHtmlFactory();
        return;
    }

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

    private class WrappedHtmlFactory extends HTMLEditorKit.HTMLFactory
    {
        @Override
        public View create(Element elem)
        {
            View v = super.create(elem);

            if (v instanceof LabelView)
            {
                Object o = elem.getAttributes().getAttribute(StyleConstants.NameAttribute);

                if ((o instanceof HTML.Tag) && (o == HTML.Tag.BR))
                {
                    return v;
                }

                return new WrapLabelView(elem);
            }

            return v;
        }

        private class WrapLabelView extends LabelView
        {
            public WrapLabelView(Element elem)
            {
                super(elem);
                return;
            }

            @Override
            public float getMinimumSpan(int axis)
            {
                switch (axis)
                {
                    case View.X_AXIS:
                    {
                        return 0;
                    }
                    case View.Y_AXIS:
                    {
                        return super.getMinimumSpan(axis);
                    }
                    default:
                    {
                        throw new IllegalArgumentException("Invalid axis: " + axis);
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我有用的解决方案。然而,我在处理没有空格或文字分隔的小图像时遇到了一些问题。例如,一长串彼此之间没有任何内容的表情仍然遭受“非常长的单词”问题的相同症状。如果我找到可以编辑的简单修复,我会再次发表评论。 (2认同)