import java.awt.*; import java.awt.color.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; import java.util.*; import java.io.*; class Point implements Serializable { int x; int y; Color color; int type; int size; Point (int x, int y, Color color, int type, int size) { this.x = x; this.y = y; this.color = color; this.type = type; this.size = size; } } class PaintBoard extends Frame implements ActionListener, ItemListener, MouseListener,MouseMotionListener { int x; int y; Color color = new Color(0,0,0); int psize = 1; int esize = 3; BasicStroke size = new BasicStroke(psize,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //画笔大小 Vector pointInfo = null; int n = 0; int toolFlag = 0; //0=pen ,1=eraser,2=clear,3=line,4=circle,5=tangle Point cutFlag = new Point(-1,-1,color,6,psize); //截断标志 //FileDialog openDialog = new FileDialog(this,"OpenDialog",FileDialog.LOAD); //FileDialog saveDialog = new FileDialog(this,"SaveDialog",FileDialog.SAVE); FileDialog openDialog = null; FileDialog saveDialog = null; File inFile = null; File outFile = null; FileInputStream inFileInputStream = null; FileOutputStream outFileOutputStream = null; ObjectInputStream inObjectInputStream = null; ObjectOutputStream outObjectOutputStream = null; Panel toolPanel; Button openButton,saveButton,penButton,lineButton,circleButton,tangleButton, colorboardButton,eraseButton,clearButton; Choice colorChoice,fsizeChoice,esizeChoice; Label colorLabel,fsizeLabel,esizeLabel; public PaintBoard(String s) { super(s); toolFlag = 0; pointInfo = new Vector(); openButton = new Button("Open"); saveButton = new Button("Save"); penButton = new Button("Pen"); lineButton = new Button("Line"); circleButton = new Button("Circle"); tangleButton = new Button("Tangle"); colorboardButton = new Button("ColorBoard"); eraseButton = new Button("Eraser"); clearButton = new Button("Clear"); colorChoice = new Choice(); colorChoice.add("Black"); colorChoice.add("Blue"); colorChoice.add("Green"); colorChoice.add("Red"); fsizeChoice = new Choice(); fsizeChoice.add("1"); fsizeChoice.add("2"); fsizeChoice.add("3"); fsizeChoice.add("5"); fsizeChoice.add("8"); esizeChoice = new Choice(); esizeChoice.add("1"); esizeChoice.add("2"); esizeChoice.add("3"); esizeChoice.add("5"); esizeChoice.add("8"); colorLabel = new Label("Color Select"); fsizeLabel = new Label("Font Size"); esizeLabel = new Label("Eraser Size"); toolPanel = new Panel(); toolPanel.add(openButton); toolPanel.add(saveButton); toolPanel.add(penButton); toolPanel.add(lineButton); toolPanel.add(circleButton); toolPanel.add(tangleButton); toolPanel.add(colorLabel); toolPanel.add(colorChoice); toolPanel.add(fsizeLabel); toolPanel.add(fsizeChoice); toolPanel.add(colorboardButton); toolPanel.add(eraseButton); toolPanel.add(esizeLabel); toolPanel.add(esizeChoice); toolPanel.add(clearButton); openDialog = new FileDialog(this,"OpenDialog",FileDialog.LOAD); openDialog.setVisible(false); saveDialog = new FileDialog(this,"SaveDialog",FileDialog.SAVE); saveDialog.setVisible(false); add(toolPanel, BorderLayout.NORTH); setBounds(50, 50, 900, 500); //设置边界 setVisible(true); validate(); openButton.addActionListener(this); saveButton.addActionListener(this); penButton.addActionListener(this); lineButton.addActionListener(this); circleButton.addActionListener(this); tangleButton.addActionListener(this); colorboardButton.addActionListener(this); eraseButton.addActionListener(this); clearButton.addActionListener(this); colorChoice.addItemListener(this); fsizeChoice.addItemListener(this); esizeChoice.addItemListener(this); addMouseListener(this); addMouseMotionListener(this); openDialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { openDialog.setVisible(false); } }); saveDialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { saveDialog.setVisible(false); } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void paint(Graphics g) //override { Graphics2D graphics2D = (Graphics2D)g; Point p1,p2; n = pointInfo.size(); //size = new BasicStroke(psize,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); if (toolFlag == 2) { g.clearRect(0, 0, getWidth(), getHeight()); } for (int i = 0; i < n; i++) { p1 = (Point)pointInfo.elementAt(i); p2 = (Point)pointInfo.elementAt(i+1); size = new BasicStroke(p1.size,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); / graphics2D.setColor(p1.color); graphics2D.setStroke(size); if (p1.type == p2.type) { switch (p1.type) { //0=pen ,1=eraser,2=clear,3=line,4=circle,5=tangle case 0: Line2D line1 = new Line2D.Double(p1.x,p1.y,p2.x,p2.y); graphics2D.draw(line1); break; case 1: g.clearRect(p1.x, p1.y, p1.size, p1.size); break; case 3: Line2D line2 = new Line2D.Double(p1.x,p1.y,p2.x,p2.y); graphics2D.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)); graphics2D.draw(ellipse); break; case 5: Rectangle2D rectangle = new Rectangle2D.Double(p1.x,p1.y,Math.abs(p2.x-p1.x),Math.abs(p2.y-p1.y)); graphics2D.draw(rectangle); break; case 6: i =i + 1; default: break; } } } } public void actionPerformed(ActionEvent e) { if (e.getSource() == penButton) { toolFlag = 0; } else if (e.getSource() == eraseButton) { toolFlag = 1; size = new BasicStroke(psize,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } if (e.getSource() == clearButton) { toolFlag = 2; pointInfo.removeAllElements(); repaint(); } if (e.getSource() == lineButton) { toolFlag = 3; } if (e.getSource() == circleButton) { toolFlag = 4; } if (e.getSource() == tangleButton) { toolFlag = 5; } if (e.getSource() == colorboardButton) { Color newColor = JColorChooser.showDialog(this, "Color Select", color); color = newColor; } if (e.getSource() == openButton) { openDialog.setVisible(true); int tempFlag; tempFlag = toolFlag; toolFlag = 2; repaint(); try{ if (openDialog.getFile()!=null) { inFile = new File(openDialog.getDirectory(),openDialog.getFile()); inFileInputStream = new FileInputStream(inFile); inObjectInputStream = new ObjectInputStream(inFileInputStream); pointInfo = (Vector)inObjectInputStream.readObject(); inObjectInputStream.close(); inFileInputStream.close(); repaint(); toolFlag = tempFlag; } } catch (ClassNotFoundException IO1) { // TODO: handle exception repaint(); toolFlag = tempFlag; System.out.println("File not found"); } catch (IOException IO2) { // TODO: handle exception repaint(); toolFlag = tempFlag; System.out.println("IO Error"); } } if (e.getSource() == saveButton) { saveDialog.setVisible(true); if (saveDialog.getFile() != null) { try{ outFile = new File(saveDialog.getDirectory(),saveDialog.getFile()); outFileOutputStream = new FileOutputStream(outFile); outObjectOutputStream = new ObjectOutputStream(outFileOutputStream); outObjectOutputStream.writeObject(pointInfo); outObjectOutputStream.close(); outFileOutputStream.close(); } catch (IOException IO1) { // TODO: handle exception System.out.println("IO Error"); } } } } public void itemStateChanged(ItemEvent e) { if (e.getSource() == colorChoice) { String colorString = colorChoice.getSelectedItem(); if ("Black" == colorString) { color = new Color(0,0,0); } if ("Blue" == colorString) { color = new Color(0,0,255); } if ("Green" == colorString) { color = new Color(0,255,0); } if ("Red" == colorString) { color = new Color(255,0,0); } } else if (e.getSource() == fsizeChoice) { String num1 = fsizeChoice.getSelectedItem(); if ("1" == num1) { psize = 1; size = new BasicStroke(psize,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } if ("2" == num1) { psize = 2; size = new BasicStroke(psize,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } if ("3" == num1) { psize = 3; size = new BasicStroke(psize,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } if ("5" == num1) { psize = 5; size = new BasicStroke(psize,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } if ("8" == num1) { psize = 8; size = new BasicStroke(psize,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); } } else if (e.getSource() == esizeChoice) { String num2 = esizeChoice.getSelectedItem(); if ("1" == num2) { esize = 1*3; } if ("2" == num2) { esize = 2*3; } if ("3" == num2) { esize = 3*3; } if ("5" == num2) { esize = 5*3; } if ("8" == num2) { esize = 8*3; } } } public void mousePressed(MouseEvent e) { Point p1; switch (toolFlag) { case 0: x = e.getX(); y = e.getY(); p1= new Point(x,y,color,toolFlag,psize); pointInfo.addElement(p1); break; case 1: x = e.getX(); y = e.getY(); p1 = new Point(x,y,null,toolFlag,esize); //eraser pointInfo.addElement(p1); break; case 3: //line x = e.getX(); y = e.getY(); p1= new Point(x,y,color,toolFlag,psize); pointInfo.addElement(p1); break; case 4: //circle x = e.getX(); y = e.getY(); p1= new Point(x,y,color,toolFlag,psize); pointInfo.addElement(p1); break; case 5: x = e.getX(); y = e.getY(); p1= new Point(x,y,color,toolFlag,psize); pointInfo.addElement(p1); break; default: break; } } public void mouseDragged(MouseEvent e) //drag mouse { Point p2; switch (toolFlag) { case 0: x = e.getX(); y = e.getY(); p2 = new Point(x,y,color,toolFlag,psize); pointInfo.addElement(p2); repaint(); break; case 1: x = e.getX(); y = e.getY(); p2 = new Point(x,y,null,toolFlag,esize); pointInfo.addElement(p2); repaint(); break; default: break; } } public void mouseReleased(MouseEvent e) { Point p3; switch (toolFlag) { case 0: //x = e.getX(); //y = e.getY(); //p3 = new Point(x,y,color,toolFlag,psize); //pointInfo.addElement(p3); pointInfo.addElement(cutFlag); //repaint(); break; case 1: //x = e.getX(); //y = e.getY(); //p3 = new Point(x,y,null,toolFlag,esize); //pointInfo.addElement(p3); pointInfo.addElement(cutFlag); //repaint(); break; case 3: x = e.getX(); y = e.getY(); p3 = new Point(x,y,color,toolFlag,psize); pointInfo.addElement(p3); pointInfo.addElement(cutFlag); repaint(); break; case 4: x = e.getX(); y = e.getY(); p3 = new Point(x,y,color,toolFlag,psize); pointInfo.addElement(p3); pointInfo.addElement(cutFlag); repaint(); break; case 5: x = e.getX(); y = e.getY(); p3 = new Point(x,y,color,toolFlag,psize); pointInfo.addElement(p3); pointInfo.addElement(cutFlag); repaint(); break; default: break; } } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseEvent(MouseEvent e) {} public void update(Graphics g) { paint(g); } } public class GraphEdit { public static void main(String[] args) { new PaintBoard("PaintBoard"); } }