java repaint在内部工作,而循环在循环结束时工作

时间:2014-05-15 15:47:34

标签: java swing awt

执行后,循环完成其圆圈,然后调用重绘方法,

是否有另一种绘制图像的方法?

public class GameCanvas extends JPanel implements KeyListener {

    private Tank tank1;
    private Tank tank2;
    private Rocket rocket;
    public Graphics2D g2;
    private Image img;
    public boolean fire;

    public GameCanvas() {
        tank1 = new Tank(0, 0);
        tank2 = new Tank(500, 500);
        rocket = new Rocket(50, tank1);
        init();
        fire = false;
    }

    public void init() {
        JFrame frame = new JFrame("Topak Tank");
        frame.setLayout(new FlowLayout());
        frame.setSize(1300, 740);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        this.setPreferredSize(new Dimension(1300, 740));
        frame.add(this);

        frame.addKeyListener(tank1);
        frame.addKeyListener(this);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        tank1.draw(g);
        // rocket.draw(g);

        g2 = (Graphics2D) g;

        if (fire == true) {
            try {
                img = ImageIO.read(getClass().getResource("rocket.png"));
                System.out.println(rocket.getYPos());
                g2.drawImage(img, rocket.getXPos(), rocket.getYPos(), null);
            } catch (Exception e) {
            }

        }
        repaint();
    }

    public void keyPressed(KeyEvent e) {

        switch (e.getKeyCode()) {
        case KeyEvent.VK_F: {
            try {
                int xPos = tank1.getXAxis();
                int yPos = tank1.getYAxis();
                fire = true;
                int delay = 10000;
                // img = ImageIO.read(getClass().getResource("rocket.png"));
                int count = 0;
                while (true) {
                    System.out.println(xPos);
                    System.out.println(yPos);
                    if (count == 5) {
                        break;
                    }
                    count++;
                    // g2.drawImage(img,xPos,yPos,null);

                    rocket.setYPos(yPos);

                    System.out.println("loop");

                    Timer t = new Timer(delay, null);
                    t.start();
                    yPos++;

                    this.repaint();// here i want to excute and draw image after every lop cycle
                    Thread.sleep(100);
                }
                System.out.println("Fired");
                fire = false;
            } catch (Exception io) {
                JOptionPane.showMessageDialog(null, "Could not found Rocket image");
            }

        }
            break;
        }

    }

    public void keyReleased(KeyEvent ke) {
    }

    public void keyTyped(KeyEvent ke) {
    }

    public static void main(String[] arg) {
        GameCanvas gc = new GameCanvas();
    }

}

1 个答案:

答案 0 :(得分:1)

调用repaint()只是告诉组件在EDT再次可用时重新绘制自己。由于整个循环都在EDT上,因此组件无法重新绘制,直到完成为止。

您可能应该使用Timer或Thread而不是使用该循环来连接EDT。你不应该在EDT上调用sleep()。

此处有更多信息:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/