package guitest.myboard; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.io.*; import java.util.*; import javax.swing.*; //the point //impress the info of one point,the x and y class OnePoint implements Serializable { int x; int y; int tool; Color c; int border; public OnePoint(int x,int y,int tool,Color cc,int border){ this.x=x; this.y=y; this.tool=tool; this.c=cc; this.border=border; } } class DrawingBoard extends Frame implements MouseListener,ItemListener,ActionListener,MouseMotionListener{ Button pen; Button line ; Button ellipse ; Button rect ; Button clear ; Button colorboard ; Button storebutton; Button openbutton; Choice sizechoice ; Choice colorchoice ; Label pensize; Label pencolor; Panel panel ; FileDialog storefile; FileDialog openfile; FileInputStream filein; FileOutputStream fileout; ObjectInputStream objectin; ObjectOutputStream objectout; int flagtool=0; Color flagcolor; int border; BasicStroke size; OnePoint p1,p2; Vector<OnePoint> points=new Vector<OnePoint>(); public DrawingBoard(){ pen=new Button("画笔"); line=new Button("直线"); ellipse=new Button("圆"); rect=new Button("矩形"); clear=new Button("清除"); colorboard=new Button("调色板"); storebutton=new Button("存储文件"); openbutton=new Button("打开文件"); pensize=new Label("画笔大小"); pencolor=new Label("画笔颜色"); storefile=new FileDialog(this,"存储文件",FileDialog.SAVE); storefile.setVisible(false); storefile.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ storefile.setVisible(false); } }); openfile=new FileDialog(this,"打开文件",FileDialog.LOAD); openfile.setVisible(false); openfile.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ openfile.setVisible(false); } }); sizechoice=new Choice(); sizechoice.add("1"); sizechoice.add("2"); sizechoice.add("4"); sizechoice.add("6"); sizechoice.add("8"); sizechoice.addItemListener(this); colorchoice=new Choice(); colorchoice.add("black"); colorchoice.add("red"); colorchoice.add("blue"); colorchoice.add("green"); colorchoice.addItemListener(this); pen.addActionListener(this); line.addActionListener(this); ellipse.addActionListener(this); rect.addActionListener(this); clear.addActionListener(this); colorboard.addActionListener(this); storebutton.addActionListener(this); openbutton.addActionListener(this); panel=new Panel(); panel.add(storebutton); panel.add(openbutton); panel.add(pen); panel.add(line); panel.add(ellipse); panel.add(rect); panel.add(clear); panel.add(sizechoice); panel.add(pensize); panel.add(colorchoice); panel.add(pencolor); panel.add(colorboard); add(panel,BorderLayout.NORTH); setBounds(100,100,700,600); setVisible(true); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); /** * 添加鼠标事件的监听器,否则,鼠标的移动和点击都将无法识别! * */ addMouseListener(this); addMouseMotionListener(this); } public void paint(Graphics g){ Graphics2D g2d=(Graphics2D)g; if(flagtool==2){ //qing chu g.clearRect(0,0,getSize().width,getSize().height); } for(int i=0;i<points.size()-1;i++){ p1=(OnePoint)points.elementAt(i); p2=(OnePoint)points.elementAt(i+1); g2d.setColor(p1.c); //////////////需要使用Graphics2D从Graphics类中继承下来的方法 setColor()设置当前的颜色 size=new BasicStroke(p1.border,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); g2d.setStroke(size); if(p1.tool==p2.tool){ switch(p1.tool){ case 0: Line2D.Double line1=new Line2D.Double(p1.x,p1.y,p2.x,p2.y); g2d.draw(line1); break; case 1: Line2D.Double line2=new Line2D.Double(p1.x,p1.y,p2.x,p2.y); g2d.draw(line2); break; case 3: Ellipse2D.Double 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 4: Rectangle2D.Double rect=new Rectangle2D.Double(p1.x,p1.y,Math.abs(p2.x-p1.x),Math.abs(p2.y-p1.y)); g2d.draw(rect); break; default: } } } } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) { //鼠标点下时候,将当前的点信息记录 OnePoint pp1=new OnePoint(e.getX(),e.getY(),flagtool,flagcolor,border); points.addElement(pp1); //repaint(); } public void mouseReleased(MouseEvent e) {//鼠标松开时候,如果是画笔,则当前截断,是其余状态记下一枚点信息 if(flagtool==0){ points.addElement(new OnePoint(-1,-1,22,flagcolor,border)); } else{ OnePoint pp2=new OnePoint(e.getX(),e.getY(),flagtool,flagcolor,border); points.addElement(pp2); points.add(new OnePoint(-1,-1,22,flagcolor,border)); } repaint(); } public void itemStateChanged(ItemEvent e) { if(e.getSource()==colorchoice){ String selected=colorchoice.getSelectedItem(); if(selected=="black"){ flagcolor=new Color(0,0,0); } else if(selected=="red"){ flagcolor=new Color(255,0,0); } else if(selected=="blue"){ flagcolor=new Color(0,0,255); } else if(selected=="green"){ flagcolor=new Color(0,255,0); } } else if(e.getSource()==sizechoice){ String selected=sizechoice.getSelectedItem(); if (selected=="1"){ border=1; } else if(selected=="2"){ border=2*2; } else if(selected=="4"){ border=4*2; } else if(selected=="6"){ border=6*2; } else if(selected=="8"){ border=8*2; } } } public void update(Graphics g) { //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ paint(g); } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==pen){ flagtool=0; } else if(e.getSource()==line){ flagtool=1; } else if(e.getSource()==clear){ flagtool=2; points.removeAllElements(); repaint(); //此语要有,否则今生无法删除! } else if(e.getSource()==ellipse){ flagtool=3; } else if(e.getSource()==rect){ flagtool=4; } else if(e.getSource()==colorboard){ /* * 使用 javax.swing.×包中的 JColorChooser 类的静态方法showDialog(Component component,String title,Color color ), * 该方法的参数,component是当前显示对话框的父框架,color是设置调色板初始的被选颜色 * * 该方法返回被选的颜色,类型为Color * */ Color color=JColorChooser.showDialog(this, "调色板",flagcolor); flagcolor=color; } else if(e.getSource()==openbutton){ openfile.setVisible(true); if(openfile.getFile()!=null){ int temp=flagtool; flagtool=2; repaint(); try{ points.removeAllElements(); File file=new File(openfile.getDirectory(),openfile.getFile()); filein=new FileInputStream(file); objectin=new ObjectInputStream(filein); points=(Vector)objectin.readObject(); objectin.close(); filein.close(); flagtool=temp; repaint(); } catch(Exception ee){ System.out.println(ee.toString()); } } } else if(e.getSource()==storebutton){ storefile.setVisible(true); if(storefile.getFile()!=null){ try { File file=new File(storefile.getDirectory(),storefile.getFile()); fileout=new FileOutputStream(file); objectout=new ObjectOutputStream(fileout); objectout.writeObject(points); objectout.close(); fileout.close(); repaint(); } catch (FileNotFoundException e1) { System.out.println(e1.toString()); e1.printStackTrace(); } catch (IOException ee) { System.out.println(ee.toString()); ee.printStackTrace(); } } } } public void mouseDragged(MouseEvent e) {//鼠标拖动时候,//当且仅当 flagtool==0,或者表示为橡皮的时候 //才将拖动过程中涉及到的点全部记录下来,并且调用repain()方法,重画当前 // TODO Auto-generated method stub if(flagtool==0){ OnePoint pp3=new OnePoint(e.getX(),e.getY(),flagtool,flagcolor,border); points.addElement(pp3); repaint(); } } public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub } } public class PaintBoard{ public static void main(String[] args){ DrawingBoard oneBorder=new DrawingBoard(); } }