2013-02-15 2 views
3

텍스트 필드의 수를 작성했으며 Enter 키를 눌러 필드간에 포커스를 어떻게 전환 할 수 있는지 궁금합니다.Enter 키를 눌러 JTextFields를 전환하십시오.

또한 대상 필드를 제어 할 수 있습니까? 예를 들어, 을 field A에 입력하면 포커스가 field C으로 변경됩니다.

enter image description here

+0

'JTextField'에 대한 액션 리스너 만 구현하면됩니다. 그래서 Enter 키를 누르면 액션이 완료됩니다. – Maroun

+0

'ActionListener'는 열쇠입니다,하지만 어떻게 포커스 스위치를 제어 할 수 있습니까? –

+0

jTextField.requestFocus() –

답변

5

간단한 예를 들어 전송 키를 설정하는 방법에 대해 설명합니다 How to Use the Focus Subsystem

를 살펴 보자 :

첫 번째 JTextField에 초점을 때, 다른 하나는 그 반대의 경우도 마찬가지 집중 될 것이다 Enter를 쳤을 때 지금 textField

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

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

textField1 :

는 두 JTextField의가 있다고 가정.

+1

은 invokeLater에 싸여 야합니다. – mKorbel

+0

@mKorbel 어떤 경우에는'invokeLater'를 사용해야하는지 아직도 알지 못합니다. 이 경우 사용해야합니까? – Maroun

+2

Focus, FocusSubsystem이 비동기 인 경우 invokeLater가이 이벤트를 EDT의 끝까지 지연시키고 invokeLater에게 EDT에게 알리고 EDT 대기열의 이벤트를 지연 – mKorbel

5

그것은 초점 서브 시스템

간단한 예를

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 System –

+0

을 자주 사용하면 충분히 자주 반복 할 수 없습니다. FocusTraversalPolicy의 순진한 구현은 복합 컴포넌트 나 실제 컨테이너를 자식으로 가질 때 가장 단순한 컨텍스트에서 발생합니다. 아래의 구성 요소 트리에 대처해야합니다 (다음 중첩 정책까지). – kleopatra

+0

당신은 내 목숨을 구했습니다. 정말 좋은 예입니다. – uzzi

관련 문제