在另一个透明对象上绘制透明对象

时间:2013-09-15 23:25:49

标签: java swing transparency

我在半透明的JPanel上放置一个半透明的JCheckBox对象。当我将鼠标光标移动到JCheckBox对象上时,它会重新绘制原始JCheckBox对象顶部的JCheckBox对象,从原始JCheckBox对象中移出一些单元格。

我想要它做的是在我将鼠标光标移到它上面之后看起来完全相同。

之前(鼠标光标不在JCheckBox对象上):

http://i.imgur.com/J6zZwuD.png

之后(鼠标光标在JCheckBox对象上):

http://i.imgur.com/Wygqq4o.png

代码:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

class TransparentPanel extends JPanel{
    public TransparentPanel(){
        super();
        setOpaque(false);
        setBackground(new Color(0, 0, 0, 100));

        JCheckBox checkBox=new JCheckBox("Check Box"){
            protected void paintComponent(Graphics g){
                g.setColor(getBackground());
                g.fillRect(0, 0, getWidth(), getHeight());
                super.paintComponent(g);
            }
        };
        checkBox.setFocusable(false);
        checkBox.setOpaque(false);
        checkBox.setBackground(new Color(200, 200, 200, 50));
        add(checkBox);
    }
    @Override
    protected void paintComponent(Graphics g){
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }
    public static void main(String[] args){
        JFrame frame=new JFrame();
        frame.setSize(200, 100);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TransparentPanel());
        frame.setVisible(true);
    }
}

很抱歉,如果已经提出这个问题。我全神贯注地找不到有同样问题的人。 如果这篇文章不是合法的SSCCE,那就再说一遍。这是我在这里的第一篇文章。

编辑1:编辑代码。问题依然存在。

编辑2:代码现在有效。

1 个答案:

答案 0 :(得分:2)

有关绘画如何工作的解释,请参阅Backgrounds With Transparency

在这种情况下,我猜你需要将TransparentPanel和checkBox添加到单独的AlphaContainer