2017-03-23 1 views
0

GUI를 가지고 있는데 마지막 요소 인 (텍스트 영역 인) 특정 탭을 통해 Tab 키를 누르면 이벤트를 만들 수 있습니다. .Java-Keylistener on Tab 작동하지 않는다

입력 버튼을 사용하여 코드를 작성했지만 탭 버튼이 아니기 때문에 완벽하게 작동합니다. 이유를 찾을 수 없습니다.

내 GUI 창 : 나는 그것이를 만들고 싶어

textArea_beschreibung.addKeyListener(new KeyAdapter() { 
    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_TAB){ 
      String dauervar = input_dauer.getText(); //auslesen von benutzername 
      String beschreibungvar = textArea_beschreibung.getText(); //auslesen von benutzername 
      String projektvar = (String)comboBox_projekt.getSelectedItem(); 
      String aktivitvar = (String)comboBox_aktivitaet.getSelectedItem(); 

      String datumvar = input_datum.getText(); 
      SimpleDateFormat df1 = new SimpleDateFormat("dd/MM/yyyy"); 
      Date date = null; 
      try { 
       date = df1.parse(datumvar); 
      } catch (ParseException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      long epoch = date.getTime(); 
      String numberAsStringUnixTImestamp = String.valueOf(epoch/1000); 

      String [ ] datenarray = {"a","b","c","d","e","f"}; 

      datenarray[0] = numberAsStringUnixTImestamp; 
      datenarray[1] = dauervar; 
      datenarray[2] = beschreibungvar;  
      datenarray[3] = projektvar; 
      datenarray[4] = aktivitvar; 
      datenarray[5] = usernamevar;  

      String JsonArray = "{ \"" + "datum" + "\":\"" + datenarray[0] + "\", \"" + "dauer" + "\":\"" + datenarray[1] + "\", \"" + "beschreibung" + "\":\"" + datenarray[2] + "\", \"" + "projektname" + "\":\"" + datenarray[3] + "\", \"" + "kategorie" + "\":\"" + datenarray[4] + "\", \"" + "username" + "\":\"" + datenarray[5] + "\" }"; 

      input_datum.setText(reportDate); 
      if(check_datum.isSelected()){ 
       CustomDateFinal[0] = datumvar; 
       input_datum.setText(CustomDateFinal[0]); 

      }        
      input_dauer.setText(USERDefTimeJSON); 
      textArea_beschreibung.setText(""); 
      comboBox_projekt.requestFocus(); 


      try { 
       SimplePingPong.httpRequestVoid(JsonArray,"unused","werte"); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 

    } 
}); 
+0

Tab 키를 누르면 여전히 이벤트가 발생하고'e.getKeyCode() == KeyEvent.VK_TAB'가 true를 반환하지 못합니다. 그렇다면 getKeyCode의 값은? – laune

+0

탭을 누르면 다음 요소로 바로 이동합니다. 나는 어느 쪽 인지도 모르지만 나는 VK_ENTER 키로 같은 방식으로했는데 완벽하게 작동한다. 텍스트 영역도 아니요, 통과 정책에있는 onger가 여전히 다음 요소로 이동합니다. –

+2

OK, java.awt.KeyboardFocusManager의 setDefaultFocusTraversalKeys를 확인하십시오. TAB이 순회 순회 기능 키로 작동하지 않도록하려면이 집합을 다시 정의해야합니다. (사용자로서 구현하려는 동작에 다소 짜증이납니다.) – laune

답변

1

(텍스트 영역이다) 내가 마지막으로 지정된 요소 : 여기

https://i.stack.imgur.com/do8Y5.jpg

내 코드입니다 내가 탭을 누르면 이벤트.

Tab 키는 텍스트 영역에서 처리됩니다. 기본 동작은 텍스트 영역에 탭 문자를 삽입하는 것입니다. 탭 키를 누를 때 나는 실제로 모든 처리를하고 질문 중

/* 
    This is my understanding of how tabbing works. The focus manager 
    recognizes the following default KeyStrokes for tabbing: 

    forwards: TAB or Ctrl-TAB 
    backwards: Shift-TAB or Ctrl-Shift-TAB 

    In the case of JTextArea, TAB and Shift-TAB have been removed from 
    the defaults which means the KeyStroke is passed to the text area. 
    The TAB KeyStroke inserts a tab into the Document. Shift-TAB seems 
    to be ignored. 

    This example shows different approaches for tabbing out of a JTextArea 
*/ 
import java.awt.*; 
import java.util.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TextAreaTab extends JFrame 
{ 
    public TextAreaTab() 
    { 
     Container contentPane = getContentPane(); 
     contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); 

     contentPane.add(nullTraversalKeys()); 
     contentPane.add(writeYourOwnAction()); 
     contentPane.add(useKeyListener()); 
     contentPane.add(addTraversalKeys()); 
    } 

    // Reset the text area to use the default tab keys. 
    // This is probably the best solution. 

    private JComponent nullTraversalKeys() 
    { 
     JTextArea textArea = new JTextArea(3, 30); 

     textArea.setText("Null Traversal Keys\n2\n3\n4\n5\n6\n7\n8\n9"); 
     JScrollPane scrollPane = new JScrollPane(textArea); 

     textArea.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null); 
     textArea.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null); 

     return scrollPane; 
    } 

    // Replace the Tab Actions. A little more complicated but this shows 
    // how to create a custom Action so you have full control. 

    private JComponent writeYourOwnAction() 
    { 
     JTextArea textArea = new JTextArea(3, 30); 
     textArea.setText("Write Your Own Tab Actions\n2\n3\n4\n5\n6\n7\n8\n9"); 
     JScrollPane scrollPane = new JScrollPane(textArea); 

     InputMap im = textArea.getInputMap(); 
     KeyStroke tab = KeyStroke.getKeyStroke("TAB"); 
     textArea.getActionMap().put(im.get(tab), new TabAction(true)); 
     KeyStroke shiftTab = KeyStroke.getKeyStroke("shift TAB"); 
     im.put(shiftTab, shiftTab); 
     textArea.getActionMap().put(im.get(shiftTab), new TabAction(false)); 

     return scrollPane; 
    } 

    // Use a KeyListener 
    // (not recommended, since Swing provides newer and better API's) 

    private JComponent useKeyListener() 
    { 
     JTextArea textArea = new JTextArea(3, 30); 
     textArea.setText("Use Key Listener\n2\n3\n4\n5\n6\n7\n8\n9"); 
     JScrollPane scrollPane = new JScrollPane(textArea); 

     textArea.addKeyListener(new KeyAdapter() 
     { 
      public void keyPressed(KeyEvent e) 
      { 
       if (e.getKeyCode() == KeyEvent.VK_TAB) 
       { 
        e.consume(); 
        KeyboardFocusManager. 
         getCurrentKeyboardFocusManager().focusNextComponent(); 
       } 

       if (e.getKeyCode() == KeyEvent.VK_TAB 
       && e.isShiftDown()) 
       { 
        e.consume(); 
        KeyboardFocusManager. 
         getCurrentKeyboardFocusManager().focusPreviousComponent(); 
       } 
      } 
     }); 

     return scrollPane; 
    } 

    // Add Tab and Shift-Tab KeyStrokes back as focus traversal keys. 
    // Seems more complicated then just using null, but at least 
    // it shows how to add a KeyStroke as a focus traversal key. 

    private JComponent addTraversalKeys() 
    { 
     JTextArea textArea = new JTextArea(3, 30); 
     textArea.setText("Add Traversal Keys\n2\n3\n4\n5\n6\n7\n8\n9"); 
     JScrollPane scrollPane = new JScrollPane(textArea); 

     Set set = new HashSet(textArea.getFocusTraversalKeys(
      KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)); 
     set.add(KeyStroke.getKeyStroke("TAB")); 
     textArea.setFocusTraversalKeys(
      KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, set); 

     set = new HashSet(textArea.getFocusTraversalKeys(
      KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS)); 
     set.add(KeyStroke.getKeyStroke("shift TAB")); 
     textArea.setFocusTraversalKeys(
      KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, set); 

     return scrollPane; 
    } 

    class TabAction extends AbstractAction 
    { 
     private boolean forward; 

     public TabAction(boolean forward) 
     { 
      this.forward = forward; 
     } 

     public void actionPerformed(ActionEvent e) 
     { 
      if (forward) 
       tabForward(); 
      else 
       tabBackward(); 
     } 

     private void tabForward() 
     { 
      KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
      manager.focusNextComponent(); 
     } 

     private void tabBackward() 
     { 
      KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
      manager.focusPreviousComponent(); 
     } 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception e) { } 
     TextAreaTab frame = new TextAreaTab(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

:

는 다음 중 하나를 사용할 수있는 기본 탭 이동 논리를 복원합니다. Tab 키의 기능은 초점을 다음 구성 요소로 이동하는 것입니다.

사용자가 양식의 모든 데이터를 처리하려는 경우 사용자가 클릭 할 수있는 일종의 "데이터 처리"버튼이 있어야합니다. 이 버튼은 텍스트 영역 바로 뒤에있을 수 있습니다.

관련 문제