我有几个JRadioButton:rb1,rb2; 包含在透明的JPanel p1中,而p1包含在一个名为mainPanel的彩色面板中。我也想使这些JRadioButton透明,这就是我要做的:
在mainPanel中: 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);
如果在mainPanel中包含rb1和rb2或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();
}
});
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句