重绘不在线程中工作

时间:2014-01-05 09:22:52

标签: java multithreading swing paintcomponent repaint

我是Java新手,我正在尝试制作一个简单的蛇游戏,但是只有一次调用paint方法,即使线程一直在运行,也不会再调用一次。我在这个网站上尝试了另一个使用另一个类的修复,但是没有用。

public class Snake extends JPanel implements Runnable {

 boolean gamerunning = true;
    int snake_x = 50, snake_y = 50, snake_dir = 2;  //for snake_dir 1=up 2=right 3=down 4=left
    int[] snake_xt, snake_yt;

    public static void main(String args[]) {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600,600);
        frame.setVisible(true);
        frame.add(new Snake());

        (new Thread(new Snake())).start();
        System.out.println("Running");
    }

    @Override
    public void run() {
        try {
            while (gamerunning) {
                Thread.sleep(500);
                System.out.println(snake_x);
                tick();
                repaint();
            }
        } catch (InterruptedException e) {}
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println("painting");
        g.setColor(Color.black);
        g.fillRect(snake_x, snake_y, 10,10);
    }

    public void tick() { 
        System.out.println("tick");
        switch(snake_dir) {
            case 1:
                snake_y -= 10;
                break;
            case 2:
                snake_x += 10;
                break;
            case 3:
                snake_y += 10;
                break;
            case 4:
                snake_x -= 10;
                break;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

你的问题是:你没有添加你画的蛇!

frame.add(new Snake());

(new Thread(new Snake())).start();

每一行创建一个新的Snake,第一个被绘制,第二个被移动。

尝试

Snake s = new Snake();
frame.add(s);

(new Thread(s)).start();

代替。