<Swing Dev> Request for review 7155887: ComboBox does not paint focus correctly on GTK L&F
Pavel Porvatov
pavel.porvatov at oracle.com
Tue Mar 27 14:46:07 UTC 2012
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...
Regards, Pavel
More information about the swing-dev
mailing list