2015-01-07 4 views
1

저는 Java에 비교적 익숙하지 않지만 정적 인 내용에 문제가 있습니다. 하나는 정적 물건이 뭔지 정확히 모르겠지만, 나는 그것이 어리 석다는 것을 안다. 두 번째로, 나는 운동으로 일하고있는 "Pong"의 작은 게임을 가지고 있는데, 나는 스코어 보드를 얻으려고하고있다. 하지만 그게 말하고있다 Cannot make a static reference to the non-static method getScore()정적 메서드 문제 수정

여기 내 코드입니다, 그것에 대한 제안은 내가 신참이기 때문에 도움이 될 것입니다.

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 

public class PongGame extends JComponent implements ActionListener, MouseMotionListener{ 
    private int ballX = 385; 
    private int ballY = 285; 
    private int paddleOpX = 0; 
    private int paddleX = 0; 
    private int ballYSpeed = 1; 
    private int ballXSpeed = 1; 
    public Integer score = 0; 

    private static Timer t = null; 

    public static void main(String[] args){ 
     JLabel scoreBoard = new JLabel(getScore().toString()); 
     JFrame window = new JFrame("Hit the Damn Ball"); 
     window.setLayout(new BorderLayout()); 
     window.getContentPane().setBackground(new Color(0, 0, 0)); 

     PongGame game = new PongGame(); 

     window.add(game); 

     window.pack(); 
     window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     window.setLocationRelativeTo(null); 
     window.setVisible(true); 

     t = new Timer(5, game); 
     t.start(); 

     window.addMouseMotionListener(game); 

    } 

    //set the size of window 
    public Dimension getPreferredSize(){ 
     return new Dimension(800, 600); 
    } 

    @Override 
    protected void paintComponent(Graphics g){ 
     g.setColor(new Color(110, 65, 13)); 
     g.fillRect(paddleX, 510, 150, 15); 

     g.setColor(new Color(90, 0,0)); 
     g.fillRect(paddleOpX, 90, 150, 15); 

     g.setColor(Color.WHITE); 
     g.fillOval(ballX, ballY, 30, 30); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     paddleOpX = (ballX+5); 
     ballX +=ballXSpeed; 
     ballY +=ballYSpeed; 

     if(ballX >= paddleX-30 && ballX <= (paddleX + 150) && ballY >= 480){ 
      ballYSpeed = -ballYSpeed; 
      //ballYSpeed = -1; 
      setScore(); 
     } 
     if(ballX >= paddleX-30 && ballX <= (paddleX + 150) && ballY > 480){ 
      ballYSpeed = -ballYSpeed; 
      //ballYSpeed = 1; 
      setScore(); 
     } 
     if(ballX >= paddleOpX-30 && ballX <=(paddleOpX + 150) && ballY <= 106){ 
      ballYSpeed = ballYSpeed*-1; 
     } 

     if(ballY > 570){ 
      ballXSpeed = 0; 
      ballYSpeed = 0; 
      t.stop(); 
      System.out.println(score); 
     } 
     if(ballX >= 770){ 
      ballXSpeed = -ballXSpeed; 
      //ballXSpeed = -1; 
     } 
     if(ballY <= 0){ 
      ballXSpeed = 0; 
      ballYSpeed = 0; 
      t.stop(); 
      System.out.println(score); 
      //ballYSpeed = 1; 

     } 
     if(ballX <= 0){ 
      ballXSpeed = ballXSpeed*-1; 
      //ballXSpeed = 1; 
     } 
     repaint(); 

    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     paddleX = e.getX()-75; 

     if(ballX >= paddleX-30 && ballX <= (paddleX + 150) && ballY == 480){ 
      ballYSpeed = ballYSpeed-1; 
      ballXSpeed = ballXSpeed < 0 ? -2 : 2; 
      //ballYSpeed = 1; 
     } 
     repaint(); 
    } 

    private void setScore(){ 
     score++; 
    } 
    public Integer getScore(){ 
     return score; 
    } 
} 

답변

1

static 아니기 때문에 메소드를 호출하기에 객체를 필요로하지만 아직이없는 getScore() 인스턴스 방법. 다음)

JLabel scoreBoard = new JLabel(getScore().toString()); 

JLabel scoreBoard = new JLabel(game.getScore().toString()); 
+0

괜찮아요. 제가 해냈습니다. 작동하지만 이제 레이블이 화면에 나타나지 않습니다. –

+0

'JLrame '을'JFrame'의 내용 창에'추가'해야합니다. – rgettman

+0

굉장합니다. 그냥 텍스트 색상 문제라고 생각합니다. –

0

private void setScore() 방법은 static 방법이 아닙니다 당신은 정적 메서드에서이 방법은 정적 만들거나 개체를 사용하여이 메서드를 호출 중 하나가 을이 메소드를 호출하려고합니다.

static 메서드를 만들려면 메서드 구문에 static 수정자를 사용해야합니다.

private static void setScore(){ 
     score++; 
    } 

또는

당신은 PongGame 클래스의 인스턴스를 생성하고 해당 메소드를 호출해야합니다.

PongGame pg = new PongGame(); 
JLabel scoreBoard = new JLabel(pg.getScore().toString()); 
0

getScore을 (변경 main의 첫 번째 줄에

이동 PongGame game = new PongGame();은하지 않고, 그래서 당신이 "새로운"넣지 않았기 때문에 그 정적 필요 그것의 인스턴스, 그것은 계산할 수 없습니다.

JLabel scoreBoard = new JLabel(getScore().toString()); 

이 필요하며 "고정"이라고 선언하지 않았습니다.

정적은 메모리에 단 한번만로드되는 것을 의미합니다. (일부 상황에서는 (서버에서 실행중인 웹 메소드 (메모리가 부족한 것 같음)))).

간단한 해결책 : 인스턴스를 만들고 사용하십시오.

getScore gs= new getScore() 

또는 정적하고이 전에 슈퍼 클래스를 인스턴스화 할 필요가

getScore.TosTring(); 

로 사용합니다.

0

getScore()static으로 선언하지 않으므로 이 아니므로 호출 할 인스턴스가 필요합니다.다음

public static void main(String[] args){ 
    PongGame game = PongGame(...); 
    ... 
} 

및 방법 호출을 사용합니다 : 클래스 당 한 번만이 static 방법이 존재합니다

game.getScore(); 

참고 즉, 클래스 PongGame의 인스턴스를 생성해야 따라서 클래스를 호출하기 위해 클래스의 인스턴스가 필요하지 않습니다. 반면에, static 메서드는 호출 할 인스턴스가 필요합니다.