【问题标题】:Synth LaF JLabel DISABLED colorSynth LaF JLabel 禁用颜色
【发布时间】:2010-01-06 16:42:57
【问题描述】:

使用 Synth LaF,我无法将 JLabel 的 FOREGROUND 颜色设置为 DISABLED 状态。有没有人成功做到这一点?这是我的 LaF.xml 文件中标签的样式定义。

    <style id="whiteLabelStyle">
        <opaque value="false"/>
        <font name="Bitstream Vera Sans" size="16" />
        <state>
            <color type="FOREGROUND" value="WHITE"/>
        </state>
        <state value="DISABLED">
            <color type="FOREGROUND" value="BLACK"/>
        </state>
    </style>
    <bind style="whiteLabelStyle" type="name" key="WhiteOrbitLabel"/>

请不要让我的 LaF.xml 文件中定义的所有其他样式在我的应用程序中正确呈现,包括我的标签的白色正常状态颜色(当我执行 lbl.setEnabled(false) 时它永远不会变黑

另外,通过 Synth 代码,我在 SynthStyle.getColor 中找到了以下注释

        if ((context.getComponentState() & SynthConstants.DISABLED) != 0) {
        //This component is disabled, so return the disabled color.
        //In some cases this means ignoring the color specified by the
        //developer on the component. In other cases it means using a
        //specified disabledTextColor, such as on JTextComponents.
        //For example, JLabel doesn't specify a disabled color that the
        //developer can set, yet it should have a disabled color to the
        //text when the label is disabled. This code allows for that.
        if (c instanceof JTextComponent) {
            JTextComponent txt = (JTextComponent)c;
            Color disabledColor = txt.getDisabledTextColor();
            if (disabledColor == null || disabledColor instanceof UIResource) {
                return getColorForState(context, type);
            }
        } else if (c instanceof JLabel 
                && (type == ColorType.FOREGROUND || type == ColorType.TEXT_FOREGROUND)){
            return getColorForState(context, type);
        }

但我不知道如何为 JLabel 设置禁用颜色

感谢您的帮助!

【问题讨论】:

    标签: java swing synth


    【解决方案1】:

    我知道这个问题很老了,但也许有人仍然需要答案:

    要自定义 Synth L&F 中的文本颜色,您需要将颜色类型设置为“TEXT_FOREGROUND”,如下所示:

    <state value="DISABLED">
        <color type="TEXT_FOREGROUND" value="BLACK"/>
    </state>
    

    【讨论】:

    • 不幸的是,TEXT_FOREGROUND 也不起作用。其实如果你看一下我从Synth的代码中粘贴的sn -p代码,你可以看到设置FOREGROUND或者TEXT_FOREGROUND是一样的效果。
    • 您粘贴的代码 sn-p 与 Sun 的 JDK 1.5 不同(我在下一个答案中粘贴了它)。我们公司已经交付了一个基于 Synth 的开源 L&F,它已经解决了这个问题。你可以用谷歌搜索“EaSynth Look And Feel”。
    【解决方案2】:

    我发现 SynthStyle.getColor 的源代码与你的不同(我的是来自 Sun JDK 1.5):

    /**
     * Returns the color for the specified state. This gives precedence to
     * foreground and background of the <code>JComponent</code>. If the
     * <code>Color</code> from the <code>JComponent</code> is not appropriate,
     * or not used, this will invoke <code>getColorForState</code>. Subclasses
     * should generally not have to override this, instead override
     * {@link #getColorForState}.
     *
     * @param context SynthContext identifying requester
     * @param type Type of color being requested.
     * @return Color
     */
    public Color getColor(SynthContext context, ColorType type) {
        JComponent c = context.getComponent();
        Region id = context.getRegion();
        int cs = context.getComponentState();
        // For the enabled state, prefer the widget's colors
        if (!id.isSubregion() && cs == SynthConstants.ENABLED) {
            if (type == ColorType.BACKGROUND) {
                return c.getBackground();
            }
            else if (type == ColorType.FOREGROUND) {
                return c.getForeground();
            }
            else if (type == ColorType.TEXT_FOREGROUND) {
                // If getForeground returns a non-UIResource it means the
                // developer has explicitly set the foreground, use it over
                // that of TEXT_FOREGROUND as that is typically the expected
                // behavior.
                Color color = c.getForeground();
                if (!(color instanceof UIResource)) {
                    return color;
                }
            }
        }
        // Then use what we've locally defined
        Color color = getColorForState(context, type);
        if (color == null) {
            // No color, fallback to that of the widget.
            if (type == ColorType.BACKGROUND ||
                        type == ColorType.TEXT_BACKGROUND) {
                return c.getBackground();
            }
            else if (type == ColorType.FOREGROUND ||
                     type == ColorType.TEXT_FOREGROUND) {
                return c.getForeground();
            }
        }
        return color;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 1970-01-01
      • 2013-05-08
      • 2013-07-10
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多