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

Java 在另一个透明对象上绘制透明对象,java,swing,transparency,Java,Swing,Transparency,我将半透明的JCheckBox对象放置在半透明的JPanel上。当我将鼠标光标移动到JCheckBox对象上时,它会将JCheckBox对象重新绘制到原始JCheckBox对象的顶部,并将原始JCheckBox对象替换为几个单元格 我想让它做的是在我将鼠标光标移到它上面后看起来完全一样 之前(鼠标光标不在JCheckBox对象上): 之后(鼠标光标位于JCheckBox对象上): 代码: 很抱歉,如果已经问过这个问题。我到处找,找不到有同样问题的人。 再次抱歉,如果这篇文章不是一个合法的SS

我将半透明的JCheckBox对象放置在半透明的JPanel上。当我将鼠标光标移动到JCheckBox对象上时,它会将JCheckBox对象重新绘制到原始JCheckBox对象的顶部,并将原始JCheckBox对象替换为几个单元格

我想让它做的是在我将鼠标光标移到它上面后看起来完全一样

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

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

代码:

很抱歉,如果已经问过这个问题。我到处找,找不到有同样问题的人。 再次抱歉,如果这篇文章不是一个合法的SSCCE。这是我在这里的第一篇文章

编辑1:编辑代码。这个问题仍然存在

编辑2:代码现在可以工作了。

有关绘画工作原理的说明,以及您可以使用的解决方案,请参阅


在这种情况下,我猜您需要将TransparentPanel和复选框添加到一个单独的
AlphaContainer

我添加了链接推荐的两个部分。它仍然有重新绘制的问题,但颜色更暗。@user2782185,我刚刚完成更新我的建议。该解决方案需要应用于这两个组件。我使用AlphaContainer对其进行了测试。如果要重写paintComponent()方法,则应在TransparentPanel类中执行此操作,因为使用此组件时都需要此代码。此外,它应该是
super.paintComponent(…)
(不带“s”)。
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);
    }
}