tags:

views:

193

answers:

2

Hi all,

Using the Synth LaF, I am unable to set a JLabel's FOREGROUND color for the DISABLED state. has anybody succeeded in doing this? Here is my label's style definition in my LaF.xml file.

    <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"/>

Please not that all the other styles defined in my LaF.xml file are rendered properly in my application including my label's WHITE normal state color (it just never goes to black when I do lbl.setEnabled(false)

Also, going through the Synth code, I have found the following comment in 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);
        }

But I could not figure out how to set a disabled color for a JLabel

Thanks for your help!

A: 

I know this question is old, but maybe someone still need the answer:

To customize the text color in Synth L&F, you need to set the color type to "TEXT_FOREGROUND", like this:

<state value="DISABLED">
    <color type="TEXT_FOREGROUND" value="BLACK"/>
</state>
Xavier Young
Unfortunately, TEXT_FOREGROUND does not work either. In fact, if you look at the code snippet I pasted from Synth's code, you can see that setting the FOREGROUND or TEXT_FOREGROUND has the same effect.
mmoris
Xavier Young
A: 

I found the source code for SynthStyle.getColor is different than yours (mine is from 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;
}
Xavier Young