Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能更改“的”;禁用图标“;使用SynthLookAndFeel进行风格设计?_Java_Swing_Look And Feel_Synth - Fatal编程技术网

Java 我怎样才能更改“的”;禁用图标“;使用SynthLookAndFeel进行风格设计?

Java 我怎样才能更改“的”;禁用图标“;使用SynthLookAndFeel进行风格设计?,java,swing,look-and-feel,synth,Java,Swing,Look And Feel,Synth,我目前正在设计一个Swing应用程序,它有一个定制的“黑上黄”的外观和感觉,而SynthLookAndFeel似乎是一个不错的选择 所有我的按钮都由一个图像图标(无文本)组成,例如: 禁用按钮后,我希望图标变为淡黄色: 但是,默认禁用图标只是“启用”图标的灰度版本,这打破了黄色的感觉: 我了解到禁用的图标是由getDisabledIcon()在内部生成的,但我找不到从synth的XML文件控制它的位置 我也读过SynthLookAndFeel,但它似乎没有解决禁用图标的问题 有没有一种方法可以使

我目前正在设计一个Swing应用程序,它有一个定制的“黑上黄”的外观和感觉,而SynthLookAndFeel似乎是一个不错的选择

所有我的按钮都由一个图像图标(无文本)组成,例如:

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

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

我了解到禁用的图标是由
getDisabledIcon()
在内部生成的,但我找不到从synth的XML文件控制它的位置

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

有没有一种方法可以使用SynthLookAndFeel控制“getDisabledIcon”行为,还是我要求太多?在后一种情况下,为了方便定义按钮背景、形状等,最适合使用或扩展的外观和感觉是什么


欢迎任何提示。

好的,我想我找到了一个干净的方法

我在寻找一种使用SynthLookAndFeel的方法还是将另一个L&F子类化之间犹豫不决。。。但没有想到将SynthLookAndFeel本身子类化:-)

我现在有了一个SynthLookAndFeel的实现,它完全符合我的要求,这意味着“禁用”图标不是灰度图标,而是一个去饱和、变暗的彩色版本:

下面是完整的代码:

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

比我想象的要简单得多。

那么
setDisabledIcon
呢?好吧
getDisabledIcon
的名字不好,因为它不是字段获取器,我想它应该被命名为
createDisabledIcon
,因为它将组件和图标作为参数,并处理图标以返回它的灰度版本。因此,没有
setDisabledIcon
mehod。。。