2014-01-28 2 views
0

그래서이 앱은 기본적으로 키를 빨리 누를 수있는 게임입니다 (플레이어 1의 경우 1, 플레이어 2의 경우 0). 이 앱에는 플레이어가 키 중 하나를 눌렀을 때 업데이트해야하는 간단한 스코어 보드가있는 간단한 GUI가 있습니다. 다음은 GUI의 스크린 샷입니다. http://screencloud.net/v/a6vT 시작 버튼을 사용하지 마십시오. 점수를 재설정하기 만하면됩니다. 나중에 구현하겠습니다. 여기스윙 앱에서 KeyBindings가 응답하지 않습니다.

코드 파일입니다

1.GameFrame.java

package MediatorGame; 
import javax.swing.JFrame; 

@SuppressWarnings("serial") 
public class GameFrame extends JFrame { 

    private GamePanel currentPanel; 

    public GameFrame() { 

     currentPanel = new GamePanel(); 
     setupFrame(); 
    } 

    private void setupFrame(){ 
     this.setContentPane(currentPanel); 
     currentPanel.setFocusable(true); 
     currentPanel.requestFocusInWindow(); 
     this.setSize(450, 300); 
    } 

} 

2.GamePanel.java

package MediatorGame; 

import javax.swing.*; 
import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 



@SuppressWarnings("serial") 
public class GamePanel extends JPanel{ 
    private JButton startButton; 
    private SpringLayout currentLayout; 
    private JLabel p1Label; 
    private JLabel p2Label; 
    private int p1Score = 0; 
    private int p2Score = 0; 
    private JLabel p1ScoreLabel; 
    private JLabel p2ScoreLabel; 
    private InputMap iMap; 
    private ActionMap aMap; 


    public GamePanel() { 
     startButton = new JButton("Start"); 
     currentLayout = new SpringLayout(); 
     p1Label = new JLabel("Player 1"); 
     p2Label = new JLabel("Player 2"); 
     p1ScoreLabel = new JLabel(String.valueOf(p1Score)); 
     p2ScoreLabel = new JLabel(String.valueOf(p2Score)); 
     iMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     aMap = getActionMap(); 

     setupPanel(); 
    } 

    private void setupPanel(){ 
     setBackground(new Color(255, 255, 204)); 
     setLayout(currentLayout);   

     currentLayout.putConstraint(SpringLayout.WEST, startButton, 206, SpringLayout.WEST, this); 
     currentLayout.putConstraint(SpringLayout.SOUTH, startButton, -40, SpringLayout.SOUTH, this); 
     add(startButton); 

     currentLayout.putConstraint(SpringLayout.NORTH, p2Label, 50, SpringLayout.NORTH, this); 
     currentLayout.putConstraint(SpringLayout.EAST, p2Label, -62, SpringLayout.EAST, this); 
     add(p2Label); 

     currentLayout.putConstraint(SpringLayout.WEST, p1Label, 75, SpringLayout.WEST, this); 
     currentLayout.putConstraint(SpringLayout.NORTH, p1Label, 0, SpringLayout.NORTH, p2Label); 
     add(p1Label); 

     currentLayout.putConstraint(SpringLayout.WEST, p1ScoreLabel, 0, SpringLayout.WEST, p1Label); 
     currentLayout.putConstraint(SpringLayout.NORTH, p1ScoreLabel, 0, SpringLayout.NORTH, p2ScoreLabel); 
     add(p1ScoreLabel); 

     currentLayout.putConstraint(SpringLayout.NORTH, p2ScoreLabel, 6, SpringLayout.SOUTH, p2Label); 
     currentLayout.putConstraint(SpringLayout.WEST, p2ScoreLabel, 0, SpringLayout.WEST, p2Label); 
     add(p2ScoreLabel); 

     iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "incP1Score"); 
     iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_0, 0), "incP2Score"); 
     aMap.put("incP1Score", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       p1Score += 1; 
      } 
     }); 
     aMap.put("incP2Score", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       p2Score += 1; 
      } 
     }); 

    } 
} 

3.GUIRunner.java

package MediatorGame; 

import javax.swing.UIManager; 

public class GUIRunner { 

    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(
      UIManager.getSystemLookAndFeelClassName()); 
     } catch(Exception e){ } 

     java.awt.EventQueue.invokeLater(new Runnable(){ 
       public void run() { 
        GameFrame myApp = new GameFrame(); 
        myApp.setVisible(true); 
       } 
     }); 
    } 

} 

나는 많은 질문을 확인했다. 그들 중 대부분은 JPanel에 초점을 맞추고 초점을 묻는 질문에 코드 (예 : '1'또는 '1'대신 '1')가 잘못되었거나 getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 대신 기본값이 getInputMap() 인 것으로 나타났습니다. 나는 그것들 모두를 처리 한 것 같지만 아직 키를 누를 때 레이블은 업데이트되지 않습니다.

내 질문 : 무엇이 잘못 되었습니까? 전체 패널 대신에 레이블을 집중시켜야합니까? 잘못된 키 코드? 나는 많은 가정 된 해결책을 시도하고 다만 휴식을 얻을 수 없다!

답변

4

최대한 멀리 볼 수있는, 레이블이 업데이트되지 않는 이유는 당신이 그들을 업데이트되지 않습니다 단지 때문이다

@Override 
public void actionPerformed(ActionEvent e) { 
    p1Score += 1; 
    p1ScoreLabel.setText(String.valueOf(p1Score)); 
} 

그리고 : 실제로

@Override 
public void actionPerformed(ActionEvent e) { 
    p2Score += 1; 
    p1ScoreLabel.setText(String.valueOf(p2Score)); 
} 
+0

를 - 그들은 아니에요 변경 될 코드가 없으면 마술처럼 바뀔 것입니다. 1 + –

+0

오! 당신 말이 맞아요, 지금 완벽하게 작동합니다. 어떻게 든 나는'p1ScoreLabel = new JLabel (String.valueOf (p1Score))'가 생성자에서 그것을 처리 할 것이라고 생각했다. 고마워요 –

+0

@SergiuBesliu Nope! 그것은 그렇게 작동하지 않습니다. :) 그것은 그 순간에 가치가 주어집니다. – Radiodef