2014-04-21 5 views
0

아래에 실수가있는 내 코드의 단축 버전을 볼 수 있습니다. 저는 MS Paint와 비슷한 프로그램을 만들고 있습니다. 문제는 내가 예를 들어 그림을 그릴 때입니다. 직사각형과 내가 그려진 사각형이 실제로 어떻게 생겼는지보고 싶다면 마지막까지 모든 직사각형이 프로그램에 의해 그려집니다. 그런 다음 코드의 주석 부분을보고 약간의 변경 (이전 코드 사용 안 함)을 사용하면 작동하도록 작동합니다. 그러나 프로그램은 그림을 PC의 메모리에 저장해야하며이 방법으로 작동시키지 않아야합니다. 나는 JAVA에서 꽤 초보자이며 실수로 어디에 있는지 알지 못한다. 주어진 방법이 drawImage이고 이미지가 필요하다. 그게 내가하고있는 일이다.직사각형의 실제 모양이 작동하지 않습니다.

내가 바라는 것을 이해할 수 있기를 바랍니다. 당신이 할 수없는 기회라면, 코드를 복사 해 놓으면 쉽게 시험해 볼 수 있습니다. 첫 번째 객체 그리기를 시도하면 실수가 표시됩니다.

일등석 :

import java.awt.BorderLayout; 
import javax.swing.JFrame; 

public class MyPaint extends JFrame{ 

    private Desk paintDesk; 

    public static void main(String[] args) { 

     @SuppressWarnings("unused") 
     MyPaint frame = new MyPaint();        
    } 
    MyPaint() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
     setBounds(400, 100, 600, 600); 
     setResizable(false); 
     setLayout(new BorderLayout()); 

     paintDesk = new Desk(); 

     this.getContentPane().add(paintDesk,BorderLayout.CENTER); 
     setVisible(true); 
    } 
} 

2 등석 : 항상 이미지에 그림의

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.RenderedImage; 
import java.io.IOException; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.JComponent; 
import javax.swing.SwingUtilities; 

public class Desk extends JComponent{ 

    private Image paintedImage; 
    private Image newImage;  
    private Graphics2D graphics;  

    private Point a; 
    private Point b; 

    public Desk() 
    { 
     a= new Point(); 
     b= new Point(); 

     setDoubleBuffered(false); 

     addMouseListener(new MouseAdapter(){    
      public void mousePressed(MouseEvent e){    
       if(SwingUtilities.isLeftMouseButton(e)) 
       {  
        /*try { 
         ImageIO.write((RenderedImage)paintedImage, "JPG", new File("actual.jpg")); 
        } catch (IOException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        }*/ 
        newImage= paintedImage; 
        a.x = e.getX(); 
        a.y = e.getY();    
       }      
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter(){ 
      public void mouseDragged(MouseEvent e){   
       if(SwingUtilities.isLeftMouseButton(e)) 
       { 
        /*try { 
         newImage= (ImageIO.read(new File("actual.jpg"))); 
        } catch (IOException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        }*/ 

        if(newImage!=null) 
        { 
         graphics.drawImage(newImage,0,0,null); 
         repaint(); 
        } 

        b.x = e.getX(); 
        b.y = e.getY(); 
        if(graphics != null) 
        { 
         drawRect(); 
        }      
        repaint();  
       }    
      }   
     }); 

     addMouseListener(new MouseAdapter(){ 
      public void mouseReleased(MouseEvent e){   
       if(SwingUtilities.isLeftMouseButton(e))  
       {      
        b.x = e.getX();   
        b.y = e.getY();     
        if(graphics != null) 
        {      
         drawRect();  
        }     
        repaint();         
       }    
      } 
     }); 
    } 
    public void paintComponent(Graphics g){    
     if(paintedImage == null) 
     { 
      paintedImage = createImage(getSize().width, getSize().height); 
      graphics = (Graphics2D)paintedImage.getGraphics(); 
      graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      graphics.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); 
      clear();   
     }  
     g.drawImage(paintedImage, 0, 0, null); 
    } 
    private void clear() 
    {  
     graphics.setPaint(Color.white); 
     graphics.fillRect(0, 0, getSize().width, getSize().height); 
     graphics.setPaint(Color.red); 
     repaint(); 
    } 
    private void drawRect() 
    { 
     graphics.drawLine(a.x, a.y, b.x, a.y); 
     graphics.drawLine(a.x, a.y, a.x, b.y); 
     graphics.drawLine(a.x, b.y, b.x, b.y); 
     graphics.drawLine(b.x, a.y, b.x, b.y); 
    } 
} 

답변

0

기본적인 접근 방식은 잘못된 것입니다. 사용자가 마우스 버튼을 놓을 때까지 이미지에 사각형을 그리지 않으려 고합니다. 그때까지 paintComponent() 메소드의 구성 요소에 임시 사각형을 그려야합니다.

위의 방법을 사용하는 작업 예에 대해서는 Custom Painting ApproachesDrawOnImage 예를 참조하십시오.

0

이 특정 문제의 해결책은 변수 newImage에 변수 paintedImage에 대한 참조 만 저장하고 특정 이미지는 저장하지 않았습니다.

newImage 변수가 대신 코드의 BufferedImage로서 선언해야

newImage = paintedImage; 

이 코드 수 있습니다

newImage = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_RGB); 
Graphics g = newImage.createGraphics(); 
g.drawImage(paintedImage, 0, 0, null); 
관련 문제