经过一番阅读之后,我又回到尝试使这些图纸动起来的地方。我遇到的困难是计时器永远不会启动-当我尝试运行initGame方法时,它告诉我无法从静态上下文中引用它。如果不是主循环,那么我应该从哪里开始呢?我已经能够使它从drawComponent开始,但这只是在每次绘制时创建一个新计时器,这是不好的。
主班:
public class Test2 extends JFrame {
private JPanel paintPanel;
public Test2() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setMinimumSize(new Dimension(800, 600));
paintPanel = new PaintPanel();
getContentPane().add(paintPanel, BorderLayout.CENTER);
pack();
}
class PaintPanel extends JPanel implements ActionListener {
private List<Shape> gladiators;
private Shape mouseOverShape=null;
private Timer timer;
public void initGame() {
timer = new Timer(50, this);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
// change object location here
System.out.println("Repainting");
}
public PaintPanel(){
super();
// Create my Gladiator objects and add them here?
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
for (Shape s : gladiators){
g2.draw(s);
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Test2 gamePanel = new Test2();
gamePanel.setVisible(true);
PaintPanel.initGame();
}
});
}
}
角斗士职业:
public class Gladiator implements Drawable{
int[] location = new int[] {25,25};
public void Draw(Graphics g){
// draw out the shapes which constitute each "gladiator"
}
}
我还包括了一些引号行,这些行指示我假设其他动作会去向何处。对于这些或其他概念的任何重大问题,我将不胜感激。谢谢大家!
编辑:
按照“气垫船充满鳗鱼”的建议,我将方法的声明从main方法内部移到了Test2方法内部...我还更改了大写错误。现在看起来像这样:
public Test2() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setMinimumSize(new Dimension(800, 600));
paintPanel = new PaintPanel();
getContentPane().add(paintPanel, BorderLayout.CENTER);
pack();
paintPanel.initGame();
}
主要方法是相同的,减去“ PaintPanel.initGame();”。
我收到一个引用initGame的找不到符号错误。
第二次编辑:
我想我的问题已经回答。如果仍有问题或稍作回答,我将再次进行编辑。谢谢,气垫船!
最佳答案
您在哪里称呼initGame()
?由于计时器是通过此方法启动的,因此,如果您从不调用它,则计时器永远不会启动。
关于:
当我尝试运行initGame方法时,它告诉我无法从静态上下文中引用它
您需要向我们展示此尝试。通常,这意味着您试图在类上而不是在实例上调用该方法。
即
public Test2() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setMinimumSize(new Dimension(800, 600));
paintPanel = new PaintPanel();
getContentPane().add(paintPanel, BorderLayout.CENTER);
pack();
paintPanel.initGame();
}
编辑
您声明:
PaintPanel.initGame();
你做不到您不能像对待静态方法一样在类上调用非静态方法。相反,必须如上所述在实例上调用它。所以问题的答案,
如何从静态上下文初始化重绘计时器?
是你不知道吗?您可以从非静态上下文对其进行初始化。
请注意,您不应将paintPanel变量声明为JPanel,因为您需要在其上调用
initGame()
方法,该方法不是JPanel的方法。而是将其声明为PaintPanel变量。编辑2
关于:
我收到一个引用initGame的找不到符号错误。
请重新阅读此修改上方的最后一段。