在特定情况下如何使 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();
}
});
}
}
我有几个 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();
}
});
}
}