views:

1568

answers:

1

Hi guys,

As stated, I want to change the default TAB behaviour within a JTextArea (so that it acts like a JTextField or similar component)

Here's the event action

    private void diagInputKeyPressed(java.awt.event.KeyEvent evt) {
    if(evt.KEY_PRESSED == java.awt.event.KeyEvent.VK_TAB) {
        actionInput.transferFocus();
    }
}

And here's the listener

        diagInput.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyPressed(java.awt.event.KeyEvent evt) {
            diagInputKeyPressed(evt);
        }
    });

I've tried evt.KEY_TYPED as well with no joy.

Any ideas?

quick edit: I've also tried requestFocus() in place of transferFocus()

+5  A: 

According to this class:

/**
 * Some components treat tabulator (TAB key) in their own way.
 * Sometimes the tabulator is supposed to simply transfer the focus
 * to the next focusable component.
 * <br/>
 * Here s how to use this class to override the "component's default"
 * behavior:
 * <pre>
 * JTextArea  area  = new JTextArea(..);
 * <b>TransferFocus.patch( area );</b>
 * </pre>
 * This should do the trick. 
 * This time the KeyStrokes are used.
 * More elegant solution than TabTransfersFocus().
 * 
 * @author kaimu
 * @since 2006-05-14
 * @version 1.0
 */
public class TransferFocus {

    /**
     * Patch the behaviour of a component. 
     * TAB transfers focus to the next focusable component,
     * SHIFT+TAB transfers focus to the previous focusable component.
     * 
     * @param c The component to be patched.
     */
    public static void patch(Component c) {
     Set<KeyStroke> 
     strokes = new HashSet<KeyStroke>(Arrays.asList(KeyStroke.getKeyStroke("pressed TAB")));
     c.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, strokes);
     strokes = new HashSet<KeyStroke>(Arrays.asList(KeyStroke.getKeyStroke("shift pressed TAB")));
     c.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, strokes);
    }
}


The previous implementation involved indeed a Listener, and the a transferFocus():

   /**
     * Override the behaviour so that TAB key transfers the focus
     * to the next focusable component.
     */
    @Override
    public void keyPressed(KeyEvent e) {
     if(e.getKeyCode() == KeyEvent.VK_TAB) {
      System.out.println(e.getModifiers());
      if(e.getModifiers() > 0) a.transferFocusBackward();
      else a.transferFocus(); 
      e.consume();
     }
    }

e.consume(); might have been what you missed to make it work in your case.

VonC
needed to change to getKeyCode() and evt.consume() - evt.consume() got rid of the tab character and using getKeyCode() allows it to successfully moved the focus using tab.Thanks a lot :)
You are welcome. I wonder if the first implementation (the one modifying the FocusTraversalKeys of a Component) is not "cleaner" in a way, though...
VonC
wow, good answer, always the same exemplary attention to detail :)
Ric Tokyo