Java Paint组件无法正常工作

时间:2012-05-20 16:49:25

标签: java swing graphics paint

这是代码,方形呈现但不会移动,即使它应该呈现每个循环。问题似乎出现在Core类中,在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){}
        }
        }
    }
抱歉,如果代码以任何方式令人讨厌,我不确定应该如何格式化它......

2 个答案:

答案 0 :(得分:3)

你是while (running)循环:

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

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

答案 1 :(得分:1)

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

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

您可能想要添加并显示一次,可能在您的main方法中(或更好的地方),只需在该循环中调用repaint()即可。

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