<Swing Dev> Request for review 7155887: ComboBox does not paint focus correctly on GTK L&F

Pavel Porvatov pavel.porvatov at oracle.com
Tue Apr 3 11:45:00 UTC 2012


Hi Jonathan,

I have several comments:
1. containerParent instanceof JComboBox && containerParent != null
it is not necessary to check "containerParent != null" here

2.
-            if (!interiorFocus && (state & SynthConstants.FOCUSED) != 0) {
+
                  focusSize = style.getClassSpecificIntValue(context,
                          "focus-line-width",1);
+            if (!interiorFocus && (state & SynthConstants.FOCUSED) != 0) {
I don't see here any changes

3. Could you please explain the following changes?
-            if (focusSize > 0) {
+            if (focusSize > 0 && (state & SynthConstants.FOCUSED) != 0) {
+                if (interiorFocus) {
+                    x += focusSize;
+                    y += focusSize;
+                    w -= 2 * focusSize;
+                    h -= 2 * focusSize;
+                } else {


I applied the patch and observe that focused JComboBox looks strange 
(see attachments):
a. Native focus uses solid line
b. Native focused JComboBox paints focus rectangle across whole JComboBox

Regards, Pavel
> Hi Pavel,
>
> Here's the updated patch, including proposed solution for interior focus.
> http://cr.openjdk.java.net/~luchsh/7155887_3/
>
> In the orginal code as I understood, focus is only paint when 
> !interiorFocus, in which case the background shadow and flatBox will 
> shrink a bit to corperate with the outer focus whose size is same as 
> the original component. My proposed solution is to shirink focus line 
> for interior focus, but keep the same way of !interorFocus.
>
> could you pls take a look?
>
> On 03/27/2012 10:46 PM, Pavel Porvatov wrote:
>> Hi Jonathan,
>>
>> What do you think about another solution: can we set component state 
>> as SynthConstants.FOCUSED before paintTextBackground is invoked. 
>> Another solution is to set state as "focused" for ComboBox renderer 
>> like the following:
>>
>>         if ("ComboBox.renderer".equals(c.getName())) {
>>             for (Component comboBoxParent = c.getParent(); 
>> comboBoxParent != null; comboBoxParent = comboBoxParent.getParent()) {
>>                 if (comboBoxParent instanceof JComboBox){
>>                     if(comboBoxParent.hasFocus()){
>>                         state |= SynthConstants.FOCUSED;
>>                     }
>>                     break;
>>                 }
>>             }
>>         }
>> without other changes in GTKPainter.java (actually there is some 
>> problem with "interiorFocus", but it could be resolved....)
>>
>> See also my answers below.
>>> Hi Pavel,
>>>
>>> Thanks for review, here's the new patch and my answers are inlined.
>>> http://cr.openjdk.java.net/~luchsh/7155887_2/
>>>
>>> On 03/22/2012 10:24 PM, Pavel Porvatov wrote:
>>>> Hi Jonathan,
>>>>> Hi Swing-dev,
>>>>>
>>>>> ComboBox on linux GTK L&F does not works as gtk native 
>>>>> applications, when get focused, the apperance of Java ComboBox 
>>>>> remains unchanged but native GTK ComboBox control will have a 
>>>>> outline to indicate it has got focused.
>>>>>
>>>>> The problem seems similar to bug
>>>>> 6947671 ( 
>>>>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6947671),
>>>>> except that I did not reproduced the problem on Nimbus L&F, so 
>>>>> another bug
>>>>> 7155887 (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7155887)
>>>>> was created for this issue,
>>>>>
>>>>> And here's the proposed patch to fix this problem,
>>>>> http://cr.openjdk.java.net/~luchsh/7155887/
>>>>>
>>>>> Could anybody please help to take a look?
>>>> I have several comments about the patch:
>>>>
>>>> 1. "c.getName().equals("ComboBox.renderer")": I think we can get 
>>>> NPE here
>>> Yes, I've changed it to
>>>
>>> "ComboBox.renderer".equals(c.getName())
>>>
>>>>
>>>> 2.
>>>> +            for (Component comboBoxParent = c.getParent(); 
>>>> comboBoxParent != null; comboBoxParent = comboBoxParent
>>>> +                    .getParent()) {
>>>> +                if (comboBoxParent instanceof JComboBox
>>>> + && comboBoxParent.hasFocus()) {
>>>> +                    comboBoxFocused = true;
>>>> +                }
>>>> +            }
>>>>
>>>> I'm not sure we should do such deep parent investigation. Why don't 
>>>> you check first parent only?
>>>>
>>> javax.swing.CellRendererPane is inserted between the component and 
>>> renderer, so if check only the first parent, it will retrieve a 
>>> CellRendererPane object instead of JComboBox component. In the new 
>>> patch, I added a break when JComboBox is encounterred so to make the 
>>> effect similar to the first-parent-only approach.
>> I found out the following code (see 
>> com.sun.java.swing.plaf.gtk.GTKPainter#paintLabelBackground):
>>         if (c instanceof ListCellRenderer &&
>>                  container != null &&
>>                  container.getParent() instanceof JComboBox ) {
>>             ...
>>         }
>> I think we should use the same pattern
>>>
>>>> 3. "if (ENGINE.paintCachedImage(g, x, y, w, h, id, state) && 
>>>> !comboBoxFocused)"
>>>> If you are going to ignore ENGINE.paintCachedImage when 
>>>> comboBoxFocused, then there is no need to invoke it at all
>>>>
>>> yes, in the new patch I've changed the order of these two checks.
>>>> 4. "if (comboBoxFocused || focusSize > 0)"
>>>> I'm not sure we should paint focus if focusSize == 0
>>>>
>>> I think there's no need to paint the focus if focusSize ==0, since 
>>> the focus width and height arguements passed to JNI method 
>>> native_paint_focus() will both be zero.
>> That's what I meant! (may be my phrase was not clear enough)
>> Your condition "if (comboBoxFocused || focusSize > 0)" allows to 
>> paint focus even if focusSize == 0...
>>
> Oh, sorry for my misunderstanding, the previous patch indeed got such 
> a problem, but it may not be in the new patch.
>> Regards, Pavel
>
> Thanks and best regards!
>
> - Jonathan
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: ver3.png
Type: image/png
Size: 6286 bytes
Desc: not available
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20120403/69838650/ver3.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: native.png
Type: image/png
Size: 5986 bytes
Desc: not available
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20120403/69838650/native.png>


More information about the swing-dev mailing list