我想要在任意位置绘制一个字符串,然后跳到一个新位置,但留下自己的印记。
在java中似乎没有"stamp“命令。
我该怎么做呢?
到目前为止,我只有一个跳跃的随机字符,但没有留下自己的副本。
import java.awt.Canvas;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class test extends Canvas {
private static Random random = new Random();
public void paint(Graphics g) {
g.drawString("X", random.nextInt(10) * 10, random.nextInt(10) * 10);
try {
Thread.sleep(250);
} catch (Exception e ) {}
repaint();
}
public static void main(String[] argS) {
test canvas = new test();
JFrame frame = new JFrame();
frame.add(canvas);
frame.setSize(300, 300);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}发布于 2011-08-10 07:49:52
建议:
发布于 2011-08-10 07:55:31
当您使用repaint时,AWT系统将调用画布的update()方法,该方法将清除图形(通过在背景颜色中绘制一个矩形),然后调用paint()。(这是针对AWT的重量级组件,如Canvas --对于Swing,则略有不同。)
因此,可以通过覆盖update而不清除组件来提供一个简单的解决方法:
public void update(Graphics g) {
this.paint(g);
}请注意,当系统决定您的组件必须失效时,旧的绘制字符串仍然可能消失,例如,在另一个窗口覆盖它之后。
与此无关:
你不应该在画图方法中打瞌睡(其他可能是为了调试)。绘制将在事件分派线程中完成,只要paint方法未完成,就不会分派任何事件。不要这样做。
相反,让一个单独的线程(甚至是主线程)执行一个休眠并调用repaint的循环。
此外,正如Hovercraft所说,不要将AWT和Swing混合在一起。如果您想使用Canvas,请使用AWT Frame而不是Swing的JFrame。
发布于 2011-08-10 08:32:36
只需在内存中保留所有以前的位置,并将它们打印出来,可能是不同的颜色。您也没有说明是希望字符永远打印出来,还是只想让字符在几帧内保持可见。如果你希望它们在一段时间后消失,你可以将你的随机位置放在一个队列中,并在绘制新帧时删除队列的尾部元素(去掉较旧的位置,这样它们就不会被绘制)。
(来自气垫船和保罗的建议也非常有用。)
https://stackoverflow.com/questions/7004330
复制相似问题