2012-04-30 11 views
1

私はグラフィックスプログラミングが初めてで、KeyListenerを使用して左右に移動してイメージを作成する際にいくつかの問題があります。現在、私のコードは、キーが押されていることを登録していません。誰かがこれを登録するだけで私を助けることができたら、私は自分自身で残りをすることができます。ここでKeyListenerに問題がある

は、フレームコードです:

import java.awt.CardLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class FrameMain extends JFrame { 

    final JPanel pnlShow; 
    PanelHome pnlHome = new PanelHome(); 
    PanelPlayerInfo pnlPlayerInfo = new PanelPlayerInfo(); 
    PanelPlay pnlPlay = new PanelPlay(pnlPlayerInfo); 
    PanelInstruction pnlInstructions = new PanelInstruction(); 
    PanelStore pnlStore = new PanelStore(); 
    PanelHighscores pnlHighscores = new PanelHighscores(); 
    ControlActionListenter CAL = new ControlActionListenter(); 

    public FrameMain() { 
     pnlShow = new JPanel(new CardLayout()); 
     pnlShow.add(pnlHome, "Home"); 
     pnlShow.add(pnlPlay, "Play"); 
     pnlShow.add(pnlInstructions, "Instructions"); 
     pnlShow.add(pnlStore, "Store"); 
     pnlShow.add(pnlHighscores, "Highscores"); 
     pnlShow.add(pnlPlayerInfo, "PlayerInfo"); 

     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.setTitle("TANKS"); 
     this.setVisible(true); 
     this.setSize(806, 628); 
     this.setResizable(false); 
     this.add(pnlShow); 
     this.addKeyListener(new Move()); 

     pnlHome.btnExit.addActionListener(CAL); 
     pnlHome.btnExit.setActionCommand("Exit"); 
     pnlHome.btnPlay.addActionListener(CAL); 
     pnlHome.btnPlay.setActionCommand("PlayerInfo"); 
     pnlHome.btnInst.addActionListener(CAL); 
     pnlHome.btnInst.setActionCommand("Instructions"); 
     pnlHome.btnHigh.addActionListener(CAL); 
     pnlHome.btnHigh.setActionCommand("Highscores"); 
     pnlInstructions.btnBack.addActionListener(CAL); 
     pnlInstructions.btnBack.setActionCommand("Main"); 
     pnlPlay.pnlToolbar.btnHome.addActionListener(CAL); 
     pnlPlay.pnlToolbar.btnHome.setActionCommand("Main"); 
     pnlHighscores.btnBack.addActionListener(CAL); 
     pnlHighscores.btnBack.setActionCommand("Main"); 
     pnlPlayerInfo.btnPlay.addActionListener(CAL); 
     pnlPlayerInfo.btnPlay.setActionCommand("Play"); 
     pnlPlayerInfo.btnBack.addActionListener(CAL); 
     pnlPlayerInfo.btnBack.setActionCommand("Main"); 

    } 

    class ControlActionListenter implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      CardLayout cl = (CardLayout) (pnlShow.getLayout()); 
      String cmd = e.getActionCommand(); 

      if (cmd.equals("Main")) { 
       cl.show(pnlShow, "Home"); 
      } else if (cmd.equals("Exit")) { 
       System.exit(0); 
      } else if (cmd.equals("Play")) { 
       pnlPlay.arpPlayer[0].populateName(pnlPlayerInfo.txtPlayer1.getText()); 
       pnlPlay.arpPlayer[1].populateName(pnlPlayerInfo.txtPlayer2.getText()); 
       pnlPlay.pnlPlayer.lblPlayer1.setText(pnlPlay.arpPlayer[0].sPlayer); 
       pnlPlay.pnlPlayer.lblPlayer2.setText(pnlPlay.arpPlayer[1].sPlayer); 
       cl.show(pnlShow, "Play"); 
      } else if (cmd.equals("PlayerInfo")) { 
       cl.show(pnlShow, "PlayerInfo"); 
      } else if (cmd.equals("Instructions")) { 
       cl.show(pnlShow, "Instructions"); 
      } else if (cmd.equals("Highscores")) { 
       cl.show(pnlShow, "Highscores"); 
      } 
     } 
    } 

    class Move implements KeyListener { 

     public void keyPressed(KeyEvent e) { 
      System.out.println("rp"); 
     } 

     public void keyTyped(KeyEvent e) { 
      System.out.println("rp"); 
     } 

     public void keyReleased(KeyEvent e) { 
      System.out.println("rp"); 
     } 
    } 
} 

私は、フレームにのKeyListenerを追加し、これのKeyListenerを実装するクラスを作ってきました。私が言ったように、私がやりたいことは、キーボードのキーを押すとプログラムの出力を何かすることだけです。あなたに何かを示す必要がある場合は、私に知らせて、私はそれを投稿します。

+3

[SSCCE](http://sscce.org/)で質問を編集すると、KeyListener – mKorbel

+0

'this.setSize(806、628);で問題が示されました。その代わりに、カスタムコンテンツ領域に適したサイズを設定し、他のコンポーネントが必要なパネルにレイアウトを使用して追加し、パネルをコンテンツペインとして追加/設定し、フレームで 'pack() 'を呼び出します。コンポーネントとフレーム装飾を表示するのに必要な最小サイズになります。 –

答えて

3

ではなく、必要なコンポーネントにKeyListenerを追加してみてください。彼らが集中していることを確認してください。

また、キーリスナーの代わりにHow to Use Key Bindingsが便利です。

+2

私はKey Bindings勧告の2番目を強くしています。それがこのために行く方法です。 1+。 –

+0

キーバインディングのアイデアをありがとう、私は間違いなくそれを調べます。キーリスナーがうまくいかない理由について私は不思議です。私はパネルに画像がありますが、それは動作しません(ちょうどthis.addKeyListener(new Move())をpnlPlay.adKeyListener(new Move())に変更した)に追加しようとしました。 – user1366342

+0

@ user1366342コンポーネントがフォーカス可能でフォーカスがあることを確認します。 – tenorsax