【转】java,画图,可调画笔粗细

/*可调画笔粗细-Java画图实验-Java源代码 -good code
*画直线,曲线,矩形,椭圆,可调颜色,有橡皮擦功能
*可调画笔粗细
*没有解决闪烁功能
*hxz*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import java.awt.geom.*;
class Point
{
      int x,y;
      Color col;
      int tool;
      int boarder;
      Point(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;
       }
}


/*
*BasicStroke
*Choice
*validate();
**/
class paintboard extends Frame implements ActionListener,MouseMotionListener,MouseListener,ItemListener
{
     int xx0=0,yy0=0;
     int xx1=0,yy1=0;
     int type=6;
     int x = -1, y = -1;
     int con = 1;//画笔大小
     int Econ = 5;//橡皮大小
     int toolFlag = 0;//toolFlag:工具标记
                 //toolFlag工具对应表:
                 //(0--画笔);(1--橡皮);(2--清除);
                 //(3--直线);(4--圆);(5--矩形);
                 
     Color c = new Color(0,0,0); //画笔颜色
     BasicStroke size = new BasicStroke (con,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);//画笔粗细
     Point cutflag = new Point(-1, -1, c, 6, con);//截断标志
     Vector paintInfo = null;//点信息向量组
     int n = 1;

     // *工具面板--画笔,直线,圆,矩形,多边形,橡皮,清除*/
     Panel toolPanel;
     Button eraser, drLine,drCircle,drRect;
     Button clear ,pen;
     Choice ColChoice,SizeChoice,EraserChoice;
     Button colchooser;
     Label 颜色,大小B,大小E;
     
       paintboard(String s)//构造函数
     {
            super(s);
            addMouseMotionListener(this);
            addMouseListener(this);
            paintInfo = new Vector();
          /*各工具按钮及选择项*/
            //颜色选择
            ColChoice = new Choice();
            ColChoice.add("黑色");
            ColChoice.add("红色");
            ColChoice.add("蓝色");
            ColChoice.add("绿色");
            ColChoice.addItemListener(this);
            //画笔大小选择
            SizeChoice = new Choice();
            SizeChoice.add("1");
            SizeChoice.add("3");
            SizeChoice.add("5");
            SizeChoice.add("7");
            SizeChoice.add("9");
            SizeChoice.addItemListener(this);
            //橡皮大小选择
            EraserChoice = new Choice();
            EraserChoice.add("2");
            EraserChoice.add("3");
            EraserChoice.add("4");
            EraserChoice.add("5");
            EraserChoice.addItemListener(this);
            
            toolPanel = new Panel();
            clear = new Button("清除");
            eraser = new Button("橡皮");
            pen = new Button("画笔");
            drLine = new Button("画直线");
            drCircle = new Button("画圆形");
            drRect = new Button("画矩形");
            colchooser = new Button("显示调色板");
            
            //各组件事件监听
            clear.addActionListener(this);
            eraser.addActionListener(this);
            pen.addActionListener(this);
            drLine.addActionListener(this);
            drCircle.addActionListener(this);
            drRect.addActionListener(this);
            colchooser.addActionListener(this);
            颜色 = new Label("画笔颜色",Label.CENTER);
            大小B = new Label("画笔大小",Label.CENTER);
            大小E = new Label("橡皮大小",Label.CENTER);
            //面板添加组件
            toolPanel.add(pen);
            toolPanel.add(drLine);
            toolPanel.add(drCircle);
            toolPanel.add(drRect);
            toolPanel.add(颜色); toolPanel.add(ColChoice);
            toolPanel.add(大小B); toolPanel.add(SizeChoice);
            toolPanel.add(colchooser);
            toolPanel.add(eraser);
            toolPanel.add(大小E); toolPanel.add(EraserChoice);
            toolPanel.add(clear);
            //工具面板到APPLET面板
            add(toolPanel,BorderLayout.NORTH);
            setBounds(60,60,800,650);
            setVisible(true);
            validate();
            
            //dialog for save and load
            addWindowListener(new WindowAdapter()
            {
                  public void windowClosing(WindowEvent e)
                   { System.exit(0);}
            });
      }
      
     public void paint(Graphics g)
     {
          Graphics2D g2d = (Graphics2D)g;
          Point p1,p2;
        n = paintInfo.size();
        if(toolFlag==2)
           g.clearRect(0,0,getSize().width,getSize().height);//清除
           
          switch(type)
          {
               case 3:
          Line2D line = new Line2D.Double(xx0,yy0,xx1,yy1);
          g2d.draw(line);
          break;
               case 4:
          Ellipse2D ellipse1 = new Ellipse2D.Double(xx0, yy0, Math.abs(xx1-xx0) ,Math.abs(yy1-yy0));
          g2d.draw(ellipse1);
          break;
               case 5:
          Rectangle2D rect1 = new Rectangle2D.Double(xx0, yy0, Math.abs(xx1-xx0) , Math.abs(yy1-yy0));
          g2d.draw(rect1);
          break;
          default :break;
          }
          
       for(int i=0; i<n-1; i++)
       {
                  p1 = (Point)paintInfo.elementAt(i);
                  p2 = (Point)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 :break;
                         }//end switch
                   }//end if
             }//end for
     }
     public void itemStateChanged(ItemEvent e)
     {
            if(e.getSource()==ColChoice)//预选颜色
            {
                  String name = ColChoice.getSelectedItem();
                  if(name=="黑色")
              { c = new Color(0,0,0); }
                  else if(name=="红色")
              { c = new Color(255,0,0); }
                  else if(name=="绿色")
              { c = new Color(0,255,0); }
                  else if(name=="蓝色")
              { c = new Color(0,0,255); }
            }
            else if(e.getSource()==SizeChoice)//画笔大小
             {
                  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);
              }
            }
            else if(e.getSource()==EraserChoice)//橡皮大小
            {
                  String Esize = EraserChoice.getSelectedItem();
                  if(Esize=="2")
                  { Econ = 3*3; }
                  else if(Esize=="3")
                  { Econ = 4*4; }
                  else if(Esize=="4")
                  { Econ = 5*5; }
                  else if(Esize=="5")
                  { Econ = 6*6; }
           }
     }
     
     public void mouseDragged(MouseEvent e)
     {
           xx1 = (int)e.getX();
           yy1 = (int)e.getY();
            Point p1 ;
            switch(toolFlag){
                  case 0://画笔
               x = (int)e.getX();
               y = (int)e.getY();
               p1 = new Point(x, y, c, toolFlag, con);
               paintInfo.addElement(p1);
               repaint();
               break;
               
                  case 1://橡皮
               x = (int)e.getX();
               y = (int)e.getY();
               p1 = new Point(x, y, null, toolFlag, Econ);
               paintInfo.addElement(p1);
               repaint();
               break;
               case 3:

               case 4:
               case 5:
               repaint();
               break;
               
                  default :
            }
//repaint();
     }
     public void mousePressed(MouseEvent e)
     {
          xx0= (int)e.getX();
          yy0= (int)e.getY();
            Point p2;
             switch(toolFlag){
                  case 3://直线
               type=3;
               x = (int)e.getX();
               y = (int)e.getY();
               p2 = new Point(x, y, c, toolFlag, con);
               paintInfo.addElement(p2);
               break;
               
                  case 4: //圆
               type=4;
               x = (int)e.getX();
               y = (int)e.getY();
               p2 = new Point(x, y, c, toolFlag, con);
               paintInfo.addElement(p2);
               break;
               
                  case 5: //矩形
               type=5;
               x = (int)e.getX();
               y = (int)e.getY();
               p2 = new Point(x, y, c, toolFlag, con);
               paintInfo.addElement(p2);
               break;
               
                  default :type=6;
            }
     }
     
     public void mouseReleased(MouseEvent e)
     {
            Point p3;
             switch(toolFlag){
                  case 0: //画笔
               paintInfo.addElement(cutflag);
               break;
                  case 1: //eraser
               paintInfo.addElement(cutflag);
               break;
                  case 3: //直线
               x = (int)e.getX();
               y = (int)e.getY();
               p3 = new Point(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 Point(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 Point(x, y, c, toolFlag, con);
               paintInfo.addElement(p3);
               paintInfo.addElement(cutflag);
               repaint();
               break;
                  default:
            }
     }
     public void mouseEntered(MouseEvent e){}
     public void mouseExited(MouseEvent e){}
     public void mouseClicked(MouseEvent e){}
     public void mouseMoved(MouseEvent e){}
     public void actionPerformed(ActionEvent e)
     {
            if(e.getSource()==pen)//画笔
            { toolFlag = 0; }
            if(e.getSource()==eraser)//橡皮
            { toolFlag = 1; }
            if(e.getSource()==clear)//清除
            {
                  toolFlag = 2;
                  paintInfo.removeAllElements();
                  repaint();
            }
            if(e.getSource()==drLine)//画线
            { toolFlag = 3; }
            if(e.getSource()==drCircle)//画圆
            { toolFlag = 4; }
            if(e.getSource()==drRect)//画矩形
            { toolFlag = 5; }
            if(e.getSource()==colchooser)//调色板
            {
                  Color newColor = JColorChooser.showDialog(this,"调色板",c);
                  c = newColor;}
            }
     }//end

public class houyang
{
      public static void main (String args[])
      {
            new paintboard("画图程序");
       }
}
/*
*javac -Xlint:unchecked houyang.java
*
houyang.java:270: 警告:[unchecked] 对作为普通类型 java.util.Vector 的成员的 add
Element(E) 的调用未经检查
                paintInfo.addElement(p1);
                                    ^
13 警告
*/

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 画板UI设计(总体布局) (1)创建窗体并设置相关属性; (2)给整个窗体添加一个中间容器用来覆盖整个窗体; (3)设置边框布局,因为整个画板大致为左边部分,中间部分,菜单栏三个部分,用边框布局比较合适; (4)给窗体添加左面板,中间面板; (5)给左面板添加按钮,并设置按钮图片和效果; (6)给左面板添加左子面板,用来存放颜色按钮; 2.画板功能设计 (1)给左画板中的按钮组中的每个按钮添加鼠标监听器; (2)点击不同按钮,绘制不同的图形; (3)给左子面板中的每个颜色按钮添加鼠标监听器; (4)根据下面板中选中的颜色按钮,来获取按钮的背景颜色,并将该颜色设置成画笔的颜色; (5)铅笔功能 1、铅笔是鼠标拖动时画的线,所需要实现鼠标移动监听器,我们采用一个类来实现多个接口; 2、添加新的鼠标监听器类; 3、在鼠标移动时间中实现画笔的逻辑(其实就是绘制直线,鼠标每移动一个像素,就会触发移动事件,通过移动事件获取鼠标的坐标,与上一次移动的坐标连线就可以了; (6)刷子功能 刷子其实就是加粗的画笔,画出来的直线更粗,这里需要用到Graphic2D画笔来设置画笔粗细。 (7)橡皮擦功能 橡皮擦就是把画笔颜色设置成相同的背景颜色就可以了,拖动鼠标时进行擦除,所以在鼠标拖动事件中编写。 (8)喷桶功能 1、定位方法:鼠标拖动事件实现; 2、随机数生成:Random; 3、实现原理,在鼠标拖动附近绘制很多的原点; 3. 画板的保存和重绘的设计 (1)给我们的画板添加菜单条、菜单以及菜单项 (2)给每个菜单项添加监听器 (3)点击不同的菜单项实现相应的功能 (4)图形保存功能:利用对象输出流,将容器对象写入文件; (5)打开图形功能:利用对象输入流,将容器对象读入,然后将容器里面的图形对象在画板上绘制出来 (6)新建文件功能:新建文件,将画板上绘制的内容清空(清空之前可以确认是否需要进行保存)清屏(重绘)功能依次方法; (7)文件保存格式为BMP格式; (8)文字功能:读取文本框中的文本并打印到屏幕鼠标的相应的响应位置,传入输入的文字大小的参数,以此来改变文字的大小; 4.弹泡泡功能的设计 根据Java多线程来实现弹泡泡功能;泡泡的位置颜色随机出现,并且做到碰到边框会变色;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值