I am able to reproduce the behaviour from the ComboTest:
   cb.getSelectedIndex() = 0
   getComboPopup(cb).getList().getSelectedIndex() = 4

Because our initial guess was that these indices are always equal I suggest to revert this fix to avoid any possible unpredictable regressions.

 Thanks,
 Alexandr.


On 2/8/2013 2:47 PM, Vladislav Karnaukhov wrote:
Hello Alex, all,

though I definitely agree with your approach on default JComboBox behavior, I don't believe your test really shows a problem.

The method BasicComboBoxUI.getNextIndex is private and is used only to determine a delta we should add to or subtract from current list position to determine an index of an item we're going to set selected in a combo box. Moreover, current implementation always sets list box index equal to combo box index when list' popup method is called, see BasicComboPopup.show() method. This method is public and theoretically could be overridden, but in this case users should now what they're doing, right?

When an user navigates with a keyboard, combo box item is always set equal to list item (by JComboBox design). With mouse navigation it's not true, which is shown by your test.

My property, however, somewhat emulates mouse navigation with a keyboard. With this property ON list and combo box indexes may not be equal, indeed; but this should not, to my understanding, affect user experience. An user may still operate these indexes either separately or in conjunction.

Please advice. I'm definitely open to this discussion and, of course, am trying to implement this feature as safe and reliable as possible.

Regards,
- Vlad

On 2/7/2013 10:30 PM, Alexander Potochkin wrote:
Hello Alexander

 - key == PAGE_UP / (key == PAGE_DOWN)
  Are ui.listBox.getSelectedIndex() and comboBox.getSelectedIndex()
the same when the "ComboBox.noActionOnKeyNavigation"
  property is unset? If so, only the ui.listBox.getSelectedIndex() can
be used for both cases.

 - key == HIDE
   I would suggest to set the ui.listBox.selected index back to the
comboBox.selected index to prevent some issues where these two indices
are expected to be the same.

I would rather not change this code.
We have experienced a lot of unexpected issues when we made even more
trivial changes.
The number of scenarios with custom editors, popups and so on is enormous
and sometimes the users can expect those values to be different.

Run the test given below.
Open the combobox and highlight an item in the middle of the popup.
Press backspace.
Notice that those values are not the same.

I strongly believe that old code should behave *exactly* the same when the
"ComboBox.noActionOnKeyNavigation" is off.

Would you agree?

(Yep, this means that I don't approve this fix at this moment.)

Thanks
alexp

import javax.accessibility.AccessibleContext;
import javax.swing.*;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.plaf.metal.MetalLookAndFeel;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class ComboTest extends JFrame {

     public ComboTest() {
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setLayout(new FlowLayout());

         final JComboBox<String> cb = new JComboBox<>(
                 new String[]{"one", "two", "three","one2", "two2",
"three2","one3", "two3", "three3"});
         cb.setEditable(true);

         cb.getEditor().getEditorComponent().addKeyListener(new
KeyAdapter() {
             @Override
             public void keyPressed(KeyEvent e) {
                 System.out.println("cb.getSelectedIndex() = " +
cb.getSelectedIndex());
System.out.println("getComboPopup(cb).getList().getSelectedIndex() = "
+ getComboPopup(cb).getList().getSelectedIndex());
             }
         });

         add(cb);
         setSize(200, 300);
     }

     private ComboPopup getComboPopup(JComboBox cb) {
         AccessibleContext context = cb.getAccessibleContext();
for (int i = 0; i < context.getAccessibleChildrenCount(); i++) {
             Object c = context.getAccessibleChild(i);
             if (c instanceof ComboPopup) {
                 return (ComboPopup) c;
             }
         }
         return null;
     }

     public static void main(String... args) throws Exception {
         UIManager.setLookAndFeel(new MetalLookAndFeel());
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                 new ComboTest().setVisible(true);
             }
         });
     }
}


 Thanks,
 Alexandr.

On 1/30/2013 2:36 PM, Vladislav Karnaukhov wrote:
Hello Alexandr, all,

please find a new version here:
http://cr.openjdk.java.net/~vkarnauk/4199622/webrev.05/

On 1/29/2013 07:26 PM, Alexander Scherbatiy wrote:

- WindowsLookAndFeel and ComboBox.noActionOnKeyNavigation property
is set
    Press down. Next item is selected and the action listener is
invoked. Is it expected behavior (the drop down list is not shown in
this case)?
Yes, it's expected. Customer would like to turn off event firing only
when popup is open. To keep consistency over different LAFs, I only
handle the new flag when drop-down is showing. Under Windows, if drop
list wasn't shown, JComboBox will work as usual even if the flag was
set.


- It seems that the code below can have a shorter form:
                 if
(UIManager.getBoolean("ComboBox.noActionOnKeyNavigation")) {
                     if (!comboBox.isPopupVisible()) {
                         comboBox.setSelectedIndex(si+1);
                     }
                 } else {
                     comboBox.setSelectedIndex(si+1);
                }
   ->
if ( !(UIManager.getBoolean("ComboBox.noActionOnKeyNavigation") &&
comboBox.isPopupVisible()) ) {
           comboBox.setSelectedIndex(si+1);
      }
Agree; fixed.


- doTest() method in the test throws some exception. It can throw robot
and toolkit exceptions as well.
Agree; fixed.


Thanks,
  Alexandr.





Reply via email to