使JTextPane背景透明

时间:2017-05-12 13:06:01

标签: java swing jtextpane

我创建了自己的Label类,它具有可复制的优点。

public class CopyableLabel extends JTextPane {

private static final long serialVersionUID = -1;

private static final Font DEFAULT_FONT;

static 
{
    Font font = UIManager.getFont("Label.font");
    DEFAULT_FONT = (font != null) ? font: new Font("Tahoma", Font.PLAIN, 11);
}

public CopyableLabel() {
    construct();
}

private void construct()
{
    setContentType("text/html");

    setEditable(false);
    setOpaque(false);
    setBackground(null);
    setBorder(null);

    putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
    setFont(DEFAULT_FONT);
}

public CopyableLabel(String text)
{
    super();
    construct();
    setText(text);
}

public void setFont(Font font)
{
    super.setFont(font);
    setMaximumSize(new Dimension(Short.MAX_VALUE,font.getSize()+4));
}

public CopyableLabel(String title, int align) 
{
    super();
    construct();
    setText(title);

    StyledDocument doc = getStyledDocument();
    SimpleAttributeSet center = new SimpleAttributeSet();
    StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
    switch(align)
    {
        case JLabel.LEFT:
            StyleConstants.setAlignment(center, StyleConstants.ALIGN_LEFT);
            break;
        case JLabel.RIGHT:
            StyleConstants.setAlignment(center, StyleConstants.ALIGN_RIGHT);
            break;
    }
    doc.setParagraphAttributes(0, doc.getLength(), center, false);
}

问题是,使用Nimbus Look and Feel,白色背景看起来很难看。所以我希望有可能让背景透明化。

你有解决方案吗?

2 个答案:

答案 0 :(得分:2)

如果这有帮助,那就不舒服了。但是使用Color,特别是颜色构造函数颜色(r,g,b,a),其中a是 alpha ,用于管理透明度。

因此将construct()方法更改为:

private void construct()
{
    setContentType("text/html");

    setEditable(false);
    setOpaque(true);
    backgroundColor = getBackground();
    int red = backgroundColor.getRed();
    int green = backgroundColor.getGreen();
    int blue = backgroundColor.getBlue();
    setBackground(new Color(red, green, blue, 25));
    //setBackground(null);
    setBorder(null);

    putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
    setFont(DEFAULT_FONT);
}

当我尝试使用上面提到的代码修改JTextPane并将其放在半透明的JFrame上时,它对我有用。

答案 1 :(得分:0)

另一个选项是自行设置HTML默认值。我从未使用过Nimbus,但我假设可能是他们为HTML渲染设置了背景色。您可以在设置nimbus L&F设置之后,在全局范围内使用以下命令在应用程序初始化的某个位置手动设置它:

HTMLEditorKit kit = new HTMLEditorKit();
StyleSheet styleSheet = kit.getStyleSheet();
Style style = styleSheet.getStyle("body");
StyleConstants.setBackground(style, new Color(0,0,0,0));

这将默认使HTML渲染在全局范围内具有透明背景。因此,例如,如果您要将HTML放入JLabel或其他组件中,则可以使用正常的setbackground来控制背景色,而不会干扰HTML背景。