首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java canvas drawstring

java canvas drawstring
EN

Stack Overflow用户
提问于 2011-08-10 07:39:23
回答 3查看 1.9K关注 0票数 0

我想要在任意位置绘制一个字符串,然后跳到一个新位置,但留下自己的印记。

在java中似乎没有"stamp“命令。

我该怎么做呢?

到目前为止,我只有一个跳跃的随机字符,但没有留下自己的副本。

代码语言:javascript
复制
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);
}
}
EN

回答 3

Stack Overflow用户

发布于 2011-08-10 07:49:52

建议:

  • 不要将Swing与AWT组件混合使用--因此,不要使用画布对象,而应使用画布JPanel的paintComponent方法。
  • 调用super.paintComponent方法作为Swing计时器的第一行来制作动画,并且永远不要将Thread.sleep放在paint或paintComponent方法中。事实上,除非您知道如何在Swing中处理并发,否则您应该避免在Swing GUI中使用Thread.sleep anywhere。
  • 从不在paint或paintComponent方法中调用repaint()。幸运的是,绘制管理器足够聪明,不允许该调用导致递归引起的堆栈溢出错误。
票数 4
EN

Stack Overflow用户

发布于 2011-08-10 07:55:31

当您使用repaint时,AWT系统将调用画布的update()方法,该方法将清除图形(通过在背景颜色中绘制一个矩形),然后调用paint()。(这是针对AWT的重量级组件,如Canvas --对于Swing,则略有不同。)

因此,可以通过覆盖update而不清除组件来提供一个简单的解决方法:

代码语言:javascript
复制
public void update(Graphics g) {
    this.paint(g);
}

请注意,当系统决定您的组件必须失效时,旧的绘制字符串仍然可能消失,例如,在另一个窗口覆盖它之后。

与此无关:

你不应该在画图方法中打瞌睡(其他可能是为了调试)。绘制将在事件分派线程中完成,只要paint方法未完成,就不会分派任何事件。不要这样做。

相反,让一个单独的线程(甚至是主线程)执行一个休眠并调用repaint的循环。

此外,正如Hovercraft所说,不要将AWT和Swing混合在一起。如果您想使用Canvas,请使用AWT Frame而不是Swing的JFrame。

票数 1
EN

Stack Overflow用户

发布于 2011-08-10 08:32:36

只需在内存中保留所有以前的位置,并将它们打印出来,可能是不同的颜色。您也没有说明是希望字符永远打印出来,还是只想让字符在几帧内保持可见。如果你希望它们在一段时间后消失,你可以将你的随机位置放在一个队列中,并在绘制新帧时删除队列的尾部元素(去掉较旧的位置,这样它们就不会被绘制)。

(来自气垫船和保罗的建议也非常有用。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7004330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档