Java JFrame方法prob

Java JFrame方法prob,java,swing,constructor,actionlistener,mainclass,Java,Swing,Constructor,Actionlistener,Mainclass,我目前正在开发一个基于文本的小游戏,我不断地得到一个错误。。。 我不知道如何修复它,因为这是我第一次使用JFrame。问题是,, 当我将ButtonDemo方法设置为ButtonDemo(),而不是public static void ButtonDemo(),则ButtonDemo()存在问题。但是,如果它是public static void ButtonDemo(),则jbtnW.addActionListener(this)上会有一个错误,说明我不能使用“this”,因为ButtonDe

我目前正在开发一个基于文本的小游戏,我不断地得到一个错误。。。 我不知道如何修复它,因为这是我第一次使用
JFrame
。问题是,, 当我将
ButtonDemo
方法设置为
ButtonDemo()
,而不是
public static void ButtonDemo()
,则
ButtonDemo()存在问题。但是,如果它是
public static void ButtonDemo()
,则
jbtnW.addActionListener(this)
上会有一个错误,说明我不能使用“this”,因为
ButtonDemo()
静态的

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();
            }
        });
    }

}

你犯了个错误

非静态变量
不能从非静态上下文中引用此

发生的情况是,
这个
引用的是
ActionListener
,它不是
静态的

一个简单的解决方法是使
ButtonDemo
方法非静态,并像这样从
main
调用该方法

        public void ButtonDemo() {
        ....

        public void run() {
           new Frame().ButtonDemo();
        }
实例化
Frame
类,并调用该方法。错误消失了

另外,您不应该给类命名为
Frame
,因为已经有一个AWT
Frame
类。你可能会遇到问题


此外,遵循Java命名约定,方法名称以小写字母开头,即
buttonDemo()
。如果不看你的类名,我会完全困惑地认为
buttonemo()
是类构造函数。

那么,你使用
buttonemo()
方法到底有什么问题?你只是说“有问题”。。。怎么了?你能粘贴堆栈跟踪吗?也许你想要一个构造函数而不是一个方法,然后在
main
中执行
newbuttondemo()
。。构造函数
public ButtonDemo(){}