3

バックグラウンド

私のウィンドウはjava.awt.Frameであり、フレームの内側には2つのパネル(java.awt.Panel)があります。押したボタンがウィンドウで処理されるようにしようとしています。

ナンバー1を試す

KeyListenerを使用して、FrameにKeyListenerを実装させてみました。KeyListenerをフレームに追加しましたが、キーを押してもKeyListener関数は何もしませんでした。(System.out.println()で印刷してみました。)

番号2を試してください

私はこのチュートリアルに従ってみました:http://tips4java.wordpress.com/2008/10/10/key-bindings/。スペースバーを押すことを処理する私の試みは次のとおりです。

public void registerActions(){                                  //01
  Action myAction = new AbstractAction(){                       //02
    @Override                                                   //03
    public void actionPerformed(ActionEvent e) {                //04
      System.out.println("GREAT SUCCESS!");                     //05
    }                                                           //06
  };                                                            //07
  KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0); //08
  component.getInputMap().put(key, "myAction");                 //09
  component.getActionMap().put("myAction", myAction);           //10
}                                                               //11

主な問題は、アプリケーションにJComponentがないため、09行目と10行目の「component」が何であるかわからないことです。

私の質問

スイングコンポーネントを使用せずにこれを行う方法はありますか?または、キーの押下を処理する別の方法はありますか?

4

2 に答える 2

4

さて、これは a を使用した例JPanelです。

を作成しFrame、そのレイアウトをそれにBorderLayout追加するように設定KeyPaneすると、出来上がり...

public class KeyPane extends JPanel {

    private Timer paintTimer;
    private MouseFocusHandler mouseFocusHandler;

    private boolean spaceOn = false;
    private int yPos = 0;
    private int direction = 2;

    private Rectangle blob = new Rectangle(0, 0, 10, 10);

    public KeyPane() {

        setFocusable(true);

        InputMap im = getInputMap(WHEN_FOCUSED);
        ActionMap am = getActionMap();

        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "Space");
        am.put("Space", new SpaceAction());

        setPreferredSize(new Dimension(100, 100));

        getPaintTimer().setCoalesce(false);
        getPaintTimer().start();

    }

    @Override
    public void addNotify() {
        super.addNotify();
        requestFocusInWindow();
        addMouseListener(getMouseFocusHandler());
        getPaintTimer().start();
    }

    @Override
    public void removeNotify() {
        removeMouseListener(getMouseFocusHandler());
        getPaintTimer().stop();
        super.removeNotify();
    }

    protected Timer getPaintTimer() {
        if (paintTimer == null) {
            paintTimer = new Timer(40, new RepaintAction());
            paintTimer.setRepeats(true);
            paintTimer.setCoalesce(true);
        }
        return paintTimer;
    }

    protected MouseFocusHandler getMouseFocusHandler() {
        if (mouseFocusHandler == null) {
            mouseFocusHandler = new MouseFocusHandler();
        }
        return mouseFocusHandler;
    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();

        int width = getWidth() - 1;
        int height = getHeight() - 1;

        g2d.setColor(Color.GREEN);

        blob.x = (width - blob.width) / 2;

        System.out.println(blob);
        g2d.fill(blob);

        if (spaceOn) {
            g2d.setFont(UIManager.getFont("Label.font").deriveFont(24f));
            FontMetrics fm = g2d.getFontMetrics();

            String spaceIsOn = "Space On";

            int x = (width - fm.stringWidth(spaceIsOn)) / 2;
            int y = ((height - fm.getHeight()) / 2) + fm.getAscent();

            g2d.drawString(spaceIsOn, x, y);
        }

        g2d.dispose();

    }

    protected class MouseFocusHandler extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {
            requestFocusInWindow();
        }

    }

    protected class RepaintAction implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            yPos += direction;
            blob.y = yPos;

            if (blob.y + blob.height > getHeight() - 1) {
                blob.y = getHeight() - 1 - blob.height;
                direction = -2;
            } else if (blob.y < 0) {
                blob.y = 0;
                direction = 2;
            }
            repaint();
        }

    }

    protected class SpaceAction extends AbstractAction {

        @Override
        public void actionPerformed(ActionEvent e) {
            spaceOn = !spaceOn;
            repaint();
        }

    }

}
于 2012-09-16T23:53:55.427 に答える
4

AWTEventListener を使用してこれを実行できることがわかりました。

public class MyFrame extends Frame implements AWTEventListener {

  ...

  public MyFrame(String title){
    super(title);
    ...
    this.getToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
  }

  @Override
  public void eventDispatched(AWTEvent event) {
    if(event instanceof KeyEvent){
      KeyEvent key = (KeyEvent)event;
      if(key.getID()==KeyEvent.KEY_PRESSED){ //Handle key presses
        System.out.println(key.getKeyChar());
        //TODO: do something with the key press
        key.consume();
      }
    }
  }
}
于 2012-09-15T06:01:17.220 に答える