2011-08-09 31 views
0

我想要一個字符串被繪製在一個隨機的位置,然後跳轉到一個新的位置,但留下它自己的印記。java canvas drawstring

似乎沒有要在Java中的「郵票」的命令。

我該怎麼辦?

到目前爲止,我只需要跳轉,但不離開其自身的副本之後的隨機字符。

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); 
} 
} 

回答

4

建議:

  • 不要與AWT組件混合搖擺 - 所以不是一個Canvas對象,使用一個JPanel。
  • 重寫JPanel的paintComponent方法。
  • 調用super.paintComponent方法作爲paintComponent的第一行。
  • 使用Swing Timer執行動畫,並且不會將Thread.sleep放置在paint或paintComponent方法中。實際上,除非您知道如何處理Swing中的併發性,否則應該避免在Swing GUI中的任何位置使用Thread.sleep。
  • 切勿在paint或paintComponent方法中調用repaint()。你很幸運,paint manager足夠聰明,不會讓這個調用導致遞歸引發的stackoverflow錯誤。
+0

'重繪()'總是立刻返回前的畫實際上是做 - 它只是一種方式說:「這將需要重新繪製未來一段時間「。當然,從paint()調用它並不是很明智 - 當你完成繪畫時,當前狀態不需要重繪。 –

1

當使用repaint,AWT的系統將調用畫布update()方法,這將清除圖形(由畫在背景色的矩形),然後調用paint()。 (這是對於像Canvas AWT的重量級組件 - 爲Swing這是一個有點不同。)

所以,一個簡單的解決方法將被重寫update給予不明確的成分:

public void update(Graphics g) { 
    this.paint(g); 
} 

注當系統決定你的組件必須失效時,舊的字符串仍可能消失,例如在另一個窗口覆蓋它之後。

無關的是:

你應該畫法(其他可能用於調試)從來不睡覺。繪畫將在事件派發線程中完成,並且只要paint方法未完成,則不會派發任何事件。不要這樣做。

相反,有一個單獨的線程(甚至是主線程)做一個循環,睡,並呼籲repaint

此外,由氣墊船說,不與Swing混合AWT。如果您想使用Canvas,請使用AWT Frame而不是Swing的JFrame。

1

只要保持在內存中的所有先前的立場,並打印出來過,也許在不同的 顏色。您也不會說要不要將字符永遠打印出來,要麼只是爲了在幾幀內保持可見。如果你希望它們在一段時間後消失,你可以將你的隨機位置放入一個隊列中,並在繪製新幀時刪除隊列的尾部元素(擺脫舊位置以免它們被繪製)。

(該從氣墊船和保羅的建議是非常有用的。)