【问题标题】:How can I make JRadioButton transparent in particular case?在特定情况下如何使 JRadioButton 透明?
【发布时间】:2016-09-17 12:38:35
【问题描述】:

我有几个 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 也没关系,但在我的情况下,结果不是我所期望的:

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

【问题讨论】:

    标签: java swing transparency jradiobutton


    【解决方案1】:

    您看到的奇怪的绘画文物是由以下原因引起的:

    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();
                }
            });
        }
    
    }
    

    【讨论】:

    • (1+) 用于使用setOpaque(...)。您还可以查看Backgrounds With Transparency 了解您需要半透明背景的情况。
    • 非常感谢。我曾经使用透明 JLabel 的技巧,但这不是正确的方法。再次感谢你,这是我的敬意!
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多