2013-02-15 5 views
3

Я создал несколько текстовых полей, и мне интересно, как переключить фокус между полями, нажав клавишу ввода.Переключение JTextFields нажатием клавиши Enter

Кроме того, могу ли я контролировать поле цели? например, могу ли я определить, что нажатием Enter в field A фокус будет изменен на field C?

enter image description here

+0

Вам просто нужно реализовать прослушиватель действий для 'JTextField', поэтому после нажатия введите действие. – Maroun

+0

Я знаю, что 'ActionListener' является ключом, но как я могу управлять переключателями фокуса? –

+0

jTextField.requestFocus() –

ответ

5

Простой пример:

Предположим, у вас есть два JTextField S: textField и textField1

textField.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     textField1.requestFocusInWindow();  
    } 
}); 

textField1.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     textField.requestFocusInWindow(); 
    } 
}); 

Теперь, когда вы нажмете Enter при фокусировке на первом JTextField, другой будет сфокусировано, и наоборот.

+1

должен быть завернут в invokeLater – mKorbel

+0

@mKorbel Я до сих пор не знаю, в каких случаях я должен использовать 'invokeLater'. Должен ли я использовать его в этом случае? – Maroun

+2

Focus, FocusSubsystem является асинхронным, а затем invokeLater задерживает это событие до конца EDT, invokeLater уведомляет EDT и задерживает события в очереди EDT. – mKorbel

5

Посмотрите на How to Use the Focus Subsystem

Это объясняет, как установить ключи передачи данных для системы фокусировки к югу

Простой пример

public class TestFocusTransfersal { 

    public static void main(String[] args) { 
     new TestFocusTransfersal(); 
    } 

    public TestFocusTransfersal() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JTextField field1 = new JTextField("1", 10); 
     private JTextField field2 = new JTextField("2", 10); 
     private JTextField field3 = new JTextField("3", 10); 
     private JTextField field4 = new JTextField("4", 10); 
     private JTextField field5 = new JTextField("5", 10); 
     private JTextField field6 = new JTextField("6", 10); 
     private JTextField field7 = new JTextField("7", 10); 
     private JTextField field8 = new JTextField("8", 10); 
     private JTextField field9 = new JTextField("9", 10); 
     private final MyOwnFocusTraversalPolicy policy; 

     public TestPane() { 
      // Set up enter for focus transfer... 
      Set forwardKeys = getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); 
      Set newForwardKeys = new HashSet(forwardKeys); 
      newForwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)); 
      setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, 
          newForwardKeys); 

      setLayout(new GridBagLayout()); 

      add("Field #1: ", field1, 0, 0); 
      add("Field #2: ", field2, 2, 0); 
      add("Field #3: ", field3, 4, 0); 
      add("Field #4: ", field4, 6, 0); 
      add("Field #5: ", field5, 8, 0); 
      add("Field #6: ", field6, 2, 1); 
      add("Field #7: ", field7, 4, 1); 
      add("Field #8: ", field8, 6, 1); 
      add("Field #9: ", field9, 8, 1); 

      policy = new MyOwnFocusTraversalPolicy(
          field1, 
          field6, 
          field7, 
          field8, 
          field9, 
          field2, 
          field3, 
          field4, 
          field5 
          ); 

//   You can do this to make life easier, but it may have unexpected 
//   consequences... 
//   setFocusCycleRoot(true); 
//   setFocusTraversalPolicy(policy); 

     } 

     @Override 
     public void addNotify() { 
      super.addNotify(); 
//  Comment this out if you use focusCycleRoot 
      SwingUtilities.getWindowAncestor(this).setFocusTraversalPolicy(policy); 
     } 

     protected void add(String label, JTextField field, int x, int y) { 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridy = y; 
      gbc.gridx = x; 
      gbc.insets = new Insets(2, 2, 2, 2); 
      gbc.anchor = GridBagConstraints.EAST; 
      add(new JLabel(label), gbc); 
      gbc.gridx++; 
      add(field, gbc); 
     } 
    } 

    public static class MyOwnFocusTraversalPolicy 
        extends FocusTraversalPolicy { 

     private List<Component> order; 

     public MyOwnFocusTraversalPolicy(Component... order) { 
      this.order = new ArrayList<>(Arrays.asList(order)); 
     } 

     @Override 
     public Component getComponentAfter(Container focusCycleRoot, 
         Component aComponent) { 
      int idx = (order.indexOf(aComponent) + 1) % order.size(); 
      return order.get(idx); 
     } 

     @Override 
     public Component getComponentBefore(Container focusCycleRoot, 
         Component aComponent) { 
      int idx = order.indexOf(aComponent) - 1; 
      if (idx < 0) { 
       idx = order.size() - 1; 
      } 
      return order.get(idx); 
     } 

     @Override 
     public Component getDefaultComponent(Container focusCycleRoot) { 
      return order.get(0); 
     } 

     @Override 
     public Component getLastComponent(Container focusCycleRoot) { 
      return order.size() > 0 ? order.get(order.size()) : null; 
     } 

     @Override 
     public Component getFirstComponent(Container focusCycleRoot) { 
      return order.get(0); 
     } 
    } 
} 
+0

+1 хороший пример особого использования системы Swing Focus –

+0

не может повторять это достаточно часто: такая наивная реализация FocusTraversalPolicy будет _break_ во всех, кроме самых тривиальных контекстах (fi при наличии составных компонентов или реальных контейнеров в качестве детей), потому что это должен справиться с деревом компонента ниже (до следующей вложенной политики). – kleopatra

+0

Ты спас мне жизнь. Действительно хороший пример. – uzzi

Смежные вопросы