黑马程序员技术交流社区
标题:
关于JPanel的repaint()方法使用问题
[打印本页]
作者:
罗正荣
时间:
2013-4-20 16:14
标题:
关于JPanel的repaint()方法使用问题
本帖最后由 罗正荣 于 2013-4-21 12:33 编辑
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Demo extends JPanel {
public static void main(String[] args) {
JFrame frame=new JFrame("满天星");
Demo demo=new Demo();
frame.setLayout(null);
frame.setSize(600,600);
frame.setLocation(50, 50);
frame.setLocationRelativeTo(null);
frame.setBackground(Color.BLUE);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
demo.setSize(500, 500);
demo.setLocation(20,30);
frame.add(demo);
frame.setVisible(true);
demo.go();
}
@Override
public void paint(Graphics g) {
setBackground(Color.BLACK);
Font font=new Font("宋体",Font.BOLD,20);
g.setFont(font);
g.setColor(Color.WHITE);
for(int i=0;i<50;i++){
Random random=new Random();
int x=random.nextInt(500);
int y=random.nextInt(500);
g.drawString("*", x, y);
}
}
public void go(){
Timer timer=new Timer();
timer.schedule(new TimerTask(){
public void run() {
repaint();
}
}, 500, 500);
}
}
复制代码
帮忙看看为什么repaint();没有覆盖之前的画而是不断的添加呢?
预期效果是次在面板上画出50个*,但是这个的结果是每次加了50个。。。。。
作者:
陈圳
时间:
2013-4-20 20:48
本帖最后由 陈圳 于 2013-4-20 20:50 编辑
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
class Example39 extends JFrame{
Example39(){
super("满天星");
setBackground(Color.BLACK);
new MyThread().start();
setResizable(false);
}
@Override
public void paint(Graphics g) {
g.clearRect(0, 0, 500, 400);//清除矩阵
Font font = new Font("宋体", Font.BOLD, 20);
g.setFont(font);
g.setColor(Color.WHITE);
for (int i = 0; i < 50; i++) {
Random random = new Random();
int x = random.nextInt(500);
int y = random.nextInt(500);
g.drawString("*", x, y);
}
}
class MyThread extends Thread{
public void run(){
while(true){
try {
TimeUnit.SECONDS.sleep(1);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
SwingConsole.run(new Example39(), 400, 300);
}
}
复制代码
repaint方法只是重复执行paint方法,并不清空区域,如果想要清清,在paint方法内,使用Graphics的clearRect方法.
程序我修改了下.你想法不错.定时器,我一点印象都没有...什么时候学的呀?
作者:
罗正荣
时间:
2013-4-21 12:32
陈圳 发表于 2013-4-20 20:48
repaint方法只是重复执行paint方法,并不清空区域,如果想要清清,在paint方法内,使用Graphics的clearRect方法 ...
repaint 应该是重绘啊,应该是重新绘制而不是重复绘制,贪吃蛇里就是直接使用repaint啊,不需要清除矩阵,我写的其他的也是能够重绘的,郁闷
作者:
陈圳
时间:
2013-4-21 13:16
这里你要系统的了解repaint的执行过程,repaint/update/paint三者的关系.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2