如何使用SynthLookAndFeel更改“禁用的图标”样式?

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

[我目前正在设计一个带有自定义“黄底黑字”外观和感觉的Swing应用程序,似乎SynthLookAndFeel才是可行之路。

我的所有按钮都包含一个ImageIcon(无文本),例如:Original

禁用按钮时,我希望图标变为淡黄色:Desired

但是,默认的禁用图标只是“启用”图标的灰度版本,这打破了黄色的感觉:Current

我在this answer中读到,禁用的图标是getDisabledIcon()在内部生成的,但是我找不到从synth的XML文件控制它的位置。

我也读过SynthLookAndFeel的SynthPainter class,但似乎没有解决禁用图标的问题。

是否有一种方法可以使用SynthLookAndFeel控制“ getDisabledIcon”行为,或者我问得太多?在后一种情况下,为轻松定义按钮背景,形状等,使用或扩展最合适的外观是什么?

欢迎任何提示。

java swing look-and-feel synth
1个回答
1
投票

[确定,我想我找到了一种干净的方法。

[我在用SynthLookAndFeel寻找方法还是将另一个L&F子类化之间犹豫不决,但没有想到要对SynthLookAndFeel本身进行子类化:-)

我现在有了一个SynthLookAndFeel的实现,该实现完全符合我的要求,这意味着“已禁用”图标不是灰度图标,它是一种不饱和,暗淡的彩色版本:enter image description here

我们在这里获取完整代码:

import javax.swing.*;
import javax.swing.plaf.synth.SynthLookAndFeel;
import java.awt.*;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageProducer;
import java.awt.image.RGBImageFilter;

public class MySynthLookAndFeel extends SynthLookAndFeel {
    @Override
    public Icon getDisabledIcon(JComponent component, Icon icon) {
        if (icon instanceof ImageIcon) {
            return new ImageIcon(createDisabledImage(((ImageIcon)icon).getImage()));
        }
        return null;
    }

    private static Image createDisabledImage(Image i) {
        ImageProducer prod = new FilteredImageSource(i.getSource(), new RGBImageFilter() {
            public int filterRGB(int x, int y, int rgb) {
                // extract alpha mask
                int alphamask = rgb & 0xFF000000;

                // convert to HSB
                float[] hsb = Color.RGBtoHSB((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff, null);
                // desaturate (half saturation)
                hsb[1] *= 0.5;
                // dim (half brightness)
                hsb[2] *= 0.5;
                // convert back to RGB
                int rgbval = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);

                // reapply alpha
                rgbval = rgbval & 0x00FFFFFF | alphamask;
                return rgbval;
            }
        });
        return Toolkit.getDefaultToolkit().createImage(prod);
    }
}

最后比我想象的要简单得多。

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