2012-03-14 4 views
4

그래서 내가 누르면 Enter 키처럼 작동하는 JButton을 작성하려고합니다. 포커스를 가지는 JTextField를 바꿔 액션 청취자를 호출 할 수있을 필요가 있습니다. 로봇 프레임 워크를 사용할 수 없기 때문에 모든 프로그램이 엔터를 누른 것이 문제라고 생각하게됩니다.Swing에서 Enter 키 시뮬레이션 (로봇을 사용하지 않고)

나는 (스윙 작성) 프로그램을 누군가가 데이터를 입력 한 후 입력 타격에 의해 많은 텍스트 필드 나 다른 것들에 데이터를 입력 할 수 있습니다 : 여기

는 스토리이다. 그것은 위대한 작품.

그러나 대부분의 사람들은 자동으로 입력 키를 듣고 로봇을 끄는 두 번째 프로그램을 사용하고 있습니다. (첫 번째 로봇에 익숙한 사람들을 위해 저는 SmartDashboard 및 드라이버 스테이션). 이것에 대한 불만이 꽤 많이있었습니다. 사람들은 로봇을 사용하지 않고 데이터를 입력하려고합니다. 스마트 다이쇼 보드 (사용자가 들어 오기를 원하는 프로그램)는 맞춤 스윙 구성 요소를 함께 실행할 수 있습니다.

+0

입력과 다른 키 조합을 사용할 수 있습니까? 입력을 '저장'하는 것으로 필드 채우기를 고려하려면 Ctrl-S를 사용 하시겠습니까? – Thomas

+0

불가능하지는 않지만 확실히 바람직하지 않습니다. 나는 또한 데이터를 저장하는 탭 (즉, 포커스를 잃을 때)에 대해 생각해 봤지만 실제로 엔터 키로 유지하려고합니다. – Joe

답변

2

프레임에 getRootPane().setDefaultButton()을 시도해보십시오. 예가 here입니다. 내가 (그렇지 않으면이 삭제됩니다) 제대로 귀하의 요구 사항을 이해한다면 완전히 확인

+0

음 ... 완전히 확신 할 수는 없지만 요구 사항이 다른 방향이라고 생각합니다 .-) – kleopatra

4

하지 ...

당신은 당신이 해결하기 원하는 구성 요소에 이벤트를 전달 수동으로 할 수 있습니다. focusOwner

  • 에 파견하고 싶었의 경우
  • 가 focusOwner

뭔가에 그 이벤트를 전달 보낸 사람과 focusOwner와의 KeyEvent를 생성 KeyboardFocusManager에

  • 를 쿼리하여 focusOwner을 찾을 같은 :

    Action action = new AbstractAction("fake enter") { 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
         KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
         Component comp = manager.getFocusOwner(); 
         KeyEvent event = new KeyEvent(comp, 
           KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, 
           KeyEvent.VK_ENTER, KeyEvent.CHAR_UNDEFINED); 
         comp.dispatchKeyEvent(event); 
        } 
    }; 
    JButton button = new JButton(action); 
    button.setFocusable(false); 
    
    Action textAction = new AbstractAction("text") { 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
         LOG.info("I'm the text action" + ((Component) e.getSource()).getName()); 
        } 
    }; 
    
    JComponent comp = Box.createVerticalBox(); 
    for (int i = 0; i < 5; i++) { 
        JTextField field = new JTextField(20); 
        field.setName(": " + i); 
        field.setAction(textAction); 
        comp.add(field); 
    } 
    comp.add(button); 
    

    편집

    실제로 사용하기 위해 몇 줄을 추가했습니다 (@Joe는 작동하지 않는다고 말했습니다). 버튼을 클릭하면 집중된 textField의 액션이 시작됩니다 (여기서는 간단히 필드의 이름을 인쇄합니다). 로컬 컨텍스트는 vista 및 jdk6u27입니다.

  • +0

    리플렉션에서, 아마도 맞을 것입니다. 반대의 '행동'에 +1하십시오. – trashgod

    +0

    내가 원하는 문자 ("a"문자를 보낸 경우 "a"가 입력 된 것처럼)에 응답 할 수 있었지만 Enter 키로 작동하지는 못했습니다. – Joe

    +0

    @Joe hmm ...그건 이상한 일입니다. 내 답변에있는 스 니펫이 textField의 동작을 트리거하는 것입니다 (게시하기 전에 시도해보십시오 :-) 당신의 OS와 jdk 버전은 무엇입니까? – kleopatra

    2

    초점을 요소를 잡아와 수동으로 이벤트가 잘 작동을하지 않았다 입력 파견,하지만 난 그냥 다양한 JTextField에 영향을하고 싶었 기 때문에, 나는 비슷한 솔루션을 내놓았다 가리키는 대한

    addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent ae) { 
         Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); 
         if (focusOwner instanceof JTextField) { 
          ((JTextField) focusOwner).postActionEvent(); 
         } 
        } 
    }); 
    

    감사합니다 나 옳은 방향으로.

    +0

    hach ​​.. 내 편집 전에 이것을 보지 못했습니다 :-) 당신이 해결책을 찾았습니다. 아직도 이상한 광산이 당신의 맥락에서 작동하지 않는다고 생각합니다. – kleopatra

    관련 문제