2014-01-19 7 views
0

현재 작은 텍스트 기반 게임을 개발 중이며 오류가 계속 발생합니다 ... JFrame을 처음 사용 한 이후로 문제를 해결하는 방법을 모르겠습니다. 문제는 방법을 ButtonDemo()으로 만들 때 public static void ButtonDemo()이 아니라 ButtonDemo()에 문제가있는 것입니다. 그러나 public static void ButtonDemo() 인 경우 jbtnW.addActionListener(this)에 오류가 있으며 ButtonDemo()static이기 때문에 "this"를 사용할 수 없다고 말합니다.JFrame 메서드 prob

package game; 
import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import game.Storylines.*; 

public class Frame implements ActionListener{ 
    VillageDrengr shops = new VillageDrengr(); 

    static JLabel jlab; 

    static JFrame jfrm = new JFrame("A Game"); 

    public static void ButtonDemo() { 
     jfrm.setLayout(new FlowLayout()); 
     jfrm.setSize(500, 350); 
     jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton jbtnW = new JButton("Equipment Shop"); 
     JButton jbtnP = new JButton("Potion Shop"); 

     jbtnW.addActionListener(this); 
     jbtnP.addActionListener(this); 

     jfrm.add(jbtnW); 
     jfrm.add(jbtnP); 

     jlab = new JLabel("Choose a Store."); 
     jfrm.add(jlab); 

     jfrm.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getActionCommand().equals("Equipment Shop")) 
      jlab.setText("You went in to the Equipment Shop."); 
     else 
      jlab.setText("You went in to the Potion Shop."); 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       ButtonDemo(); 
      } 
     }); 
    } 

} 
+0

그래서 ** 정확히 ** ** ButtonDemo() 메소드에서 가지고있는 문제는 무엇입니까? 당신은 "문제가있다"고 말할뿐입니다 ... 오류가 무엇입니까? 스택 추적을 붙여 넣을 수 있습니까? –

+0

어쩌면 당신은 메소드 대신에 생성자를 원했고,'main'에서'new ButtonDemo()'를 할 수 있습니다. .. 생성자'public ButtonDemo() {}' –

답변

1

당신은 비 정적 변수 this

이 아닌 정적 context`에서 참조 할 수없는 오류를 받고 있습니다. 무슨 일

thisstatic되지 않습니다 ActionListener를 참조하고 있다는 점이다.

간단한 수정은 ButtonDemo 방법은 비 정적 만들기 위해, 그리고 당신은 Frame 클래스를 인스턴스화이

 public void ButtonDemo() { 
     .... 

     public void run() { 
      new Frame().ButtonDemo(); 
     } 

처럼 main에서 메소드를 호출하고, 메소드를 호출합니다. 오류가 사라집니다.

또한 클래스 이름을 Frame으로 지정하지 않아야합니다. AWT Frame 클래스가 이미 있습니다. 문제가 발생할 수 있습니다.

또한 Java 명명 규칙을 따르고 메소드 이름은 소문자로 시작합니다 (예 : buttonDemo()). 클래스 이름을 보지 않고는 ButtonDemo()이 클래스 생성자라고 생각하여 완전히 혼란 스러웠습니다.