在 java 中,我创建了一个 JCheckbox 并将其不透明设置为 false 并将该复选框添加到面板中。执行后,每当我将光标放在该复选框上时,复选框就会出现故障背景,这很烦人。
有什么解决办法吗?
我创建了具有此属性的面板:
setLayout(null);
setBounds(210, 75, 1301, 750);
setBorder(new LineBorder(Color.black, 2));
setBackground(new Color(0,0,0,175));
已创建复选框:
JCheckBox checkBox = new JCheckBox("Morning");
checkBox.setBounds(500, 300, 100, 30);
checkBox.setOpaque(false);
checkBox.setForeground(Color.white);
checkBox.setFont(new Font("DialogInput", Font.BOLD, 16));
checkBox.setFocusable(false);
add(checkBox);
Swing 不支持 alpha/半透明颜色,仅支持完全不透明的颜色,相反,您需要伪造它。
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Test");
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
setBorder(new EmptyBorder(32, 32, 32, 32));
TransparentCheckBox cb = new TransparentCheckBox();
cb.setBackground(Color.BLUE);
cb.setAlpha(0.5f);
add(cb);
}
}
public class TransparentCheckBox extends JCheckBox {
private float alpha = 1.0f;
public TransparentCheckBox() {
setOpaque(false);
}
public float getAlpha() {
return alpha;
}
public void setAlpha(float aplha) {
this.alpha = aplha;
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(getAlpha()));
g2d.setColor(getBackground());
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.dispose();
super.paintComponent(g);
}
}
}