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。