-
Bug
-
Resolution: Fixed
-
P3
-
8, 11, 12, 13
-
b07
-
x86_64
-
linux
ADDITIONAL SYSTEM INFORMATION :
JDK 1.8.0.202
A DESCRIPTION OF THE PROBLEM :
In com.sun.java.swing.plaf.gtk.GTKLookAndFeel there are unneccessary casts of javax.swing.plaf.synth.SynthStyleFactory to com.sun.java.swing.plaf.gtk.GTKStyleFactory, for example in the inner class FontLazyValue.
This breaks applications, which change the style factory. For example, IntelliJ uses the following UI tweak:
if (!UIUtil.isUnderGTKLookAndFeel()) return;
final SynthStyleFactory original = SynthLookAndFeel.getStyleFactory();
SynthLookAndFeel.setStyleFactory(new SynthStyleFactory() {
@Override
public SynthStyle getStyle(final JComponent c, final Region id) {
final SynthStyle style = original.getStyle(c, id);
if (id == Region.POPUP_MENU) {
final Integer x = ReflectionUtil.getField(style.getClass(), style, int.class, "xThickness");
if (x != null && x == 0) {
ReflectionUtil.setField(style.getClass(), style, int.class, "xThickness", 1);
ReflectionUtil.setField(style.getClass(), style, int.class, "yThickness", 3);
}
}
return style;
}
});
new JPopupMenu(); // invokes updateUI() -> updateStyle()
SynthLookAndFeel.setStyleFactory(original);
Because the only called method #getStyle is present in the base class SynthStyleFactory, the cast to GTKStyleFactory is unneccessary.
Instead of
public Object createValue(UIDefaults table) {
GTKStyleFactory factory = (GTKStyleFactory)getStyleFactory();
GTKStyle style = (GTKStyle)factory.getStyle(null, region);
return style.getDefaultFont();
}
you can simply write:
public Object createValue(UIDefaults table) {
SynthStyleFactory factory = getStyleFactory();
GTKStyle style = (GTKStyle)factory.getStyle(null, region);
return style.getDefaultFont();
}
REGRESSION : Last worked in version 8u202
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
see above
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
see above
---------- BEGIN SOURCE ----------
see above
---------- END SOURCE ----------
FREQUENCY : always
JDK 1.8.0.202
A DESCRIPTION OF THE PROBLEM :
In com.sun.java.swing.plaf.gtk.GTKLookAndFeel there are unneccessary casts of javax.swing.plaf.synth.SynthStyleFactory to com.sun.java.swing.plaf.gtk.GTKStyleFactory, for example in the inner class FontLazyValue.
This breaks applications, which change the style factory. For example, IntelliJ uses the following UI tweak:
if (!UIUtil.isUnderGTKLookAndFeel()) return;
final SynthStyleFactory original = SynthLookAndFeel.getStyleFactory();
SynthLookAndFeel.setStyleFactory(new SynthStyleFactory() {
@Override
public SynthStyle getStyle(final JComponent c, final Region id) {
final SynthStyle style = original.getStyle(c, id);
if (id == Region.POPUP_MENU) {
final Integer x = ReflectionUtil.getField(style.getClass(), style, int.class, "xThickness");
if (x != null && x == 0) {
ReflectionUtil.setField(style.getClass(), style, int.class, "xThickness", 1);
ReflectionUtil.setField(style.getClass(), style, int.class, "yThickness", 3);
}
}
return style;
}
});
new JPopupMenu(); // invokes updateUI() -> updateStyle()
SynthLookAndFeel.setStyleFactory(original);
Because the only called method #getStyle is present in the base class SynthStyleFactory, the cast to GTKStyleFactory is unneccessary.
Instead of
public Object createValue(UIDefaults table) {
GTKStyleFactory factory = (GTKStyleFactory)getStyleFactory();
GTKStyle style = (GTKStyle)factory.getStyle(null, region);
return style.getDefaultFont();
}
you can simply write:
public Object createValue(UIDefaults table) {
SynthStyleFactory factory = getStyleFactory();
GTKStyle style = (GTKStyle)factory.getStyle(null, region);
return style.getDefaultFont();
}
REGRESSION : Last worked in version 8u202
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
see above
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
see above
---------- BEGIN SOURCE ----------
see above
---------- END SOURCE ----------
FREQUENCY : always