2012-12-18 3 views
1

Je développe un programme de dessin en utilisant java socket. Plusieurs utilisateurs peuvent dessiner et enregistrer en tant que jpeg. Actuellement, la fonction Enregistrer l'image enregistre uniquement un canevas vierge. Il ne peut pas enregistrer les coordonnées tracées.Enregistrer le dessin sur Jpanel comme image

Je partage une partie de mon code ci-dessous. =)

Je n'ai pas utilisé paint ou paintComponent pour ma classe Canvas à cause de l'utilisation de java socket je rencontre des erreurs de coordonnées. Au lieu de cela, j'utilise massDraw().

class Canvas extends JPanel { 
    private int x, y; 
    private float x2, y2; 

    public Canvas() { 
     super(); 
     this.setBackground(Color.white); 
    } 

    public void massDraw(int px, int py, int x, int y, int red, int green, 
      int blue, int size) { 
     Graphics g = canvas.getGraphics(); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHints(myBrush); 

     g2d.setStroke(new BasicStroke(size, BasicStroke.CAP_ROUND, 
       BasicStroke.JOIN_BEVEL)); 
     g2d.setColor(new Color(red, green, blue)); 
     g.drawLine(px, py, x, y); 

    } 


}// end Canvas class 

classe SaveJpegOP

class saveJpegOP implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     // Ask for file name 
     String str = JOptionPane 
       .showInputDialog(null, "Enter File Name : "); 
     // save as jpeg 
      BufferedImage bufImage = new BufferedImage(canvas.getSize().width, canvas.getSize().height,BufferedImage.TYPE_INT_RGB); 
      canvas.paint(bufImage.createGraphics()); 



     try { 
      ImageIO.write(bufImage, "jpg", new File(str + ".jpg")); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

    } 

} 
+0

Où appelez-vous 'massDraw'? Quelle est la variable 'canvas'? Vous ne devriez jamais appeler 'getGraphics()', cela conduit toujours aux problèmes que vous décrivez. Je ne peux absolument pas comprendre pourquoi vous ne pouvez pas surcharger 'paintComponent' –

+0

1. massDraw est appelé dans l'autre fichier de classe publique (Client). Lorsque le client reçoit la coordonnée, il dessine les points sur le canevas des autres utilisateurs. –

+0

2. canvas varible est un canevas de canvas = new Canvas(); –

Répondre

1

toile vierge est enregistrée parce que massDraw() est jamais appelé, en particulier ce n'est pas appelé lorsque vous invoquez canvas.paint(bufImage.createGraphics()) dans saveJpegOP.

paint() essentiellement redessine toute composante et que vous avez décidé de ne pas la remplacer (ou paintComponent()), drawMass() est jamais appelé et toile vide est peint. Vous devez donc remplacer paintComponent() et appeler massDraw() avec les paramètres appropriés. Les valeurs des paramètres peuvent, par exemple, être définies précédemment en tant que propriétés dans la classe Canvas.