Hi, Thanks.
So is there any one can give me a suggestion about what shall I do if we want these feature ? Thanks again. 2011/7/6 Jean-Remi Desjardins <[email protected]> > I think that sounds like a great idea! > > Regards, > Jean-Rémi Desjardins > > Sent from my iPhone (so don't expect me to be too verbose) > > On 2011-07-06, at 5:42 AM, Sean Chou <[email protected]> wrote: > > Hi, > > Is there anybody interested in this feature? Or any other comments? > > 2011/4/21 Sean Chou < <[email protected]>[email protected] > > > >> Hi, >> >> I have a simple patch to demo the new behavior. With the patch, the >> focus will go through the radiobuttons with mnemonic key Y when alt+y is >> pressed instead of select the last. >> >> >> The patch is as follows: >> >> diff -r 554adcfb615e src/share/classes/javax/swing/KeyboardManager.java >> --- a/src/share/classes/javax/swing/KeyboardManager.java Wed Mar 16 >> 15:01:07 2011 -0700 >> +++ b/src/share/classes/javax/swing/KeyboardManager.java Thu Mar 17 >> 14:57:14 2011 +0800 >> @@ -251,6 +251,93 @@ >> } >> } else if ( tmp instanceof Vector) { //more than one comp >> registered for this >> Vector v = (Vector)tmp; >> + >> + /* The below code is added to make sure the focus is not >> always >> + transferred to the last component in the vector when >> + more than one component have the same mnemonic >> + */ >> + if ((e.getModifiers() & Event.ALT_MASK) == >> Event.ALT_MASK) { >> + /* Mnemonic key should transfer the focus only, do >> not select. >> + * The following code works in this way: >> + * 1. If only one component in the vector is visible, >> fireBinding on it. >> + * 2. If multi-components in the vector are visible, >> move the focus to next component. >> + * 2.1 If the next component is not a >> JAbstractButton, fireBinding on it. >> + * 2.2 If the next component is a JMenu, which is >> a JAbstractButton, fireBinding >> + * on it to open the menu. >> + * 2.3 If the next component is another >> JAbstractButton like JRadioButton. Request >> + * focus on it instead of fireBinding. To >> AVOID SELECTION & CLICK of the button. >> + * 3. If the code is triggered by release event, >> fireBinding on current focus component >> + * instead of move focus. >> + * 4. Further consideration: there may be more swing >> control like JMenu, or customized >> + * controls, which may break this behavior. >> + */ >> + // This has alt as it's modifier so this could be a >> mnemonic >> + Component focusOwner = >> KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); >> + { >> + // If only one visible component, invoke it. >> + int visibleComponentCounter = 0; >> + int nextFocus = 0; >> + for (int i = 0; i < v.size(); i++){ >> + JComponent c = (JComponent) v.elementAt(i); >> + if (c.isShowing() && c.isEnabled()){ >> + visibleComponentCounter++ ; >> + nextFocus = i; >> + } >> + } >> + if (visibleComponentCounter == 1){ >> + JComponent tmpc = (JComponent) >> v.elementAt(nextFocus); >> + fireBinding(tmpc, ks, e, pressed); >> + if (e.isConsumed()) >> + return true; >> + } >> + // If multi-components are visible, do not select the >> button, just move the focus. >> + for (int counter = v.size() - 1; counter >= 0; >> counter--) { >> + JComponent c = (JComponent) v.elementAt(counter); >> + if (c.isShowing() && c.isEnabled()) { >> + if ((c == focusOwner) >> + || (c instanceof JLabel && ((JLabel) >> c).getLabelFor() == focusOwner)) { >> + if (e.getID() == KeyEvent.KEY_RELEASED){ >> + nextFocus = counter; >> + break; >> + } >> + nextFocus = (counter - 1 + >> v.size()) % v.size(); >> + break; >> + } >> + } >> + } >> + for (; nextFocus >= 0; nextFocus--) { >> + JComponent c = (JComponent) >> v.elementAt(nextFocus); >> + if (c.isShowing() && c.isEnabled()) { >> + break; >> + } >> + } >> + if (nextFocus >= 0) { >> + JComponent tmpc = (JComponent) >> v.elementAt(nextFocus); >> + // Next is the hack for this accessibility: >> + // For general Buttons, do not press them, but >> request focus only. >> + // For special buttons like JMenu, needs press. >> + // If it is not a button, let the component >> handles by itself. >> + if (!(tmpc instanceof >> javax.swing.AbstractButton)){ >> + fireBinding(tmpc, ks, e, pressed); >> + if (e.isConsumed()) >> + return true; >> + } >> + if (tmpc instanceof JMenu ) { >> + fireBinding(tmpc, ks, e, pressed); >> + tmpc.requestFocusInWindow(); >> + if (e.isConsumed()) >> + return true; >> + } else { >> + boolean result = tmpc.requestFocusInWindow(); >> + e.consume(); >> + return result; >> + } >> + } >> + // If it is not handled here, default behavior is >> selecting the last. >> + } >> + } >> + >> + >> // There is no well defined order for >> WHEN_IN_FOCUSED_WINDOW >> // bindings, but we give precedence to those bindings just >> // added. This is done so that JMenus >> WHEN_IN_FOCUSED_WINDOW >> >> >> >> >> 2011/4/1 Sean Chou < <[email protected]>[email protected] >> > >> >>> Hi all, >>> >>> In daily use, we may encounter a problem of mnemonic key: there may be >>> several >>> controls want the same key to be set as mnemonic key. It is not common >>> but it does exist. >>> >>> Current openjdk implementation allows users to set a same mnemonic key >>> for >>> different controls; but during the execution, when the mnemonic key is >>> pressed, >>> the last control always gets the action. Users are not able to touch >>> other controls with >>> that mnemonic key. This may confuse them. >>> >>> If all the controls with the same mnemonic key can be accessed >>> through, for >>> example, when the mnemonic key is pressed, the focus is moved to the last >>> control, >>> and when the mnemonic key is pressed again, the focus is moved to the >>> second control >>> with that mnemonic, it will give user the choice to select other >>> controls. >>> >>> Here is an example for the case: >>> >>> package test; >>> >>> import java.awt.BorderLayout; >>> import java.awt.Container; >>> import javax.swing.ButtonGroup; >>> import javax.swing.JFrame; >>> import javax.swing.JRadioButton; >>> >>> public class TestFocus extends JFrame { >>> public TestFocus() { >>> Container pane = getContentPane(); >>> pane.setLayout(new BorderLayout()); >>> JRadioButton btn1,btn2,btn3; >>> btn1 = new JRadioButton("Yes"); >>> btn1.setMnemonic('Y'); >>> btn2 = new JRadioButton("Yup"); >>> btn2.setMnemonic('Y'); >>> btn3 = new JRadioButton("No"); >>> btn3.setMnemonic('N'); >>> btn3.setSelected(true); >>> ButtonGroup group = new ButtonGroup(); >>> group.add(btn1); >>> group.add(btn2); >>> group.add(btn3); >>> pane.add(btn1,BorderLayout.NORTH); >>> pane.add(btn2,BorderLayout.CENTER); >>> pane.add(btn3,BorderLayout.SOUTH); >>> setSize(200,200); >>> setVisible(true); >>> setDefaultCloseOperation(EXIT_ON_CLOSE); >>> } >>> public static void main(String[] args) { >>> new TestFocus(); >>> } >>> } >>> >>> >>> >>> >>> -- >>> Best Regards, >>> Sean Chou >>> >>> >> >> >> -- >> Best Regards, >> Sean Chou >> >> > > > -- > Best Regards, > Sean Chou > > -- Best Regards, Sean Chou
