【问题标题】:Enabling word wrap in a JTextPane with HTMLDocument使用 HTMLDocument 在 JTextPane 中启用自动换行
【发布时间】:2011-12-10 07:58:24
【问题描述】:

我到处都读到人们在JTextPane 中寻找启用自动换行的方法的答案,但它们都不适合我。我正在使用HTMLDocument(显示"text/html" 内容),到目前为止我没有发现任何东西让它工作。 JTextPane 总是导致 JScrollPane 水平滚动。我需要 JTextPane 可滚动,但只能垂直滚动。

有没有人有一个可使用的自动换行演示 JTextPane 显示 HTML 内容?

【问题讨论】:

    标签: java html swing word-wrap jtextpane


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了!第一个工作。我之前尝试过第二个,但没有成功。谢谢!
    【解决方案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);
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 这是唯一对我有用的解决方案。然而,我遇到了一些不由空格或单词分隔的小图像的背靠背(背靠背,背靠背)问题。例如,一长串之间没有任何内容的表情仍然会遭受“非常长的单词”问题的相同症状。如果我找到一个可以编辑的简单修复,我会再次发表评论。
    • 非常感谢。我从字面上搜索了几个月的 HTMLEditorKit 实现,用于支持 WORD 换行而不是 LETTER 换行的 JTextPane。在我使用 StanislavL 的代码之前,它只支持看起来很糟糕的字母换行。然而,与 StanislavL 的代码相反,您的版本没有突出显示和下划线超链接。你知道如何解决这个问题吗?这对我有很大帮助,因为我不知道如何适应/编写自定义 HTMLEditorKit。
    • @trinity420 HTMLEditorKit 支持带有一些扩展的 HTML 3.2 版,因此您需要遵守当时可用的样式元素。我建议在此处发布一个新问题并将其链接,因为答案太长,无法发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多