2012-04-30 13 views
0

画像(BufferedImage)にテキストを書きたいと思いますが、テキストが更新されると、新しいテキストが古い画像に書き込まれます。すべての数字が同じ場所に書かれている、誰かが助けることができます。 私はこのコードusinsだ:Java、画像のテキスト、更新

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class Prove extends JPanel { 
    int size = 800; 
    private BufferedImage sc ; 
    JLabel label ; 
    private int counter =0 ; 

    public Prove() 
    {  
     JFrame frame = new JFrame(); 
     frame.getContentPane().add(this); 
     frame.setSize(2*size, size); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     try{ sc = ImageIO.read(new File("Images/ser.jpg"));  
      label =new JLabel(new ImageIcon(sc)); 
      this.add(label); 
     }catch(IOException e){} 


    } 

    public void paintComponent(Graphics g) 
    { 
     g.setColor(Color.GRAY); 
     g.fillRect(0,0, getWidth(),getHeight());  //prapavijen 

     Graphics2D g2 = (Graphics2D)g; 

     paintScore(g2); 
    } 

    public void paintScore(Graphics g2) 
    { 

     if(sc != null) 
     { 
      Graphics gi = sc.createGraphics(); 
      gi.setFont(new Font("Times New Roman", Font.BOLD, 20)); 
      String r = counter+""; 
      gi.drawString(r, 20, 20); 
      counter ++; 
      this.repaint(); 
      try{Thread.sleep(500);} 
      catch(InterruptedException e){} 
      System.out.println(counter); 
     } 

    } 

    public static void main(String[] args) 
    { 
     new Prove(); 

    } 



} 
+1

FYI:EDT(Event Dispatching Thread)でThread.sleepを使用せず、paintComponentでrepaint()を呼び出しないでください。 –

+0

1)より良いヘルプをもっと早く得るために、[SSCCE](http://sscce.org/)を投稿してください。 ( 'main()'が必要です)*無視 - 私の悪い* 2)画像は、JREの画像を使用するか、コードで生成します。 3)@GuillaumePoletに同意する4)組み込みアプリケーションリソース(WAG)に 'File'を使用しないで' URL'を使用します。 5)画像上にテキストを直接描画する理由はありません。イメージをコンポーネント 'Graphics'インスタンスに描画し、文字列を同じ' Graphics'に描画するだけです。 6)ソース内の空白に必要な空行は1つだけです.3を使用しないでください! 7)フレームは、他の方法ではなく、コンポーネントのサイズに適合する必要があります。 –

+0

@AndrewThompson実際にはメイン(問題は画像はファイルだが、以前はそれを走らせた)。 –

答えて

1

画像上で直接テキストを描画する理由はありません。イメージをコンポーネントGraphicsに描画し、文字列を同じGraphicsに描画するだけです。

1

あなたが同じ位置にテキストを描画している、

gi.drawString(r, 20, 20); 

を上書きするためにバインドされているあなたは新しいしたい場合は、垂直座標を変更する必要があります古いテキストの下に表示されるテキスト

+0

各繰り返しの後、同じ場所のテキストを更新したいと思います。 –

1

元のイメージの変更されていないコピーを保持する必要があります。この擬似コードを試してみてください:

BufferedImage img1 = loadImage(); 

そして、あなたのペイントコードで:

BufferedImage img2 = createEmptyImage(img1); // same size, mode and depth 
Graphics g = img2.getGraphics(); 
try { 
    g.draw(img1); // background 
    g.drawString(); // render text on top of it 
} finally { 
    g.dispose(); 
} 
+0

明示的に作成する 'Graphics'オブジェクトの' dispose() '(疑似コードなど)を忘れないでください。 –

+0

はい、私はこれが解決策の論理だと理解しましたが、正しい方法で実装する方法はわかりません。もっと詳しいコードを書いてください。 –

+0

@ironwud:座って試してみて、間違いや何かを助けてくれたら教えてください。あなたの側に何らかの努力なしに知識を脳に注入する方法はありません。 –