JTextPane 文本背景颜色不起作用

Posted

技术标签:

【中文标题】JTextPane 文本背景颜色不起作用【英文标题】:JTextPane text background color does not work 【发布时间】:2012-10-28 10:36:30 【问题描述】:

我正在尝试使用JTextPane 制作一个小的 html-wysiwyg,但我无法让 BackgroundAction 工作。我在JTextPaneStyledDocument 上使用setCharacterAttributes,但这似乎有问题。视图还可以,但Document 不行。

这是一个显示问题的小演示代码。有2个JTextPane

    我在第一个中设置了文本的背景颜色 我检索第一个 JTextPane 的文本并将其设置在第二个上

    --> 尽管文本相同,但它们显示的内容不同。

有没有办法在当前选定的文本上设置背景颜色并让JTextPane 报告更新的 HTML 文本?

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class TestDifferentStyles 

    private void initUI() 
        JFrame frame = new JFrame(TestDifferentStyles.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JTextPane textPane = new JTextPane();
        final JTextPane textPane2 = new JTextPane();
        textPane2.setEditable(false);
        textPane.setContentType("text/html");
        textPane2.setContentType("text/html");
        textPane.setText("<html><head></head><body><p>Hello world</p></body></html>");
        SimpleAttributeSet set = new SimpleAttributeSet();
        StyleConstants.setForeground(set, Color.GREEN);
        StyleConstants.setBackground(set, Color.BLACK);
        ((StyledDocument) textPane.getDocument()).setCharacterAttributes(0, textPane.getDocument().getLength(), set, false);

        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        panel.add(textPane, gbc);
        panel.add(textPane2, gbc);
        frame.add(panel);
        frame.setSize(500, 400);
        frame.setVisible(true);
        SwingUtilities.invokeLater(new Runnable() 
            @Override
            public void run() 
                System.err.println(textPane.getText());
                textPane2.setText(textPane.getText());
            
        );
    

    public static void main(String[] args) 

        javax.swing.SwingUtilities.invokeLater(new Runnable() 
            @Override
            public void run() 
                new TestDifferentStyles().initUI();
            
        );
    


输出结果(每个JTextPane周围都有黑色边框):

【问题讨论】:

必须等待@Stanislav,他有覆盖 Carer、Selections 和 HightLighter 的解决方案,我认为这是关于 UImanager 及其 XxxResources, @mKorbel 好的,谢谢。然后我会等 StanislavL :-) 参见 Charles Bell 的 HTMLDocumentEditor,引用 here。 @trashgod 实际上我正在重用 Metaphase 编辑器,但他们的 BackgroundAction 很模糊并且无法正常工作,所以我尝试修复它。我在您的示例中找不到BackgroundColorAction,但 Metaphase 是基于类似的东西。 @trashgod 是的(我们不得不对其进行很多调整,不幸的是该项目看起来并不活跃),但是here is the link to the metaphase editor website。感谢您的 cmets 和欢呼 ;-) 【参考方案1】:

下面是可以设置背景颜色的Action的代码:

public class BackgroundColorAction extends StyledEditorKit.StyledTextAction 

    private Color color;

    public BackgroundColorAction(Color color) 
        super(StyleConstants.Background.toString());
        this.color = color;
    

    @Override
    public void actionPerformed(ActionEvent ae) 
        JEditorPane editor = getEditor(ae);
        if (editor == null) 
            return;
        
        //Add span Tag
        String htmlStyle = "background-color:" + Util.getHTMLColor(color);
        SimpleAttributeSet attr = new SimpleAttributeSet();
        attr.addAttribute(HTML.Attribute.STYLE, htmlStyle);
        MutableAttributeSet outerAttr = new SimpleAttributeSet();
        outerAttr.addAttribute(HTML.Tag.SPAN, attr);
        //Next line is just an instruction to editor to change color
        StyleConstants.setBackground(outerAttr, this.color);
        setCharacterAttributes(editor, outerAttr, false);
    

我在设置背景颜色时遇到了很多麻烦。但最后,我设法破解了它。 对不起,我忘了发布子程序。给你:

/**  
 * Convert a Java Color to equivalent HTML Color.
 *
 * @param color The Java Color
 * @return The String containing HTML Color.
 */
public static String getHTMLColor(Color color) 
    if (color == null) 
        return "#000000";
    
    return "#" + Integer.toHexString(color.getRGB()).substring(2).toUpperCase();

【讨论】:

找不到适合 Util 类的包,它似乎不是一个字段。您能否阐明这一行中“Util”所指的内容:Util.getHTMLColor(color); @NickRippe 我还没有时间验证代码(将尽快完成),但我猜它会做类似的事情:"#"+String.format("%1$02x%2$02x%3$02x", color.getRed(), color.getGreen(), color.getBlue()) 刚刚验证了它,它就像一个魅力。 +1 和接受的答案。 谢谢,找了半天设置背景色的答案,终于找到正确的了!

以上是关于JTextPane 文本背景颜色不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CSS不透明度背景颜色和文本不起作用[重复]

如何在 JTextPane 中的一行上设置自定义背景颜色

使用 jQuery 尝试更改文本框的背景颜色但在 wordpress 中不起作用

设置单元格的背景颜色不起作用 - IOS [重复]

导航菜单的悬停文本颜色不起作用

如何在 mac 终端中更改文本颜色和背景?