Покопал на данную тему - судя по всему проблемы (если их можно так назвать) закопаны глубоко в sun методах отвечающих за отрисовку стандартных форм (таких как например линия). Плюс, если вы посмотрите, Graphics2D у BufferedImage и в методе paint() компонента немного отличаются, например Surface'ом. Вобщем я не буду гадать, ибо точно не знаю.
На вашем месте, если вам просто до "немогу" критично поправить данное несхождение, сделал бы еще 1 BufferedImage для хранения рисуемых форм. Я так сделал в своем редакторе, но по другим причинам (надо было рисовать новые элементы на экземпляре, а не на исходнике)
Вот как-то так:
| Код | public class PaintTest { public PaintTest () { final JFrame jfrm = new JFrame ();
jfrm.setLayout ( new BorderLayout () ); jfrm.add ( new JLabel() { private int startX = -1; private int startY = -1; private int x = -1; private int y = -1;
private BufferedImage bufferedImage; private BufferedImage buffer;
{ setPreferredSize ( new Dimension ( 500, 500 ) ); bufferedImage = new BufferedImage ( 500, 500, BufferedImage.TYPE_INT_ARGB ); buffer = new BufferedImage ( 500, 500, BufferedImage.TYPE_INT_ARGB );
MouseAdapter mouseAdapter = new MouseAdapter() { public void mouseReleased ( MouseEvent e ) { x = e.getX (); y = e.getY ();
updateImage (); Graphics2D g2d = bufferedImage.createGraphics (); g2d.drawImage ( buffer, 0, 0, null ); g2d.dispose ();
x = startX = -1; y = startY = -1; updateImage ();
repaint (); }
public void mousePressed ( MouseEvent e ) { x = startX = e.getX (); y = startY = e.getY (); updateImage (); repaint (); }
public void mouseDragged ( MouseEvent e ) { x = e.getX (); y = e.getY (); updateImage (); repaint (); }
private void updateImage () { Graphics2D g2d = buffer.createGraphics (); g2d.setBackground ( new Color ( 0, 0, 0, 0 ) ); g2d.clearRect ( 0, 0, 500, 500 ); if ( startX != -1 && startY != -1 && x != -1 && y != -1 ) { g2d.setPaint ( Color.BLACK ); g2d.draw ( new Line2D.Double ( startX, startY, x, y ) ); } g2d.dispose (); } }; addMouseListener ( mouseAdapter ); addMouseMotionListener ( mouseAdapter ); }
public void paint ( Graphics g ) { super.paint ( g );
Graphics2D g2d = ( Graphics2D ) g; if ( bufferedImage != null ) { g2d.drawImage ( bufferedImage, 0, 0, null ); } if ( buffer != null ) { g2d.drawImage ( buffer, 0, 0, null ); } } } );
jfrm.pack (); jfrm.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE ); jfrm.setLocationRelativeTo ( null ); jfrm.setVisible ( true ); }
public static void main ( String[] args ) { SwingUtilities.invokeLater ( new Runnable() { public void run () { new PaintTest (); } } ); } } |
|