2013-11-21 19 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 2

仍然不瞭解,如果是能夠設定鍵盤焦點特定節點上(不用鼠標)。

+0

可以'setKeyboardFocus'根,然後處理事件或調度可以根據需要,對其他處理程序或節點。 * update 2 *不清楚,哪個節點預計會收到事件? – tenorsax

+0

例如,一個圓圈。我可以將鼠標處理程序附加到代碼中的一個圓圈。如何將鍵盤處理程序附加到它? –

+0

P.S.所以,你的意思是我應該創建2個處理程序:(1)根與調度程序,(2)另一個用於接收對象? –

回答

1

要接收鍵盤事件,必須使用PInputManager.setKeyboardFocus設置處理程序。例如:

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

或節點的基礎:

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()); 
    } 
}; 

有許多變化,這取決於實際情況。有關示例,請參閱PSelectionEventHandlerKeyEventFocusExample源代碼,以瞭解開發人員如何處理鍵盤事件。

編輯:

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

對不起,看到你的第一個片段... –