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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 版,因此您需要遵守当时可用的样式元素。我建议在此处发布一个新问题并将其链接,因为答案太长,无法发表评论。

以上是关于使用 HTMLDocument 在 JTextPane 中启用自动换行的主要内容,如果未能解决你的问题,请参考以下文章

javascript操作后获取HtmlDocument

Android源码访问者模式---HtmlDocument

Android源码访问者模式---HtmlDocument

从 HTML 字符串创建 HTMLDocument(在 Java 中)

HTMLDocument.Iterator 类型不是一般错误

htmlDocument.GetElementById 返回具有相同名称的元素,而不是 id