JDK 7向JColorChooser添加了一个新的透明度滑块:

问题是我不想让我的用户选择透明颜色。不幸的是,似乎没有一种禁用滑块的简便方法。

消除透明度的一种方法是仅基于选定的颜色创建一种新颜色,但删除alpha值。但是,这给用户带来了错误的印象,因为滑块现在实际上什么也不做,我不希望周围有无用的UI元素。

所以我的问题是,摆脱透明度滑块的最佳方法是什么?

附注:IMO,很奇怪他们只是添加了滑块并将其设置为默认行为。这可能会导致JDK 6程序中的许多错误,这些错误不希望颜色选择器返回带有alpha值的颜色。

最佳答案

根据文档,可以仅修改/配置现有的类。因此,推荐的方法是创建自己的ChooserPanels(需要扩​​展AbstractColorChooserPanel),然后调用

JColorChooser jc = new JColorChooser();
jc.setChooserPanels(new AbstractColorChooserPanel[]{yourChooserPanel});

或者,如果您正在寻找更快/更简单/更丑陋的方法,请为您编写以下代码:
private static void removeTransparencySlider(JColorChooser jc) throws Exception {

    AbstractColorChooserPanel[] colorPanels = jc.getChooserPanels();
    for (int i = 1; i < colorPanels.length; i++) {
        AbstractColorChooserPanel cp = colorPanels[i];

        Field f = cp.getClass().getDeclaredField("panel");
        f.setAccessible(true);

        Object colorPanel = f.get(cp);
        Field f2 = colorPanel.getClass().getDeclaredField("spinners");
        f2.setAccessible(true);
        Object spinners = f2.get(colorPanel);

        Object transpSlispinner = Array.get(spinners, 3);
        if (i == colorPanels.length - 1) {
            transpSlispinner = Array.get(spinners, 4);
        }
        Field f3 = transpSlispinner.getClass().getDeclaredField("slider");
        f3.setAccessible(true);
        JSlider slider = (JSlider) f3.get(transpSlispinner);
        slider.setEnabled(false);
        Field f4 = transpSlispinner.getClass().getDeclaredField("spinner");
        f4.setAccessible(true);
        JSpinner spinner = (JSpinner) f4.get(transpSlispinner);
        spinner.setEnabled(false);
    }
}

祝你好运:)

关于Java 7 JColorChooser : Disable Transparency Slider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12026767/

10-10 22:10