java - 重绘在线程中不起作用

标签 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;
        }
    }
}

最佳答案

你的问题是:你没有添加你正在绘制的同一条蛇!

frame.add(new Snake());

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

每一行都会创建一条新的蛇,第一个被绘制,第二个被移动。

尝试

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

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

相反。

关于java - 重绘在线程中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20931957/

相关文章:

java - 在 JDateChooser 中选择日期时,日期不正确。为什么?

java - 为什么 HtmlUnitDriver 会随机失败(FirefoxDriver/ChromeDriver 可以工作)?

java - 如何通过 XStream 读取带有属性的列表元素

java - 哪个方法调用 run()?

multithreading - gtk-rs:如何从另一个线程更新 View

Java 2 JPanel 在一个 JFrame 布局中

java - 如何在Swing中输入整数?

java - 在自定义启动器中访问 spring 应用程序名称

java - 对并发架构概念的困惑

java - 如何找到当前焦点内框?