Java 无法从静态上下文访问GUI更新计时器非静态变量

Java 无法从静态上下文访问GUI更新计时器非静态变量,java,swing,static,java-2d,repaint,Java,Swing,Static,Java 2d,Repaint,当我运行下面的代码时,我得到两个相同的错误:无法从静态上下文引用非静态方法。这两条令人不快的线是: gladiator[a] = new Gladiator(); graphic.startUpdate(); 如果我将Gladiator类更改为static,错误就会消失,但这不会使单个Gladiator无法拥有自己的独立变量吗 startUpdate()方法不允许我将其更改为static,而不会抛出一个错误,即“修饰符static只允许在常量变量声明中使用”。很明显,我在错误的地方使用了我的更

当我运行下面的代码时,我得到两个相同的错误:无法从静态上下文引用非静态方法。这两条令人不快的线是:

gladiator[a] = new Gladiator();
graphic.startUpdate();
如果我将Gladiator类更改为static,错误就会消失,但这不会使单个Gladiator无法拥有自己的独立变量吗

startUpdate()方法不允许我将其更改为static,而不会抛出一个错误,即“修饰符static只允许在常量变量声明中使用”。很明显,我在错误的地方使用了我的更新计时器。有什么想法吗

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.util.ArrayList;

public class Test extends JPanel{

    abstract class graphic {
        public Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        public int[] location = new int[] {screenSize.width/2,screenSize.height/2};

        void startUpdate() {
            new Timer(200, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {


                repaint();

            }
        }).start();


        }


    }

    public class Gladiator extends graphic {

        void draw(final Graphics g) {

        g.setColor(Color.green);
        g.fillArc(location[0], location[1], 100, 100, 45, 90);
        g.setColor(Color.black);
        g.fillArc((location[0]+50-10),(location[1]+50-10), 20, 20, 0, 360);

        }
    }

    @Override
    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);


    }

    public void setLocation(int x, int y){
        //this.location[0] = x;
        //this.location[1] = y;
    }


    public static void main(String[] args){
        Gladiator[] gladiator = new Gladiator[2];
        ArrayList<Gladiator> gladiatorList = new ArrayList<Gladiator>();
        JFrame jf=new JFrame();
        jf.setDefaultCloseOperation
        (JFrame.EXIT_ON_CLOSE);
        jf.setPreferredSize(Toolkit.getDefaultToolkit().getScreenSize());
        jf.add(new Test());

        jf.pack();
        jf.setVisible(true);

        for (int a =0; a < 2; a++) {
        gladiator[a] = new Gladiator();
        gladiatorList.add(gladiator[a]);        
        System.out.println("add "+a);
        }
        graphic.startUpdate();

    }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.Graphics2D;
导入java.awt.Graphics;
导入java.util.ArrayList;
公共类测试扩展了JPanel{
抽象类图形{
公共维度screenSize=Toolkit.getDefaultToolkit().getScreenSize();
public int[]location=new int[]{screenSize.width/2,screenSize.height/2};
作废日期(){
新计时器(200,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
重新油漆();
}
}).start();
}
}
公共级角斗士扩展图形{
虚线绘制(最终图形g){
g、 setColor(Color.green);
g、 填充弧(位置[0],位置[1],100,100,45,90);
g、 设置颜色(颜色为黑色);
g、 填充弧((位置[0]+50-10),(位置[1]+50-10),20,20,0,360);
}
}
@凌驾
受保护组件(最终图形g){
超级组件(g);
}
公共无效设置位置(整数x,整数y){
//这个。位置[0]=x;
//这个位置[1]=y;
}
公共静态void main(字符串[]args){
角斗士[]角斗士=新角斗士[2];
ArrayList gladiatorList=新ArrayList();
JFrame jf=新JFrame();
jf.setDefaultCloseOperation
(JFrame.EXIT_ON_CLOSE);
setPreferredSize(Toolkit.getDefaultToolkit().getScreenSize());
添加(新测试());
jf.pack();
jf.setVisible(真);
对于(int a=0;a<2;a++){
角斗士[a]=新角斗士();
角斗士。添加(角斗士[a]);
系统输出打印项次(“添加”+a);
}
graphic.startUpdate();
}
}

有很多问题,你得到的错误只是隐藏了其余的问题

但是为了让你开始:

抽象类图形可能应该扩展。您应该替代draw方法,而不是draw方法。图形和角斗士都应该在自己的文件中,而不是内部测试。 位置数组可以分别称为int x和int y,以便于将来使用。
有关重新绘制的更多信息,请参见。

您的任务应该是:学习Java的基础知识。一旦你涵盖了这些,你就可以回到你的游戏项目了。这肯定给了我一些东西可以继续下去。我感谢你的帮助——我正在自学java。