Java JPanel透明度问题

Java JPanel透明度问题,java,swing,transparency,jlabel,Java,Swing,Transparency,Jlabel,我有一个深灰色的JPanel,上面有一个JLabel。我将新颜色(0,0,0,5f)(tranparent)设置为JLabel的背景,并使用按钮多次更改文本。问题是,每次文本更改时,前一个文本仍保留在新文本后面。我将文本从“123456789”改为“1234567”、“12345”和“123”。以下是截图: 我如何摆脱这个“阴影” 我有一个深灰色的JPanel,上面有一个JLabel。我设置了新颜色(0,0,0,5f)(tranparent) Swing不支持透明背景 Swing希望组件可以是

我有一个深灰色的
JPanel
,上面有一个
JLabel
。我将
新颜色(0,0,0,5f)
(tranparent)设置为
JLabel
的背景,并使用按钮多次更改文本。问题是,每次文本更改时,前一个文本仍保留在新文本后面。我将文本从“123456789”改为“1234567”、“12345”和“123”。以下是截图:

我如何摆脱这个“阴影”

我有一个深灰色的JPanel,上面有一个JLabel。我设置了新颜色(0,0,0,5f)(tranparent)

Swing不支持透明背景

Swing希望组件可以是:

  • 不透明-这意味着在进行自定义绘制之前,组件将首先使用不透明颜色重新绘制整个背景,或者
  • 完全透明-在这种情况下,Swing将首先绘制第一个不透明父组件的背景,然后再进行自定义绘制
  • setOpaque(…)
    方法用于控制组件的不透明属性

    在任何一种情况下,这都可以确保移除任何绘制工件,并且可以正确完成自定义绘制

    如果要使用tranparency,则需要自己进行自定义绘制,以确保清除背景

    面板的自定义油漆应为:

    JPanel panel = new JPanel()
    {
        protected void paintComponent(Graphics g)
        {
            g.setColor( getBackground() );
            g.fillRect(0, 0, getWidth(), getHeight());
            super.paintComponent(g);
        }
    };
    panel.setOpaque(false); // background of parent will be painted first
    
    对于每个使用透明度的组件,都需要类似的代码


    或者,您可以查看可用于任何组件的自定义类,这些组件将为您完成上述工作。

    此相关功能还使
    JPanel
    半透明。

    尝试一下,也许它可以解决您的问题: 在行动中

    public void actionPerformed(ActionEvent e) {
        final JLabel tmpLabel = new JLabel(value[++i]); //change text
        label.setFont(new Font("Times New Roman", 1, 36));
        label.setForeground(new Color(255, 255, 255));
        label.setBackground(new Color(0, 0, 0, .5f));
        label.setHorizontalAlignment(SwingConstants.CENTER);
        label.setOpaque(true);
        label.setBounds(10, 10, 270, 70);
        label = tmpLabel; //replace the entire label with a new label
    }
    

    运行一点代码就好了。不要使用空布局,我给你的解决方案很好用。如果你想使用一个空布局,那么它还有一行代码。空布局总是额外的工作,所以请学习如何使用布局管理器并节省时间。