Synth LaF JLabel DISABLED цвет
Используя Synth LaF, я не могу установить ЗАГЛУШЕННЫЙ цвет JLabel для состояния ОТКЛЮЧЕНО. кому-нибудь удалось это сделать? Вот определение стиля моей метки в моем файле 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
Спасибо за вашу помощь!
2 ответа
Я знаю, что этот вопрос старый, но, возможно, кому-то все еще нужен ответ:
Чтобы настроить цвет текста в Synth L&F, необходимо установить тип цвета "TEXT_FOREGROUND", например:
<state value="DISABLED">
<color type="TEXT_FOREGROUND" value="BLACK"/>
</state>
Я обнаружил, что исходный код 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;
}