<Swing Dev> Fwd: Add keyboard accessibility to JColorChooser swatch
Sean Chou
zhouyx at linux.vnet.ibm.com
Thu Sep 20 07:37:31 UTC 2012
Hi Alexander,
Thank you !
On Tue, Sep 18, 2012 at 10:34 PM, Alexander Scherbatiy
<alexandr.scherbatiy at oracle.com> wrote:
> Hi Sean,
>
> The fix and test look good for me.
>
> I think that there are areas for improvements like initialization the selRow
> and selCol variables to the color coordinates defined in the constructor
> (new JColorChooser(Color.GREEN)). However it is not necessary for this fix.
>
> Thanks,
> Alexandr.
>
>
> On 9/17/2012 10:28 AM, Sean Chou wrote:
>>
>> Hi Pavel,
>>
>> The new webrev is at:
>> http://cr.openjdk.java.net/~zhouyx/OJDK-61/webrev.09/ .
>> The missed sync is added.
>>
>>
>> On Sat, Sep 15, 2012 at 12:41 AM, Pavel Porvatov
>> <pavel.porvatov at oracle.com> wrote:
>>>
>>> Hi Sean,
>>>
>>> Hi Pavel,
>>>
>>> Thank you very much for testing on MacOS, I have windows and linux only
>>> for now.
>>>
>>> The new patch is at:
>>> http://cr.openjdk.java.net/~zhouyx/OJDK-61/webrev.08/ .
>>>
>>> Your version of the test is wrong. Why did you remove realSync before
>>> hitting keys? It's possible that invokeLater with
>>> recentSwatchPanel.requestFocusInWindow will be executed AFTER all keys are
>>> pressed and the test will fail... Moreover requestFocusInWindow invocation
>>> doesn't guarantee that recentSwatchPanel has focus because of javadoc:
>>> * Developers must never
>>> * assume that this Component is the focus owner until this
>>> * Component receives a FOCUS_GAINED event.
>>>
>>> Regards, Pavel.
>>>
>>>
>>> Please have a look.
>>>
>>> On Wed, Sep 12, 2012 at 4:30 PM, Pavel
>>> Porvatov<pavel.porvatov at oracle.com> wrote:
>>>>
>>>> Hi Sean,
>>>>
>>>> Unfortunately the test fails on MacOS. That's because JTabbedPane
>>>> doesn't have focus after window is visible under AquaLAF. You can modify
>>>> your test like this:
>>>>
>>>>
>>>> SwingUtilities.invokeLater(new Runnable() {
>>>> @Override
>>>> public void run() {
>>>> selectedColor = colorChooser.getColor();
>>>>
>>>> Component recentSwatchPanel =
>>>> Util.findSubComponent(colorChooser, "RecentSwatchPanel");
>>>>
>>>> if (recentSwatchPanel == null) {
>>>> throw new RuntimeException("RecentSwatchPanel not
>>>> found");
>>>> }
>>>>
>>>> recentSwatchPanel.requestFocusInWindow();
>>>> }
>>>> });
>>>>
>>>> toolkit.realSync();
>>>>
>>>> // Tab to move the focus to MainSwatch
>>>> Util.hitKeys(robot, KeyEvent.VK_SHIFT, KeyEvent.VK_TAB);
>>>>
>>>> // Select the color on right
>>>> Util.hitKeys(robot, KeyEvent.VK_RIGHT);
>>>> Util.hitKeys(robot, KeyEvent.VK_RIGHT);
>>>> Util.hitKeys(robot, KeyEvent.VK_SPACE);
>>>>
>>>> I checked, it works on Mac.
>>>>
>>>> After the changes
>>>> 1. There is no need to declare selectedColor as a volatile field
>>>> 2. Robot and Toolkit are used in one method and can be converted into
>>>> local variables
>>>> 3. The click method can be removed
>>>>
>>>> Regards, Pavel
>>>>
>>>>
>>>> Hi Pavel,
>>>>
>>>> Thanks for the tip, it is modified.
>>>>
>>>> The new webrev is at:
>>>> http://cr.openjdk.java.net/~zhouyx/OJDK-61/webrev.07/ .
>>>>
>>>> Please take a look.
>>>>
>>>>
>>>> On Tue, Sep 11, 2012 at 12:57 AM, Pavel
>>>> Porvatov<pavel.porvatov at oracle.com> wrote:
>>>>>
>>>>> Hi Sean,
>>>>>
>>>>> The fix looks good but you are still using Swing components from
>>>>> different threads. There is a useful method: regtesthelpres.Util.invokeOnEDT
>>>>>
>>>>> Hi Pavel,
>>>>>
>>>>> I made a new patch, it is at
>>>>> http://cr.openjdk.java.net/~zhouyx/OJDK-61/webrev.06/ .
>>>>> Please take a look.
>>>>>
>>>>> About orientation, I also set mainSwatch's top-right corner as (0, 0),
>>>>> so the top-right color is white in right-to-left orientation.
>>>>>
>>>>> That ok.
>>>>>
>>>>> Regards, Pavel
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Sep 7, 2012 at 10:15 PM, Pavel
>>>>> Porvatov<pavel.porvatov at oracle.com> wrote:
>>>>>>
>>>>>> HI Sean,
>>>>>>
>>>>>> Hi Pavel,
>>>>>>
>>>>>> Thanks for the comments. I have a question about right-to-left
>>>>>> orientation.
>>>>>>
>>>>>> As the effect of "this instanceof RecentSwatchPanel", with first
>>>>>> version of my patch is applied, if left key is pressed when choosing color
>>>>>> on recentSwatch, it move the focus to the color on right side; but when
>>>>>> choose color on mainSwatch, left is still left. And when the focus is on the
>>>>>> tab, left key also move the focus to the tab on left side, as well as
>>>>>> controls on other tabs. I only found this left-right reverse on
>>>>>> RecentSwatchPanel, I removed the code related. Can you give some
>>>>>> information about what is the right behavior? Is it "default on top-right,
>>>>>> grows from right-to-left, but left key still moves left" ?
>>>>>>
>>>>>> In right-to-left orientation all components are placed from right to
>>>>>> left (as you can observe on JColorChooser for example), but the keys LEFT
>>>>>> and RIGHT work as always.
>>>>>>
>>>>>> Regards, Pavel
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Wed, Sep 5, 2012 at 9:32 PM, Pavel
>>>>>> Porvatov<pavel.porvatov at oracle.com> wrote:
>>>>>>>
>>>>>>> Hi Sean,
>>>>>>>
>>>>>>> Still have some comments
>>>>>>>
>>>>>>> 1. Could you please replace requestFocus by requestFocusInWindow?
>>>>>>> (read javadoc for the details)
>>>>>>>
>>>>>>> 2. What's the reason to change
>>>>>>> - setSelectedColor(color);
>>>>>>> + getColorSelectionModel().setSelectedColor(color);
>>>>>>> ?
>>>>>>> You removed null checking...
>>>>>>>
>>>>>>> In new code (e.g. in MainSwatchKeyListener) you could use
>>>>>>> setSelectedColor(color) as well.
>>>>>>>
>>>>>>> 3. This code looks strange:
>>>>>>> public boolean isFocusTraversable() {
>>>>>>> - return false;
>>>>>>> + return true;
>>>>>>> }
>>>>>>>
>>>>>>> I believe we can remove this "hack" at all and just use
>>>>>>> setFocusable(true) in constructor...
>>>>>>>
>>>>>>> 4. You are still using incorrect code formatting, e.g. in
>>>>>>> "getColorForCell(column,row);"
>>>>>>>
>>>>>>> 5. You removed right-to-left orientation from the RecentSwatchPanel.
>>>>>>> Could you please explain that changes?
>>>>>>>
>>>>>>> 6. About right-to-left orientation: I believe the default corner of
>>>>>>> the marker should be upper-right, but not upper-left. HOME and END keys
>>>>>>> should work according to orientation as well...
>>>>>>>
>>>>>>> The test should be fixed as well:
>>>>>>>
>>>>>>> a. What does line 75 mean?
>>>>>>> 75 if (true) return ;
>>>>>>> b. Why Swing fields are volatile? Swing components are not thread
>>>>>>> safe and should be accessed only from the EDT
>>>>>>> c. What's the reason to have click(int...keys) instead of click(int
>>>>>>> key)?
>>>>>>> d. Constants should be in UPPER_CASE
>>>>>>>
>>>>>>> Regards, Pavel
>>>>>>>
>>>>>>> Hi Pavel,
>>>>>>>
>>>>>>> I uploaded http://cr.openjdk.java.net/~zhouyx/OJDK-61/webrev.05/
>>>>>>> . And reported http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7194184 .
>>>>>>>
>>>>>>> Some details about update:
>>>>>>> 1. A testcase is added in this webrev, but it checks keyboard
>>>>>>> accessibility only. I tried to check right-to-left orientation with the
>>>>>>> testcase attached, but it doesn't work well on windows.
>>>>>>>
>>>>>>> 2. " g.setXORMode(Color.WHITE); g.setColor(Color.BLACK); " is not
>>>>>>> used because the mark is not obvious for light blue-pink area and dark green
>>>>>>> area, as this image:
>>>>>>> http://cr.openjdk.java.net/~zhouyx/OJDK-61/screenshot_4.png .
>>>>>>>
>>>>>>> Please take a look.
>>>>>>>
>>>>>>> On Wed, Aug 22, 2012 at 9:16 PM, Pavel
>>>>>>> Porvatov<pavel.porvatov at oracle.com> wrote:
>>>>>>>>
>>>>>>>> Hi Sean,
>>>>>>>>
>>>>>>>> Hi Pavel,
>>>>>>>>
>>>>>>>> I updated the patch according to your comments except No.1 and
>>>>>>>> No.4, it is now at: http://cr.openjdk.java.net/~zhouyx/OJDK-61/webrev.03/
>>>>>>>> .
>>>>>>>>
>>>>>>>> About comment No.1 ( When right-to-left orientation the Recent
>>>>>>>> swatches inverts right and left button ), I tried to set the locale to
>>>>>>>> ar_AE, but didn't get a visual result about what I should do, please look at
>>>>>>>> http://cr.openjdk.java.net/~zhouyx/OJDK-61/screenshot_3.png . Can anyone
>>>>>>>> give a little help on how to produce a right-to-left orientation in demo
>>>>>>>> SwingSet2 or others?
>>>>>>>>
>>>>>>>> I attached the test. It will be useful to add some tests to your
>>>>>>>> change (e.g. show JColorChooser with right-to-left orientation, pressing
>>>>>>>> some keys by awt Robot and checking the result)
>>>>>>>>
>>>>>>>>
>>>>>>>> About comment No.4(Why new listeners are Serializable ), the
>>>>>>>> original MouseListeners in this class are Serializable and I see javadoc
>>>>>>>> for Component class says "Developers will need, as always, to consider the
>>>>>>>> implications of making an object serializable" .
>>>>>>>>
>>>>>>>> You are absolutely right about serialization. But if you take a look
>>>>>>>> at components serialization/deserialization you will see that BEFORE
>>>>>>>> serialization javax.swing.plaf.ComponentUI#uninstallUI is invoked and AFTER
>>>>>>>> deserialization javax.swing.plaf.ComponentUI#installUI is invoked. So
>>>>>>>> serialization is not broken when new listeners added and removed correctly
>>>>>>>> with instalUI/uninstallUI methods.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Please take a look again, thanks.
>>>>>>>>
>>>>>>>> Some additional comments below:
>>>>>>>> 1. You should assign null to mainSwatchKeyListener and
>>>>>>>> recentSwatchKeyListener in the uninstallChooserPanel method
>>>>>>>> 2. Do we have bug in bugs database for your fix? If no, could you
>>>>>>>> please file a bug with correspondent description. Use that bug number as a
>>>>>>>> folder name for the webrev, please
>>>>>>>> 3. The code can be a little bit optimized. There is no need to call
>>>>>>>> repaint every time in code like this:
>>>>>>>> + if (selRow> 0) {
>>>>>>>> + selRow--;
>>>>>>>> + }
>>>>>>>> + repaint();
>>>>>>>>
>>>>>>>> I'd prefer
>>>>>>>> + if (selRow> 0) {
>>>>>>>> + selRow--;
>>>>>>>> + repaint();
>>>>>>>> + }
>>>>>>>> In case KeyEvent.VK_HOME and KeyEvent.VK_END such optimization
>>>>>>>> doesn't look reasonable for me...
>>>>>>>> 4. Could you please follow our code guide lines (spaces etc).
>>>>>>>>
>>>>>>>> http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141388.html
>>>>>>>> 5. I have some concerns about selection mark in paintComponent:
>>>>>>>> a. On light swatches (e.g. on white) the mark looks like it shifted
>>>>>>>> on 1 pixel
>>>>>>>> b. The color selection looks tricky. Does the following code from
>>>>>>>> DiagramComponent#paintComponent works
>>>>>>>> g.setXORMode(Color.WHITE);
>>>>>>>> g.setColor(Color.BLACK);
>>>>>>>> ?
>>>>>>>>
>>>>>>>> Regards, Pavel
>>>>>>>>
>>>>>>>> On Thu, Aug 16, 2012 at 10:00 PM, Pavel
>>>>>>>> Porvatov<pavel.porvatov at oracle.com> wrote:
>>>>>>>>>
>>>>>>>>> Hi Sean,
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Updated the repository used in webrev from jdk8-tl to
>>>>>>>>> http://hg.openjdk.java.net/jdk8/awt/jdk .
>>>>>>>>>
>>>>>>>>> new webrev: http://cr.openjdk.java.net/~zhouyx/OJDK-61/webrev.01/
>>>>>>>>>
>>>>>>>>> I have the following comments about the fix:
>>>>>>>>>
>>>>>>>>> 1. When right-to-left orientation the Recent swatches inverts right
>>>>>>>>> and left button.
>>>>>>>>> 2. Could you please don't use package visibility when
>>>>>>>>> fileds/methods/inner classes can be private (e.g. field
>>>>>>>>> mainSwatchKeyListener)
>>>>>>>>> 3. I think you should uninstall the introduced listeners in the
>>>>>>>>> DefaultSwatchChooserPanel#uninstallChooserPanel method
>>>>>>>>> 4. Why new listeners are Serializable?
>>>>>>>>> 5. I recommend to use if condition instead of switch/case blocks
>>>>>>>>> with one branch
>>>>>>>>> 6. Could you please rename selrow (and similar variables) into
>>>>>>>>> selRow
>>>>>>>>> 7. Can we use Component#isFocusOwner instead of supporting new
>>>>>>>>> variable showcursor?
>>>>>>>>> 8. Could you please follow our code guide lines (spaces etc)
>>>>>>>>>
>>>>>>>>> Regards, Pavel
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ---------- Forwarded message ----------
>>>>>>>>> From: Sean Chou<zhouyx at linux.vnet.ibm.com>
>>>>>>>>> Date: Thu, Aug 9, 2012 at 3:29 PM
>>>>>>>>> Subject:<Swing Dev> Add keyboard accessibility to JColorChooser
>>>>>>>>> swatch
>>>>>>>>> To: swing-dev at openjdk.java.net
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Hi all,
>>>>>>>>>
>>>>>>>>> This is a patch to add keyboard accessibility to JColorChooser
>>>>>>>>> swatch, so when using TAB, the focus can move to SwatchPanel, choose color
>>>>>>>>> with arrow keys and select color with space bar.
>>>>>>>>>
>>>>>>>>> In current implementation, it is not able to move the focus to
>>>>>>>>> SwatchPanel with TAB, this can be seen in SwingSet2 demo.
>>>>>>>>> Steps:
>>>>>>>>> 1. run SwingSet2 demo
>>>>>>>>> 2. click on JColorChooser demo
>>>>>>>>> 3. click Background button and Swatches panel appears.
>>>>>>>>> 4. Press Tab key => focus moves to OK button as shown in
>>>>>>>>> this image http://cr.openjdk.java.net/~zhouyx/OJDK-61/screenshot_1.png
>>>>>>>>>
>>>>>>>>> With this patch, in step4, focus moves to SwatchPanel, as shown
>>>>>>>>> here http://cr.openjdk.java.net/~zhouyx/OJDK-61/screenshot_2.png
>>>>>>>>> Then, arrow keys can be used to choose color and select color by
>>>>>>>>> space bar.
>>>>>>>>>
>>>>>>>>> The webrev is http://cr.openjdk.java.net/~zhouyx/OJDK-61/webrev.00/
>>>>>>>>> .
>>>>>>>>>
>>>>>>>>> Please take a look.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Best Regards,
>>>>>>>>> Sean Chou
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Best Regards,
>>>>>>>>> Sean Chou
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Best Regards,
>>>>>>>> Sean Chou
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> import javax.swing.*;
>>>>>>>> import java.awt.*;
>>>>>>>>
>>>>>>>> public class JColorChooserTest {
>>>>>>>> public static void main(String[] args) {
>>>>>>>> SwingUtilities.invokeLater(new Runnable() {
>>>>>>>> @Override
>>>>>>>> public void run() {
>>>>>>>> JFrame frame = new JFrame();
>>>>>>>>
>>>>>>>> JColorChooser chooser = new JColorChooser();
>>>>>>>>
>>>>>>>> chooser.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
>>>>>>>> frame.add(chooser);
>>>>>>>>
>>>>>>>>
>>>>>>>> frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
>>>>>>>> frame.setSize(600, 400);
>>>>>>>> frame.setVisible(true);
>>>>>>>> }
>>>>>>>> });
>>>>>>>> }
>>>>>>>> }
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Best Regards,
>>>>>>> Sean Chou
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Best Regards,
>>>>>> Sean Chou
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Best Regards,
>>>>> Sean Chou
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Best Regards,
>>>> Sean Chou
>>>>
>>>>
>>>
>>>
>>> --
>>> Best Regards,
>>> Sean Chou
>>>
>>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>
>
--
Best Regards,
Sean Chou
More information about the swing-dev
mailing list