コンポーネントのサイズが適切であることを確認する以外に、代わりにメソッドを使用JComponent#print
してください。JComponent#printAll
これらはダブルバッファリングを無効にし、画面に印刷することを期待しているときに他のネイティブピアの問題を克服します
更新しました
サンプルアプリから...

このダンプを作成することができました

このコードを使用する
Container pane = frame.getContentPane();
BufferedImage img = new BufferedImage(pane.getWidth(), pane.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
pane.printAll(g2d);
g2d.dispose();
try {
ImageIO.write(img, "png", new File("save.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
更新しました
私はあなたが描くことがあなたの問題の原因ではないと思います。しかし、それはできるほどきれいではありません。
そもそも、「描画」サーフェスはから拡張されてjava.awt.Canvas
おり、に追加しているのでJFrame
、重いコンポーネントと軽いコンポーネントを混合することは決して良い考えではありません。
public class Dibujo extends Canvas ...
あなたは次のようなものを使用する方が良いですJPanel
public class Dibujo extends JPanel ...
これは絶対にしないでください
public void paint(Graphics g) {
//super.paint(g);
super.paint
あなたは、単にコンポーネントを埋めるよりも、後ろでもっと起こっていることを呼び出さなければなりません。のようなものを使い始めたら、代わりJPanel
にオーバーライドする必要があります。paintComponent
ペイントメソッドの最後の線分のみを描画します...
if (this.m_alzada) {
draw.setColor(Color.
draw.drawLine(uX, uY, x, y);
}
つまり、コンポーネントを保存しようとすると、最後のセグメントのみが表示されます。このpaint
メソッドは、呼び出されるたびにすべての線分をペイントする必要があります。
あなたのmouseDragged
方法では、あなたはこれをやっています...
this.paint(this.getGraphics());
しないでください。グラフィックを更新する責任はありません。リペイントマネージャーが責任を負います。これは基本的に、スクラッチパッドのグラフィックスコンテキストにペイントすることだけです。次の再ペイント要求が処理されるとすぐに、すべてが完全に消去されます。
基本的な概念のいくつかを理解するには、カスタムペイントの実行を一読する必要があると思います。また、Javaでペインティングがどのように機能するかを理解するために、AWTとSwingでのペインティングを読み通しました。
あなたのコードを変更した後、私はこれを得ることができました...

このように保存するには...

package prueba_uno_graphics;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.*;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
/**
*
* @author Uriel
*/
// Don't mix heavy and light weight components
public class Dibujo extends JPanel implements ActionListener, MouseListener, MouseMotionListener {
// ArrayList lineas = new ArrayList();
// boolean m_alzada = true, is_beginning = true, to_save = false;
// int uX, uY, x, y;
private Path2D shape;
Dibujo() {
setBackground(Color.WHITE);
shape = new Path2D.Float();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D draw = (Graphics2D) g;
// if (this.is_beginning || this.to_save) {
// draw.setColor(Color.white);
// draw.fillRect(0, 0, this.getWidth(), this.getHeight());
// this.is_beginning = false;
// }
// if (this.m_alzada) {
// draw.setColor(Color.red);
// draw.drawLine(uX, uY, x, y);
//
// }
draw.setColor(Color.RED);
draw.draw(shape);
}
// @Override
// public void paint(Graphics g) {
// // ALWAYS call super.paint
// super.paint(g);
// Graphics2D draw = (Graphics2D) g;
// if (this.is_beginning || this.to_save) {
// draw.setColor(Color.white);
// draw.fillRect(0, 0, this.getWidth(), this.getHeight());
// this.is_beginning = false;
// }
// if (this.m_alzada) {
// draw.setColor(Color.red);
// draw.drawLine(uX, uY, x, y);
//
// }
// }
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
// this.uX = e.getX();
// this.uY = e.getY();
Point point = e.getPoint();
shape.moveTo(point.x, point.y);
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
// this.x = e.getX();
// this.y = e.getY();
// Don't do this!
// this.paint(this.getGraphics());
// ArrayList ayuda = new ArrayList();
// ayuda.add(uX);
// ayuda.add(uY);
// ayuda.add(x);
// ayuda.add(y);
// this.lineas.add(ayuda);
// uX = x;
// uY = y;
Point point = e.getPoint();
shape.lineTo(point.x, point.y);
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
}
}