2012-04-04 44 views
0

私はstackoverflowの新しいポスターですが、私はいつもインスピレーションのために投稿を読んでいます。JPanelで描画してファイルに保存しますが、保存したファイルはすべて白です

イメージをJPanelに描画していて、そのイメージをファイルに保存したいとします。 JPanelの絵はうまくいくが、イメージを見ると、すべて白か黒かのいずれかである。イメージがJPanel上に表示される方法を保存していない理由はわかりません。私はそれが可能であると思う私は正しく、バッファに画像を描画し、それを保存するパネルを参照していないですか?そのbufferedImageのようなものは空白です。私はawtとの多くの経験がないので、私は本当に愚かな間違いをしている気がします。

私はpaintComponent()メソッドを1回だけ上書きします。その中で私は描画を行います(JPanelに完全に表示されます)。そして、その下に、saveImage()メソッドが呼び出されます。イメージをファイルに出力します。しかし私が以前に触れたように、それは常に空白のイメージです。私はコンストラクタでrepaint()メソッドを使用します。

私はコード全体でこの投稿を駄目にしません。その非常に単純なコードと関連する部分は以下の通りです。

class drawingBarcode extends JPanel 

    public drawingBarcode(){ 
     repaint(); 
     try{ 
      Thread.sleep(999); 

     }catch(InterruptedException e){ 
      e.printStackTrace(); 
     } 

public void saveImage() { 
    BufferedImage bi = new BufferedImage(350, 150, BufferedImage.TYPE_INT_RGB);  

     Graphics2D g2 = bi.createGraphics();//creates and returns a graphics 2d for drawing into buffer 

    // g2.setColor(color1); 
     super.paintComponent(g2); 

     g2.dispose(); 
     try 
     { 
      ImageIO.write(bi, "jpg", new File("test.jpg\\"));   
     } 
     catch(IOException ioe) 
     { 
     System.out.println("Something went wrong"); 
      ioe.printStackTrace(); 
     } 

public void paintComponent(Graphics g){ 
     Graphics2D g2D = (Graphics2D) g; 

     super.paintComponent(g2D); 

     setStrokeWithPen1(g2D); 
     drawAsterix(g2D);//draw asterix(start digit) always 

/* some drawing takes place here using g2D. */ 

     g2D.dispose(); 
     saveImage(); 
     } 
} 

提供することができますまたはアドバイスは大歓迎以上になるすべてのヘルプ!

+2

1)すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 SSCCEの動作については、['ComponentImageCapture.java'](http://stackoverflow.com/a/5853992/418556)を参照してください。 2)なぜコード内のすべての空白行ですか?彼らはそれをもうっきりさせなかった。 3) 'Thread.sleep(999);'ああ、少年.. EDT(Event Dispatch Thread)をブロックしないでください。GUIがその時にフリーズします。 を呼び出す代わりに、 'Thread.sleep(n)'はタスクを繰り返すためのSwingタイマーや長期間実行するタスクのための 'SwingWorker'を実装します。 詳細については、[同時実行性](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)を参照してください。 –

答えて

1

save imageルーチンはsuper.paintComponentを呼び出し、画像グラフィックにペイントするときにカスタムペイントコードをすべて消してしまいます! 私はあなたのコードをリファクタリングします - UIペイントを行うたびにファイルを保存したくないのですか?

+0

これは助けて欲しい! Andrewsのアドバイスは、私が想像している次の港になるでしょう – davidfrancis

関連する問題