2013-03-22 384 views
1

我制作了一个保存在图像上的Java Applet,用户在JPanel中绘制了哪些内容。当我保存在输出图像上时,我只有JPanel的背景,线条已被用户消除。任何提示来解决它?在这个代码行中已经被程序引用了,但是错误依然存在。将JPanel保存为.jpg/.png图像

import java.applet.Applet; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.AdjustmentEvent; 
import java.awt.event.AdjustmentListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JPanel; 

public class MarkPen extends Applet implements ActionListener, AdjustmentListener, MouseListener, MouseMotionListener { 

    private int x = 0; 
    private int y = 0; 
    private int prevx = 0; 
    private int prevy = 0; 

    private JPanel drawPanel = new JPanel(); 
    private JButton saveButton = new JButton("SaveImage"); 

    public void init() 
    { 

     setLayout(new BorderLayout()); 

     drawPanel.setBackground(Color.red); 
     drawPanel.addMouseMotionListener(this); 
     drawPanel.addMouseListener(this); 
     drawPanel.add(new Comp()); 
     drawPanel.setDoubleBuffered(true); 
     add(drawPanel, "Center"); 

     saveButton.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) 
       { 
       BufferedImage image = new BufferedImage(drawPanel.getWidth(), drawPanel.getHeight(), BufferedImage.TYPE_INT_RGB); 
       Graphics2D graphics2D = image.createGraphics(); 

       drawPanel.paint(graphics2D); 
       try{ 
        ImageIO.write(image,"jpeg", new File("C:/.../Example.jpeg")); 
        } 
       catch(Exception ex){ 
         ex.printStackTrace(); 
        } 
       } 
     }); 

     add(saveButton, "South"); 

    } 

    public void setGraphicalDefaults(MouseEvent e){} 

    public class Comp extends JComponent{ 
     public void paintComponent(Graphics g) { 
      g = drawPanel.getGraphics(); 
      g.setColor(Color.black); 
      g.drawLine(0,0,100,100); 
     } 
    } 

    public void mouseDragged(MouseEvent e){} 
    public void mousePressed(MouseEvent e){} 
    public void actionPerformed(ActionEvent e){} 
    public void mouseReleased(MouseEvent e){} 
    public void mouseEntered(MouseEvent e){} 
    public void mouseExited(MouseEvent e){} 
    public void mouseMoved(MouseEvent e){} 
    public void mouseClicked(MouseEvent e){} 
    public void adjustmentValueChanged(AdjustmentEvent arg0){} 

} 

感谢您的帮助我解决了它,我发布了下面的工作代码。

工作代码:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import java.awt.Dimension; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.lang.reflect.InvocationTargetException; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JApplet; 
import javax.swing.SwingUtilities; 

public class MarkPen extends JApplet { 

    private static final long serialVersionUID = 1L; 

    public static class DrawPanel extends JPanel { 

     private static final long serialVersionUID = 1L; 
     private List<Point> points = new ArrayList<Point>(); 

     public DrawPanel() { 
      setBackground(Color.WHITE); 

      addMouseMotionListener(new MouseAdapter() { 

       @Override 
       public void mouseDragged(MouseEvent e) { 
        points.add(e.getPoint()); 
        repaint(); 
       } 
      }); 

      addMouseListener(new MouseAdapter(){ 

       @Override 
       public void mousePressed(MouseEvent e){ 
        Point p = null; 
        points.add(p); 
      } 
      }); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(300, 300); 
     } 

     @Override 
     protected void paintComponent(java.awt.Graphics g) { 
      super.paintComponent(g); 
      Point p1 = null; 
      Point p2 = null; 
      g.setColor(Color.black); 
      for (Point p : points) { 
       p2 = p1; 
       p1 = p; 
       if (p1 != null && p2 != null) { 
        g.drawLine(p1.x, p1.y, p2.x, p2.y); 
       } 
      } 
     } 
    } 

    protected void initUI() { 
     setLayout(new BorderLayout()); 

     JButton saveButton = new JButton("SaveImage"); 
     JButton clearButton = new JButton("Clear"); 
     final DrawPanel drawPanel = new DrawPanel(); 
     JPanel buttonsPanel = new JPanel(); 

     buttonsPanel.setLayout(new BorderLayout()); 
     setSize(1000, 305); 
     add(drawPanel, "Center"); 

     saveButton.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) 
       { 
       BufferedImage image = new BufferedImage(drawPanel.getWidth(), drawPanel.getHeight(), BufferedImage.TYPE_INT_RGB); 
       Graphics2D graphics2D = image.createGraphics(); 

       drawPanel.paint(graphics2D); 
       try{ 
        ImageIO.write(image,"png", new File("C:/.../Desktop/Example.png")); 
        } 
       catch(Exception ex){ 
         ex.printStackTrace(); 
        } 
       } 
     }); 

     clearButton.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) 
      { 
       drawPanel.points.clear(); 
       repaint(); 
      } 
     }); 

     buttonsPanel.add(clearButton, BorderLayout.WEST); 
     buttonsPanel.add(saveButton, BorderLayout.EAST); 
     add(buttonsPanel, BorderLayout.SOUTH); 

     validate(); 
    } 

    @Override 
    public void init() { 
     super.init(); 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       @Override 
       public void run() { 
        initUI(); 
       } 
      }); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

为什么当你已经有一个有效的''g = drawPanel.getGraphics();''时,你会费心去抓另一个'Graphics'对象。 'g'不是'null',那么你为什么试图去抓另一个可能无效的。 – 2013-03-22 14:07:23

回答

1
  • 您的问题是由drawPanel.getGraphics();使用,

  • 这种方法可以为Save JPanel into Image创建temparary对象,而不是在JPanel

  • 显示Image

    覆盖getPreferredSizepublic class Comp extends JComponent{

  • drawImagepaintComponent

  • 使用super.paintComponent的情况下,你要替换当前绘画

例如

class Comp extends JComponent { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 300); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(bi, 0, 0, this); 
    } 
} 
+0

所以我必须在BufferedImage中绘制我的线条,然后在paintComponent中绘制双曲线?我怎样才能做到这一点?对不起,但这是我第一次使用BufferedImage,我有问题要了解它是如何工作的。 – user2195984 2013-03-22 10:18:20

+0

[DYM画g.drawLine()动态???](http://stackoverflow.com/a/15566978/714968) – mKorbel 2013-03-22 12:05:19

1

这是我第一次使用的BufferedImage我有问题了解如何它的工作原理

请参阅Custom Painting ApproachesDrawOnImage示例是使用BufferedImage的示例,但它也不会伤害其他示例。

+0

感谢您的教程 – user2195984 2013-03-23 10:20:13