当我运行下面的代码时,我得到两个相同的错误:无法从静态上下文引用非静态方法。两个违规行是:
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();
}
}
答案 0 :(得分:2)
存在很多问题,你得到的错误就是隐藏其余部分。
但要让你开始:
抽象类图形应该扩展JComponent。您应该覆盖paintComponent而不是绘制方法。图形和角斗士都应该在自己的文件中,而不是在Test中。 位置数组可以分别称为int x和int y,以便将来更容易。 有关重绘的详细信息,请参阅here。