2012-04-30 3 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"); 
     } 
    } 
} 

I 프레임에 모든 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 권장 사항을 강력하게 권장합니다. 그것이 이것을위한 방법입니다. 1+. –

+0

Key Bindings 아이디어를 주셔서 감사합니다. 확실히 살펴 보겠습니다. 그러나 키 수신기가 작동하지 않는 이유에 대해 궁금합니다. 패널에 이미지를 추가하려고 시도했지만 작동하지 않습니다 (그냥 this.addKeyListener (new Move())를 pnlPlay.adKeyListener (new Move())로 변경). – user1366342

+0

@ user1366342 구성 요소에 포커스가 있고 포커스가 있는지 확인하십시오. – tenorsax