2013-11-21 2 views
0

어느 핸들러의 아래에 키 누름에 실행 :Piccolo2D에서 키보드 이벤트를받는 방법?

public class Try_KeyboardInput_01 { 

    private static final Logger log = LoggerFactory.getLogger(Try_KeyboardInput_01.class); 

    @SuppressWarnings("serial") 
    public static void main(String[] args) { 
     new PFrame() { 
      @Override 
      public void initialize() { 

       PPath circle = PPath.createEllipse(-100, -100, 200, 200); 

       getCanvas().getLayer().addChild(circle); 

       circle.addInputEventListener(new PBasicInputEventHandler() { 
        @Override 
        public void keyPressed(PInputEvent event) { 
         log.info("Key pressed on circle"); 
        } 
       }); 

       getCanvas().getLayer().addInputEventListener(new PBasicInputEventHandler() { 
        @Override 
        public void keyPressed(PInputEvent event) { 
         log.info("Key pressed on layer"); 
        } 
       }); 

       getCanvas().addInputEventListener(new PBasicInputEventHandler() { 
        @Override 
        public void keyPressed(PInputEvent event) { 
         log.info("Key pressed on canvas"); 
        } 
       }); 



      } 
     }; 
    } 
} 

어떻게 기능을 활성화하기 위해?

내가 볼 몇 가지 데모에서

UPDATE, 즉 키보드 포커스가 마우스 핸들러 내에서 켤 수 있습니다. 그러나 컴퓨터에 마우스가 없거나 키보드 처리가 기본적으로 켜져 있어야하는 경우에는 허용되지 않습니다.

키보드 처리를 명시 적으로 설정하는 방법은 무엇입니까?

가 (마우스없이) 특정 노드에 키보드 포커스를 설정할 수있는 경우

이 아직도 이해하지 않았다 UPDATE.

+0

. * update 2 *가 명확하지 않습니다. 어떤 노드가 이벤트를 수신 할 것으로 예상됩니까? – tenorsax

+0

예 : 원입니다. 마우스 처리기를 코드의 원에 연결할 수 있습니다. 키보드 처리기를 연결하는 방법? –

+0

P. 그래서, 당신은 2 개의 핸들러를 생성해야한다는 것을 의미합니다 : (1) 디스패처를 가진 루트와 (2) 객체를 받기위한 또 다른 핸들러? –

답변

1

키보드 이벤트를 수신하려면 PInputManager.setKeyboardFocus을 사용하여 처리기를 설정해야합니다. 예를 들면 :

PBasicInputEventHandler handler = new PBasicInputEventHandler() { 
    @Override 
    public void mousePressed(final PInputEvent event) { 
     event.getInputManager().setKeyboardFocus(event.getPath()); 
     event.setHandled(true); 
    } 

    @Override 
    public void keyPressed(PInputEvent event) { 
     System.out.println(event.getPickedNode()); 
    } 
}; 

실제 시나리오에 따라 많은 변화가 있습니다 :

getCanvas().getRoot().getDefaultInputManager().setKeyboardFocus(new PBasicInputEventHandler() { 
    @Override 
    public void keyPressed(PInputEvent event) { 
     switch (event.getKeyCode()) { 
     //TODO 
     } 
    } 
}); 

또는 노드 기준으로

. 개발자가 키보드 이벤트를 처리하려는 방법에 대한 몇 가지 예를 보려면 PSelectionEventHandlerKeyEventFocusExample 소스를 참조하십시오.

편집 : 당신은`다음 루트에 setKeyboardFocus` 및 필요한 다른 핸들러 또는 노드와 같은 이벤트 나 파견을 처리 할 수 ​​

import java.awt.event.KeyEvent; 
import edu.umd.cs.piccolo.PNode; 
import edu.umd.cs.piccolo.event.PBasicInputEventHandler; 
import edu.umd.cs.piccolo.event.PInputEvent; 
import edu.umd.cs.piccolo.nodes.PPath; 
import edu.umd.cs.piccolox.PFrame; 

public class DemoKeyboard { 
    static class SampleHandler extends PBasicInputEventHandler { 
     private PNode activeNode; 

     public void setActiveNode(PNode activeNode) {this.activeNode = activeNode;} 
     public PNode getActiveNode() {return activeNode;} 

     @Override 
     public void keyPressed(PInputEvent event) { 
      if (activeNode == null) 
       return; 
      switch (event.getKeyCode()) { 
      case KeyEvent.VK_LEFT: activeNode.translate(-5, 0); break; 
      case KeyEvent.VK_UP: activeNode.translate(0, -5); break; 
      case KeyEvent.VK_RIGHT: activeNode.translate(5, 0); break; 
      case KeyEvent.VK_DOWN: activeNode.translate(0, 5); break; 
      } 
     } 
    }; 

    public static void main(String[] args) { 
     new PFrame() { 
      @Override 
      public void initialize() { 
       final PPath circle = PPath.createEllipse(0, 0, 200, 200); 
       getCanvas().getLayer().addChild(circle); 

       SampleHandler handler = new SampleHandler(); 
       handler.setActiveNode(circle); 
       getCanvas().getRoot().getDefaultInputManager().setKeyboardFocus(handler); 
      } 
     }; 
    } 
} 
+0

마우스가 없다고 가정합니다. 이 경우 키보드 처리를 켜는 방법은 무엇입니까? –

+0

아, 죄송합니다. 첫 번째 스 니펫을 보았습니다 ... –

관련 문제