我使用的代码是:

public class Test extends JFrame implements ActionListener {

    private static final Color TRANSP_WHITE =
        new Color(new Float(1), new Float(1), new Float(1), new Float(0.5));
    private static final Color TRANSP_RED =
        new Color(new Float(1), new Float(0), new Float(0), new Float(0.1));
    private static final Color[] COLORS =
        new Color[]{TRANSP_RED, TRANSP_WHITE};
    private int index = 0;
    private JLabel label;
    private JButton button;

    public Test() {
        super();

        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        label = new JLabel("hello world");
        label.setOpaque(true);
        label.setBackground(TRANSP_WHITE);

        getContentPane().add(label);

        button = new JButton("Click Me");
        button.addActionListener(this);

        getContentPane().add(button);

        pack();
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(button)) {
            label.setBackground(COLORS[index % (COLORS.length)]);
            index++;
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}

当我点击按钮改变labales着色GUI看起来像这样:

在: “替代文字” 后: “替代文字”

任何想法,为什么?

有帮助吗?

解决方案

您给JLabel的背景是半透明的,但你已经指定它是不透明的。这意味着,秋千不会画下它的组件提供了一个JLabel之前与Graphics对象用于绘图。所提供的图形中包含的垃圾,它期待着一个JLabel当它绘制其背景覆盖。然而,当它绘制其背景是半透明的,从而垃圾残留。

要解决,你需要创建一个JLabel的扩展,它是透明的问题,但有一个重写的paintComponent方法,这将吸引你想要的背景。

编辑:这里是一个例子:

public class TranslucentLabel extends JLabel {
    public TranslucentLabel(String text) {
        super(text);
        setOpaque(false);
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        graphics.setColor(getBackground());
        graphics.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(graphics);
    }
}

其他提示

背景随着透明度为您提供接受了溶液的,但还提供了一个解决方案可以不延长的JLabel使用,这可能是感兴趣的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top