import java.applet.Applet; import java.awt.*; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Properties; import java.util.Vector; import javax.imageio.ImageIO; import javax.swing.JColorChooser; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class DrawPencil extends Applet { private static final long serialVersionUID = 1L; Vector paintInfo = null;// 点信息向量组 int n = 1; MediaTracker mt; int x = -1, y = -1; int con = 1; int Econ = 5; int toolFlag = 0; Color c = new Color(0, 0, 0); BasicStroke size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); EveryPoint cutflag = new EveryPoint(-1, -1, c, 6, con); Panel toolPanel; Button eraser, drLine, drCircle, drRect; Button clear, pen; Choice ColChoice, SizeChoice, EraserChoice; Button colchooser; Label 颜色, 大小B, 大小E; Button openPic, savePic; FileDialog openPicture, savePicture; public DrawPencil() { super(); } public void init() { this.setSize(900, 600); paintInfo = new Vector(); ColChoice = new Choice(); ColChoice.add("black"); ColChoice.add("red"); ColChoice.add("blue"); ColChoice.add("green"); ColChoice.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { String name = ColChoice.getSelectedItem(); if (name == "black") { c = new Color(0, 0, 0); } else if (name == "red") { c = new Color(255, 0, 0); } else if (name == "green") { c = new Color(0, 255, 0); } else if (name == "blue") { c = new Color(0, 0, 255); } } }); SizeChoice = new Choice(); SizeChoice.add("1"); SizeChoice.add("3"); SizeChoice.add("5"); SizeChoice.add("7"); SizeChoice.add("9"); SizeChoice.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { String selected = SizeChoice.getSelectedItem(); if (selected == "1") { con = 1; size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); } else if (selected == "3") { con = 3; size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); } else if (selected == "5") { con = 5; size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); } else if (selected == "7") { con = 7; size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); } else if (selected == "9") { con = 9; size = new BasicStroke(con, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); } } }); EraserChoice = new Choice(); EraserChoice.add("5"); EraserChoice.add("9"); EraserChoice.add("13"); EraserChoice.add("17"); EraserChoice.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { String Esize = EraserChoice.getSelectedItem(); if (Esize == "5") { Econ = 5 * 2; } else if (Esize == "9") { Econ = 9 * 2; } else if (Esize == "13") { Econ = 13 * 2; } else if (Esize == "17") { Econ = 17 * 3; } } }); toolPanel = new Panel(); clear = new Button("清除"); eraser = new Button("橡皮"); pen = new Button("画笔"); drLine = new Button("画直线"); drCircle = new Button("画圆形"); drRect = new Button("画矩形"); openPic = new Button("打开图画"); savePic = new Button("保存图画"); clear.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { toolFlag = 2; paintInfo.removeAllElements(); repaint(); } }); eraser.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // TODO 自动生成方法存根 toolFlag = 1; } }); pen.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // TODO 自动生成方法存根 toolFlag = 0; } }); drLine.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { toolFlag = 3; } }); drCircle.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { toolFlag = 4; } }); drRect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { toolFlag = 5; } }); savePic.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { printPanelToJPG(toolPanel); } }); 颜色 = new Label("画笔颜色", Label.CENTER); 大小B = new Label("画笔大小", Label.CENTER); 大小E = new Label("橡皮大小", Label.CENTER); toolPanel.add(savePic); toolPanel.add(pen); toolPanel.add(drLine); toolPanel.add(颜色); toolPanel.add(ColChoice); toolPanel.add(大小B); toolPanel.add(SizeChoice); toolPanel.add(eraser); toolPanel.add(大小E); toolPanel.add(EraserChoice); toolPanel.add(clear); this.add(toolPanel); setBounds(60, 60, 900, 600); setVisible(true); validate(); this.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { EveryPoint p1; switch (toolFlag) { case 0: x = (int) e.getX(); y = (int) e.getY(); p1 = new EveryPoint(x, y, c, toolFlag, con); paintInfo.addElement(p1); repaint(); break; case 1: x = (int) e.getX(); y = (int) e.getY(); p1 = new EveryPoint(x, y, null, toolFlag, Econ); paintInfo.addElement(p1); repaint(); break; default: } } }); this.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { EveryPoint p2; switch (toolFlag) { case 3: x = (int) e.getX(); y = (int) e.getY(); p2 = new EveryPoint(x, y, c, toolFlag, con); paintInfo.addElement(p2); break; case 4: x = (int) e.getX(); y = (int) e.getY(); p2 = new EveryPoint(x, y, c, toolFlag, con); paintInfo.addElement(p2); break; case 5: x = (int) e.getX(); y = (int) e.getY(); p2 = new EveryPoint(x, y, c, toolFlag, con); paintInfo.addElement(p2); break; default: } } public void mouseReleased(MouseEvent e) { EveryPoint p3; switch (toolFlag) { case 0: paintInfo.addElement(cutflag); break; case 1: paintInfo.addElement(cutflag); break; case 3: x = (int) e.getX(); y = (int) e.getY(); p3 = new EveryPoint(x, y, c, toolFlag, con); paintInfo.addElement(p3); paintInfo.addElement(cutflag); repaint(); break; case 4: x = (int) e.getX(); y = (int) e.getY(); p3 = new EveryPoint(x, y, c, toolFlag, con); paintInfo.addElement(p3); paintInfo.addElement(cutflag); repaint(); break; case 5: x = (int) e.getX(); y = (int) e.getY(); p3 = new EveryPoint(x, y, c, toolFlag, con); paintInfo.addElement(p3); paintInfo.addElement(cutflag); repaint(); break; default: } } }); } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; EveryPoint p1, p2; n = paintInfo.size(); if (toolFlag == 2) g.clearRect(0, 0, getSize().width, getSize().height);// 清除 for (int i = 0; i < n - 1; i++) { p1 = (EveryPoint) paintInfo.elementAt(i); p2 = (EveryPoint) paintInfo.elementAt(i + 1); size = new BasicStroke(p1.boarder, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); g2d.setColor(p1.col); g2d.setStroke(size); if (p1.tool == p2.tool) { switch (p1.tool) { case 0: Line2D line1 = new Line2D.Double(p1.x, p1.y, p2.x, p2.y); g2d.draw(line1); break; case 1: g.clearRect(p1.x, p1.y, p1.boarder, p1.boarder); break; case 3: Line2D line2 = new Line2D.Double(p1.x, p1.y, p2.x, p2.y); g2d.draw(line2); break; case 4: Ellipse2D ellipse = new Ellipse2D.Double(p1.x, p1.y, Math .abs(p2.x - p1.x), Math.abs(p2.y - p1.y)); g2d.draw(ellipse); break; case 5: Rectangle2D rect = new Rectangle2D.Double(p1.x, p1.y, Math .abs(p2.x - p1.x), Math.abs(p2.y - p1.y)); g2d.draw(rect); break; case 6: i = i + 1; break; default: } } } } public void update(Graphics g) { paint(g); } public void printPanelToJPG(Panel graph) { int width = this.getWidth(); int height = this.getHeight(); BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g2d = (Graphics2D) bi.createGraphics(); g2d = (Graphics2D) bi.getGraphics(); try { JFileChooser chooser = new JFileChooser(".//"); chooser.setAcceptAllFileFilterUsed(false); chooser.setSelectedFile(new File("1.jpg")); int status = chooser.showSaveDialog(graph); if (status == JFileChooser.APPROVE_OPTION) { File saveFile = chooser.getSelectedFile(); if (saveFile.exists()) { String prompt = "The file " + saveFile.getName() + " already exists. Do you want to replace the existing file"; int ret = JOptionPane.showConfirmDialog(graph, prompt, "Warning", JOptionPane.YES_NO_OPTION); if (ret == JOptionPane.NO_OPTION) { return; } } saveFile = new File(saveFile.getAbsoluteFile() + ".jpg"); FileOutputStream fos = new FileOutputStream(saveFile); JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(fos); jpegEncoder.encode(bi); fos.flush(); fos.close(); } } catch (IOException ex) { JOptionPane.showMessageDialog(graph, "IO Error, operation failed\n" + ex.toString(), "Error", JOptionPane.PLAIN_MESSAGE); } } private Point Point(int i, int j) { Point point = new Point(i, j); return point; } } class EveryPoint implements Serializable { int x, y; Color col; int tool; int boarder; private static final long serialVersionUID = 1L; EveryPoint(int x, int y, Color col, int tool, int boarder) { this.x = x; this.y = y; this.col = col; this.tool = tool; this.boarder = boarder; } }