-
Bug
-
Resolution: Fixed
-
P3
-
8u51, 9
-
b117
-
x86
-
linux
A DESCRIPTION OF THE REQUEST :
When subclassing for custom UI implementation, there is no other way to create SynthContext objects than using the public constructor available in SynthContext. The SynthContext.getContext() method is not visible.
JUSTIFICATION :
Instantiating SynthContext via the public constructor will cause the SynthContext.dispose() method to indefinitely put these instances into its queue with no way to remove them.
Getting SynthContext instances should be done by using the getContext() static method which is package visible.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
SynthContext.getContext() should be public.
public constructor should be deprecated.
ACTUAL -
SynthContext.getContext() is package visible.
---------- BEGIN SOURCE ----------
import java.awt.event.FocusListener;
import java.lang.reflect.Method;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.synth.Region;
import javax.swing.plaf.synth.SynthConstants;
import javax.swing.plaf.synth.SynthContext;
import javax.swing.plaf.synth.SynthLookAndFeel;
import javax.swing.plaf.synth.SynthStyle;
import javax.swing.plaf.synth.SynthTextFieldUI;
public class MyTextFieldUI extends SynthTextFieldUI {
private int getComponentState(final JTextField c) {
if (c.isEnabled() && c.isEditable()) {
if (c.isFocusOwner()) {
return SynthConstants.ENABLED | SynthConstants.FOCUSED;
}
return SynthConstants.ENABLED;
}
return SynthConstants.DISABLED;
}
@Override
public SynthContext getContext(final JComponent c) {
Region region = SynthLookAndFeel.getRegion(c);
return new SynthContext(c, region, SynthLookAndFeel.getStyle(c, region), this.getComponentState((JTextField) c));
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
import java.awt.event.FocusListener;
import java.lang.reflect.Method;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.synth.Region;
import javax.swing.plaf.synth.SynthConstants;
import javax.swing.plaf.synth.SynthContext;
import javax.swing.plaf.synth.SynthLookAndFeel;
import javax.swing.plaf.synth.SynthStyle;
import javax.swing.plaf.synth.SynthTextFieldUI;
public class MyTextFieldUI extends SynthTextFieldUI {
private int getComponentState(final JTextField c) {
if (c.isEnabled() && c.isEditable()) {
if (c.isFocusOwner()) {
return SynthConstants.ENABLED | SynthConstants.FOCUSED;
}
return SynthConstants.ENABLED;
}
return SynthConstants.DISABLED;
}
@Override
public SynthContext getContext(final JComponent c) {
try {
Method method = SynthContext.class.getDeclaredMethod("getContext", JComponent.class, SynthStyle.class, int.class);
method.setAccessible(true);
Region region = SynthLookAndFeel.getRegion(c);
return (SynthContext) method.invoke(
SynthContext.class,
c,
SynthLookAndFeel.getStyle(c, region),
this.getComponentState((JTextField) c)
);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
When subclassing for custom UI implementation, there is no other way to create SynthContext objects than using the public constructor available in SynthContext. The SynthContext.getContext() method is not visible.
JUSTIFICATION :
Instantiating SynthContext via the public constructor will cause the SynthContext.dispose() method to indefinitely put these instances into its queue with no way to remove them.
Getting SynthContext instances should be done by using the getContext() static method which is package visible.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
SynthContext.getContext() should be public.
public constructor should be deprecated.
ACTUAL -
SynthContext.getContext() is package visible.
---------- BEGIN SOURCE ----------
import java.awt.event.FocusListener;
import java.lang.reflect.Method;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.synth.Region;
import javax.swing.plaf.synth.SynthConstants;
import javax.swing.plaf.synth.SynthContext;
import javax.swing.plaf.synth.SynthLookAndFeel;
import javax.swing.plaf.synth.SynthStyle;
import javax.swing.plaf.synth.SynthTextFieldUI;
public class MyTextFieldUI extends SynthTextFieldUI {
private int getComponentState(final JTextField c) {
if (c.isEnabled() && c.isEditable()) {
if (c.isFocusOwner()) {
return SynthConstants.ENABLED | SynthConstants.FOCUSED;
}
return SynthConstants.ENABLED;
}
return SynthConstants.DISABLED;
}
@Override
public SynthContext getContext(final JComponent c) {
Region region = SynthLookAndFeel.getRegion(c);
return new SynthContext(c, region, SynthLookAndFeel.getStyle(c, region), this.getComponentState((JTextField) c));
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
import java.awt.event.FocusListener;
import java.lang.reflect.Method;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.synth.Region;
import javax.swing.plaf.synth.SynthConstants;
import javax.swing.plaf.synth.SynthContext;
import javax.swing.plaf.synth.SynthLookAndFeel;
import javax.swing.plaf.synth.SynthStyle;
import javax.swing.plaf.synth.SynthTextFieldUI;
public class MyTextFieldUI extends SynthTextFieldUI {
private int getComponentState(final JTextField c) {
if (c.isEnabled() && c.isEditable()) {
if (c.isFocusOwner()) {
return SynthConstants.ENABLED | SynthConstants.FOCUSED;
}
return SynthConstants.ENABLED;
}
return SynthConstants.DISABLED;
}
@Override
public SynthContext getContext(final JComponent c) {
try {
Method method = SynthContext.class.getDeclaredMethod("getContext", JComponent.class, SynthStyle.class, int.class);
method.setAccessible(true);
Region region = SynthLookAndFeel.getRegion(c);
return (SynthContext) method.invoke(
SynthContext.class,
c,
SynthLookAndFeel.getStyle(c, region),
this.getComponentState((JTextField) c)
);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
- relates to
-
JDK-8154109 Some SynthUI classes can request to create a SynthContext with null fields
-
- Open
-