2011-08-09 6 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の最初の行として呼び出します。
  • スイングタイマーを使用してアニメーションを行い、paint.sleepをpaintまたはpaintComponentメソッドに入れないでください。実際には、Swingの同時実行性を処理する方法が分からない限り、Swing GUIのどこにでもThread.sleepを使用しないでください。
  • paintまたはpaintComponentメソッドでrepaint()を呼び出さないでください。ペイントマネージャーがスマートなので、呼び出しが再帰によって引き起こされるスタックオーバーフローエラーを引き起こさないようにすることができて幸運です。あなたがrepaintを使用する場合
+0

'再描画()の絵が実際に行われる前に'常に、すぐに戻ります - それは、これが再描画する必要があります」言うためだけの方法であります将来のある時代 "と述べた。もちろん、 'paint()'から呼び出すことは本当に賢明ではありません。あなたがペイントを終えると、現在の状態は再描画を必要とすべきではありません。 –

1

、AWTシステムは(背景色で矩形をペイントすることにより)、グラフィックスをクリアしてからpaint()を呼び出しますupdate()方法を、キャンバスを呼び出します。 (これはCanvasのようなAWTの重い部品のためである - スイングのためにそれは少し異なっている)

ので、簡単な回避策は、コンポーネントをクリアしないようにupdateをオーバーライドすることによって与えられます:

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

注意システムがコンポーネントを無効化する必要があると判断した場合、古い塗りつぶしの文字列はまだ消えることがあります。別の窓がそれを覆った後。これとは無関係の

あなたは(おそらくデバッグのために他)塗装方法で寝ることはありません。ペイントはイベントディスパッチスレッドで行われ、paintメソッドが終了していない限り、イベントはディスパッチされません。これをしないでください。

代わりに、別のスレッド(またはメインスレッド)でもループして、睡眠してrepaintを呼び出します。

また、ホバークラフトによると、AWTとSwingを混ぜて使用しないでください。 Canvasを使用する場合は、SwingのJFrameの代わりにAWT Frameを使用してください。

1

以前の位置をすべてメモリに保存しておき、別の の色で印刷してください。また、文字を永遠に印刷したい場合や、数フレームの間だけ表示されるようにする場合は、そのことを言わないでください。しばらくして消滅させたい場合は、ランダムな位置をキューに入れ、新しいフレームをペイントするときにキューのテール要素を削除して(古い位置を取り除いて塗りつぶさないようにする)ことができます。

(ホバークラフトとパウロの勧告はあまりにも非常に便利です。)