Request for review: 7124530 What is background color of AWT component? (And foreground, for that matter)
Alexander Potochkin
Alexander.Potochkin at oracle.com
Wed Jan 11 08:30:23 PST 2012
Hello Sergey
okay, makes sense
approved
Thanks
alexp
> Hi Alexander
> 29.12.2011 22:32, Alexander Potochkin wrote:
>> Hello Sergey
>>> Hi Everyone,
>>> This is a fix for some glitches in the code for
>>> background/foreground/font properties.
>>> 1. SystemColor.window was changed to color which is used by default
>>> in swing l&f(Aqua). Changes in AquaImageFactory.java and
>>> CSystemColors.m. Now most of the awt components use this color as
>>> default.
>>> 2. set** methods were moved from LWWindowPeer to LWComponentPeer,
>>> because there is an issues when these methods has no effect, because
>>> repaint of the component does not happen.For example:
>>> - call Label.setbackground which set component background property
>>> - call Peer.setBackground
>>> - call Delegate.setBackgound
>>> - compare passed color with color from Label property, which was
>>> set in the first step: changes in
>>> LWWindowPeer,LWContainerPeer,LWComponentPeer.
>> could you give more details on that?
> By default delegates uses colors from DelegateContainer which take
> color from targets. So if we set color for target(Label) -> then set
> color for peer ->then set color for delegete. this code does not
> repaint our component:
> public void setBackground(Color bg) {
> Color oldBg = getBackground();
> super.setBackground(bg);
> if ((oldBg != null) ? !oldBg.equals(bg) : ((bg != null) &&
> !bg.equals(oldBg))) {
> // background already bound in AWT1.2
> repaint();
> }
> }
> Because bg and oldBg will be the same color.
>>
>> the pattern where every peer has its delegate which is responsible
>> for storing/repainting for colors and fonts
>> looks more laconic and consistent to me.
> This is true if all our components had delegates. But we has LWWindow
> which has no delegate and LWCanvas which the delegate serves only for
> storage of colors(By default LWComponentPeer has not delegates so we
> cannot simplify old code and eliminate null checks).Probably delegate
> from LWPanelPeer can be removed too.
> And i think it would be better not to have similar code in different
> classes.
> For example I believe this is better
>
> protected final Color getBackground() {
> synchronized (getStateLock()) {
> return background;
> }
> }
>
> Than 2 different methods in different classes:
>
> protected Color getBackground() {
> synchronized (getDelegateLock()) {
> D delegate = getDelegate();
> if (delegate != null) {
> return delegate.getBackground();
> }
> }
> return null;
> }
>
> protected Color getBackground() {
> synchronized (getStateLock()) {
> return background;
> }
> }
>
> same for setters
> public void setBackground(final Color c) {
> final Color oldBg = getBackground();
> if (oldBg == c || (oldBg != null&& oldBg.equals(c))) {
> return;
> }
> synchronized (getStateLock()) {
> background = c;
> }
> final D delegate = getDelegate();
> if (delegate != null) {
> synchronized (getDelegateLock()) {
> // delegate will repaint the target
> delegate.setBackground(c);
> }
> } else {
> repaintPeer();
> }
> }
>
> against:
>
> public void setBackground(Color c) {
> final boolean changed;
> synchronized (getStateLock()) {
> changed = ((background != null) ? !background.equals(c) :
> ((c != null)&& !c.equals(background)));
> background = c;
> }
> if (changed) {
> repaintPeer();
> }
> }
>
> public void setBackground(Color c) {
> synchronized (getDelegateLock()) {
> D delegate = getDelegate();
> if (delegate != null) {
> // delegate will repaint the target
> delegate.setBackground(c);
> }
> }
> }
>
>>
>>> 3. List default color was changed to SystemColor.text: changes in
>>> LWListPeer.java.
>>
>> LWListPeer set the font and colors to its view component,
>> with the proposed fix it seems to update the scrollPane instead
> But in resetColorsAndFont() we clear default colors for view and it
> use colors from its parent ScrollableJList.
>>
>>
>>> 4. LWWIndow target color initialization was moved from
>>> CPlatformIndow to LWWindowPeer, so it can be reused later by
>>> CPlatformEmbeddedFrame .
>>> 5. unnecessary peers set** methods and unnecessary delegate in
>>> LWCanvasPeer were removed: changes in LWCanvasPeer.java,
>>> LWListPeer.java, LWPanelPeer.java.
>>>
>>> Bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7124530
>>> Webrev can be found at:
>>> http://cr.openjdk.java.net/~serb/7124530/webrev.00/
>>>
>>
>> Thanks
>> alexp
>
>
More information about the macosx-port-dev
mailing list