5

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

替代文字

如何摆脱这个“阴影”?

4

3 回答 3

6

我有一个带有 JLabel 的深灰色 JPanel。我设置了 new Color(0, 0, 0, .5f) (透明)

Swing 不支持透明背景。

Swing 期望一个组件是:

  1. opaque - 这意味着组件将在进行自定义绘制之前先用不透明颜色重新绘制整个背景,或者
  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

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

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

于 2011-01-04T06:23:50.617 回答
3

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

于 2011-01-05T02:26:10.567 回答
2

试试这个,也许它会解决你的问题:在 actionPeroformed..

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
}
于 2011-01-05T11:12:57.830 回答