在使用HTMLDocument的JTextPane中启用自动换行功能

5
我在很多地方看到人们寻找在JTextPane中实现自动换行的方法,但是没有一个方法对我有用。我正在使用HTMLDocument(以显示"text/html"内容),但是到目前为止我找到的所有方法都没法实现它。JTextPane总是导致JScrollPane横向滚动。我需要JTextPane可以滚动,但只能垂直滚动。
是否有人能提供一个演示如何在JTextPane中显示HTML内容并实现自动换行的可行示例?
1个回答

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);
                    }
                }
            }
        }
    }
}

2
这是唯一对我有效的解决方案。然而,我遇到了一些问题,即未用空格或单词分隔的小图像连续出现(四个、五个)。例如,一长串表情符号之间没有任何间隔仍然会出现“非常长的单词”问题的相同症状。如果我找到一个易于修复的解决方法,我会再次发表评论以供您编辑。 - gunfulker
1
非常感谢。我实际上搜索了数月,寻找支持WORD换行而不是LETTER换行的JTextPane的HTMLEditorKit实现。在使用只支持字母换行的StanislavL代码之前,它看起来很糟糕。然而,与StanislavL的代码相反,您的版本不会突出显示和下划线超链接。您知道如何解决这个问题吗?这将对我有很大帮助,因为我不知道如何适应/编写自定义HTMLEditorKit。 - trinity420
1
@trinity420 HTMLEditorKit 支持带有一些扩展的 HTML 版本 3.2,因此您需要遵守当时可用的样式元素。我建议您发布一个新问题并在此处链接它,因为答案对于评论来说太长了。 - Parker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接