使用java swing为JCheckbox设置透明背景而不改变JPanel的背景颜色

问题描述 投票:0回答:1

在 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);
java swing
1个回答
0
投票

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

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.