0

这是代码,正方形渲染但不会移动,即使它应该渲染每个循环。问题似乎出在核心类中,在 run()

    package com.game;

import java.awt.*;
import javax.swing.*;

public class Core implements Runnable{
    private static boolean running = true;
    public static JFrame frame = new JFrame();
    public static void main(String[] args) {
        frame.setResizable(false);
        frame.setBounds(100,100,600,400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        start();
    }





package com.game;

import java.awt.Graphics;

import javax.swing.JPanel;

public class Paint extends JPanel{
    public static int x = 10;
    public void paintComponent(Graphics g){
        super.paintComponent(g);

        g.fillRect(x,10,100,100);
    }
}


        private static void start() {
            running = true;
            Thread thread = new Thread(new Core());
            thread.setPriority(Thread.MAX_PRIORITY);
            thread.start();
        }

        @Override
        public void run() {
            Paint p = new Paint();
            Container pane = frame.getContentPane();
            while(running){
                pane.add(p);
                pane.show();

                System.out.println(Paint.x);
            try {
                Thread.sleep(100);
            } catch (Exception e){}
        }
        }
    }

抱歉,如果代码以任何方式令人讨厌,我不知道应该如何格式化它......

4

2 回答 2

3

你是while (running)循环:

while(running){
   pane.add(p);
   pane.show();
   //....
}

正在踩踏 Swing 事件线程并阻止该线程执行其操作——绘制 GUI 并与用户交互。如果您想在 Swing 应用程序中重复行为,请不要使用 while (true) 循环,而是使用 Swing 计时器。

于 2012-05-20T17:15:38.007 回答
1

你没有改变x,为什么它要移动?

此外,您不断(每秒十次)将 Paint(您的JPanel子类)添加到框架并显示它。

您可能想添加并显示一次,也许在您的 main 方法(或更好的地方)中,repaint()然后在该循​​环中调用它。

并且请不要使用thread.setPriority(Thread.MAX_PRIORITY);它很少完成任何事情,并且可能不是您想要的。

于 2012-05-20T16:52:38.230 回答