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

时间:2013-05-29 19:03:02

标签: java swing static java-2d repaint

当我运行下面的代码时,我得到两个相同的错误:无法从静态上下文引用非静态方法。两个违规行是:

gladiator[a] = new Gladiator();
graphic.startUpdate();

如果我将Gladiator类更改为静态,那么该错误就会消失,但这不会使得个别Gladiators不能拥有自己的独立变量吗?

startUpdate()方法不允许我将其更改为静态而不抛出错误,其中“修饰符静态仅允许在常量变量声明中”。显然我在错误的地方使用我的更新计时器。有什么想法吗?

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

    }
}

1 个答案:

答案 0 :(得分:2)

存在很多问题,你得到的错误就是隐藏其余部分。

但要让你开始:

抽象类图形应该扩展JComponent。您应该覆盖paintComponent而不是绘制方法。图形和角斗士都应该在自己的文件中,而不是在Test中。 位置数组可以分别称为int x和int y,以便将来更容易。 有关重绘的详细信息,请参阅here