1

在阅读了一些内容后,我又开始尝试让这些图纸动起来。我遇到的困难是计时器从未启动 - 当我尝试运行 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"
    }

}

我还包括了一些报价行,这些行表明我假设其他行动的去向。对于这些或其他概念的任何重大问题,我将不胜感激。谢谢大家!

编辑:

按照 Hovercraft Full of Eels 的建议,我将方法的声明从 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 的找不到符号错误。

第二次编辑:

我想我的问题得到了回答。如果我仍然有问题或将其标记为已回答,我将进行另一次编辑。谢谢,气垫船!

4

1 回答 1

3

你在哪里打电话initGame()?由于定时器是在这个方法中启动的,如果你从不调用它,定时器就永远不会启动。

关于:

当我尝试运行 initGame 方法时,它告诉我无法从静态上下文中引用它

你需要向我们展示这种尝试。通常这意味着您试图在类而不是实例上调用方法。

IE,

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 的找不到符号错误。

请重新阅读此编辑上方的最后一段。

于 2013-06-04T02:03:49.377 回答