我目前正在开发一款小型的基于文本的游戏,但我不断遇到错误...
自从我第一次使用JFrame以来,我不知道如何解决它。问题是,
当我将ButtonDemo方法设置为ButtonDemo()而不是public static void ButtonDemo()时,ButtonDemo()存在问题。但是,如果它是public static void ButtonDemo(),则jbtnW.addActionListener(this)上将出现错误,原因是我不能使用“ this”,因为ButtonDemo()static

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

}

最佳答案

您遇到了错误


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


发生的情况是this引用的不是ActionListenerstatic

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

        public void ButtonDemo() {
        ....

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


您实例化Frame类,然后调用该方法。错误消失了。

同样,您不应该为类Frame命名,因为已经存在AWT Frame类。您可能会遇到问题。

另外,请遵循Java命名约定,方法名称以小写字母开头,即buttonDemo()。没有查看您的类名,我完全感到困惑,以为ButtonDemo()是类的构造函数。

09-13 09:33