在特定情况下如何使 JRadioButton 透明?

How can I make JRadioButton transparent in particular case?

我有几个 JRadioButton:rb1,rb2;它包含在透明的 JPanel p1 中,而 p1 包含在名为 mainPanel 的彩色面板中。 我也想让这些 JRadioButton 透明,这就是我所做的:

在主面板中:mainPanel.setBackground(Color.RED);

在 p1 中:p1.setBackground(new Color(0,0,0,0));

在 rb1 和 rb2 中:

rb1.setOpaque(false);
        rb1.setContentAreaFilled(false);
        rb1.setBorderPainted(false);
        rb2.setOpaque(false);
        rb2.setContentAreaFilled(false);
        rb2.setBorderPainted(false);

如果 rb1 和 rb2 包含在 mainPanel 中或者如果 p1 不是透明的 JPanel 也没关系,但在我的情况下,结果不是我所期望的:

如何解决这个问题?提前致谢!

您看到的奇怪的绘画伪影是由以下原因造成的:

p1.setBackground(new Color(0,0,0,0));

这样就不会通知父容器清除它的背景并重新绘制。所以如果你想让面板完全透明,就用setOpaque(false)代替。您还只需要在单选按钮上调用此方法即可。

setOpaque会通知父重绘,但是如果你想要一个半透明的面板,你必须覆盖paintComponent并手动调用super.paintComponent(Graphics)


import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class Example {

    public void createAndShowGUI() {    
        JRadioButton encryptButton = new JRadioButton("Encrypt");
        encryptButton.setOpaque(false);

        JRadioButton decryptButton = new JRadioButton("Decrypt");
        decryptButton.setOpaque(false);

        ButtonGroup group = new ButtonGroup();
        group.add(encryptButton);
        group.add(decryptButton);

        JPanel subPanel = new JPanel();
        subPanel.setOpaque(false);
        subPanel.add(encryptButton);
        subPanel.add(decryptButton);

        JPanel mainPanel = new JPanel();
        mainPanel.setBackground(Color.CYAN);
        mainPanel.add(subPanel);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(mainPanel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example().createAndShowGUI();
            }
        });
    }

}