为了账号安全,请及时绑定邮箱和手机立即绑定

在 JComponent 上创建阴影的颜色不同于白色的问题

在 JComponent 上创建阴影的颜色不同于白色的问题

慕码人8056858 2023-04-26 16:52:21
我正在为 swing 开发新的外观和感觉,现在我在 JComponent 中创建阴影时遇到了问题,例如,当我创建颜色不同于白色的 JButton 时,我的阴影效果不正确这是类似于创建阴影的代码。protected void paintShadow(@NotNull Graphics g, @NotNull JComponent c){        int shade = 0;        int topOpacity = 80;        int pixels = UIManager.getInt("Button[Default].shadowPixel");        JButton b = (JButton) c;        for (int i = 0; i < pixels; i++) {            g.setColor(new Color(shade, shade, shade, ((topOpacity / pixels) * i)));            g.drawRoundRect(i, i, b.getWidth() - ((i * 2) + 1), b.getHeight() - ((i * 2) + 1), 7, 7);        }    }这是白色的正确效果这是其他颜色的错误效果我怎样才能概括我的绘画阴影方法?这是此代码的最小示例import javax.swing.*;import javax.swing.plaf.basic.BasicButtonUI;import java.awt.*;/** * @author https://github.com/vincenzopalazzo */public class MaterialMain extends JFrame {    static {        UIManager.put("Button[Default].shadowPixel", 3);    }    public void init() {        JPanel panel = new JPanel();        JButton witheRightEffect = new JButton("shadow withe");        witheRightEffect.setUI(new ShadowButtonUI());        JButton otherColorWrongEffect = new JButton("shadow other color");        otherColorWrongEffect.setBackground(Color.GREEN);        otherColorWrongEffect.setUI(new ShadowButtonUI());        panel.add(witheRightEffect);        panel.add(otherColorWrongEffect);        setTitle("Look and feel");        setDefaultCloseOperation(EXIT_ON_CLOSE);        setSize(630, 360);        add(panel);        setLocationRelativeTo(null);        setVisible(true);    }    public static void main(String[] args) {        SwingUtilities.invokeLater(new Runnable() {            @Override            public void run() {                MaterialMain main = new MaterialMain();                main.init();            }        });    }白色按钮是正确的效果,但绿色按钮的阴影是错误的
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

我想回答这个问题,我有一个在 JButton 上创建阴影的原始解决方案。


这是我的方法的代码


public class ShadowButton {

    public static void main(String... args) {

        SwingUtilities.invokeLater(ShadowButton::new);

    }


    public ShadowButton() {

        var fadeWidth = 30;

        var p = new JPanel();

        var b = new JButton("with fading out border!!!") {

            @Override

            public void paintBorder(Graphics g) {

                var rec = g.getClip().getBounds();

                var c = this.getBackground();

                var d = this.getParent().getBackground();

                for (int i = 0; i < fadeWidth; i++) {

                    var col = mixColor(c, d, 1.0 * (i + 1) / fadeWidth);

                    g.setColor(col);

                    g.drawRect(rec.x + i, rec.y + i, rec.width - 2 * i, rec.height - 2 * i);

                }

            }

        };

        b.setFocusable(false);

        b.setBackground(Color.GREEN);

        b.setForeground(Color.BLACK);

        Font f = new Font("Arial", Font.BOLD, 36);

        b.setFont(f);

        b.setBorder(BorderFactory.createLineBorder(b.getBackground(), fadeWidth, false));

        p.setBackground(Color.RED);

        p.add(b);

        var frame = new JFrame("Shadoe Demo");

        frame.setContentPane(p);

        frame.pack();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setLocationRelativeTo(null);

        frame.setVisible(true);

    }


    private static Color mixColor(Color c, Color d, double factor) {

        float[] cc = c.getComponents(null);

        float[] dd = d.getComponents(null);

        float[] result = new float[cc.length];

        for (int i = 0; i < 4; i++) {

            result[i] = (float) (factor * cc[i] + (1 - factor) * dd[i]);

        }

        return new Color(result[0], result[1], result[2], result[3]);

    }

}


查看完整回答
反对 回复 2023-04-26
  • 1 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信