JPanel透明度问题

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

alt text

如何才能去掉这个“阴影”?

1
一点代码来运行会很好。 - gigadot
1
不要使用空布局,我给你的解决方案很好用。如果你想使用空布局,那么就需要再加一行代码。空布局总是额外的工作量,所以学会使用布局管理器可以节省时间。 - camickr
3个回答

6
我有一个带有JLabel的深灰色JPanel。我设置了新的Color(0, 0, 0, .5f)(半透明)。
Swing不支持透明背景。Swing期望组件是:
1. 不透明 - 这意味着组件将首先使用不透明颜色重新绘制整个背景,然后进行自定义绘制 2. 完全透明 - 在这种情况下,Swing在执行自定义绘制之前,将首先绘制第一个不透明父组件的背景
使用 `setOpaque(...)` 方法来控制组件的 opaque 属性。在任何一种情况下,这都可以确保清除任何绘画效果并且可以正确地进行自定义绘画。
如果您想要使用透明度,那么您需要自己进行自定义绘画以确保背景被清除。该面板的自定义绘制将是:
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

每个使用透明度的组件都需要类似的代码。

或者,您可以查看具有透明度的背景自定义类,可在任何组件上使用,它将为您完成上述工作。


3

这个相关的例子也会使JPanel半透明。


2

尝试这个,也许可以解决你的问题: 在actionPerformed中..

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接