2017-12-07 15 views
0

私は、オブジェクトの移動を許可しているゲームのために私のコンストラクタで作成した(オーバーライドした)keyPressedメソッドを呼び出そうとしています。メインクラスにActionListenerとKeyListenerを実装しました。JavaコンストラクタでActionListenerメソッドを実装しています

これも可能ですか? this.keyPressed(KeyEvent e)でメソッドを呼び出そうとしましたが、eを初期化する方法がわかりません。

これを行うにはどうすればよいでしょうか?

Timer timer = new Timer(DELAY, this); 
public Game(Main game) { 

    this.game = game; 
    gamePanel = new GamePanel(); 
    buttonPanel = new JPanel(); 
    buttonPanel.add(startButton); 

    this.addKeyListener(this); 
    this.setFocusable(true); 
    this.setFocusTraversalKeysEnabled(false); 
    this.getContentPane().add(gamePanel, BorderLayout.CENTER); 
    this.getContentPane().add(buttonPanel, BorderLayout.PAGE_END); 
    this.setSize(1000, 1000); 
    this.setVisible(true); 





    } 

} 

@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyPressed(KeyEvent e) { 

    switch (e.getKeyCode()) { 
    case KeyEvent.VK_UP: 
     game.move("u"); 
     break; 

    case KeyEvent.VK_DOWN: 
     game.move("d"); 
     break; 

    case KeyEvent.VK_RIGHT: 
     game.move("r"); 
     break; 

    case KeyEvent.VK_LEFT: 
     game.move("l"); 
     break; 
    } 
} 
@Override 
public void actionPerformed(ActionEvent e) { 

    Object src = e.getSource(); 

    if (src == timer) { 
     game.updateBoard(); 
     if (game.gameEnded()) { 
      timer.stop(); 
      } 
     repaint(); 

    } else if (src == startButton) { 

     if (timer.isRunning()) { 
      timer.stop(); 
     } else { 
      timer.stop(); 
     } 
    } 
} 

答えて

1

問題はここにある:

while(!game.gameEnded()) { 
    game.updateBoard(); 
    KeyEvent e = null; 
    this.keyPressed(e); 
} 

あなたのコンストラクタは、Swingのイベント・ディスパッチ・スレッドで呼び出された場合、それがブロックし、そしていかなる場合は、したがって、派遣することができます。

正しい方法は、ActionEventを定期的に発生させるjavax.swing.Timerを使用する必要があります。

int period = 1000;//fire ActionEvent every second 
Timer timer = new Timer(period,new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     //do your stuff, for example 
     game.updateBoard(); 
    } 
}); 
timer.start(); 

彼らはすべてのイベント・ディスパッチ・スレッドによって処理されなければならないので、自分でのEventListener内のメソッドを呼び出すべきではありません。

+0

ありがとう@Judgerは役に立ちました。私はそれを作成した後、自動的にタイマーを起動する必要がありますか?私は 'actionPerformed(ActionEvent e) 'をオーバーライドしています。クラス' Timer timer = new Timer(DELAY、this);の開始時にグローバルにタイマーを作成しました; '私の' actionPerformed ActionEvent e) 'メソッド'オブジェクトsrc = e.getSource(); ' – user5402

+0

変更を加えた質問を編集しました。この作品のようなものはありますか? – user5402

+0

'this 'を一つの引数として使って、' Timer'オブジェクトをインスタンス化することはできません。それをコンストラクタで初期化する必要があります。 – Judger

関連する問題