画图板及重绘_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 画图板及重绘

画图板及重绘

 2013/10/19 15:47:30  zlele  程序员俱乐部  我要评论(0)
  • 摘要:一.简单画图板1.首先是一个简单的可以画直线的画图板需要用到监听器和画布新组件:靠鼠标的移动产生直线:MouseListener需要在画布上作图:Graphics关键字:this用于在构造方法中引用满足指定参数类型的构造器,但只能引用一个构造方法且必须位于开始2.鼠标监听器:Mouse1类://定义一个Mouse1类实现鼠标监听器中的抽象方法publicclassMouse1implementsMouseListener,MouseMotionListener{//因为和主函数中的画板联系
  • 标签:画图 重绘
一.简单画图
1.首先是一个简单的可以画直线的画图板需要用到监听器和画布
  新组件:
  靠鼠标的移动产生直线:MouseListener
  需要在画布上作图:Graphics
  关键字:this用于在构造方法中引用满足指定参数类型的构造器,但只能引用一个构造方法且必须位于开始
2. 鼠标监听器:
Mouse1类:
 
class="java"> //定义一个Mouse1类实现鼠标监听器中的抽象方法
   public class Mouse1 implements MouseListener,MouseMotionListener{
   //因为和主函数中的画板联系,所以不可用Graphics g=new Graphics();
   private Graphics g;
   int x1,y1,x2,y2;
   //传参:需要在画布上画线,所以需要传参
   public Mouse1(Graphics g){
   this.g=g;
   }
   //鼠标被按下时
   public void mousePressed(MouseEvent e){
   x1=e.getX();//得到第一个点的横坐标
   y1=e.getY();//得到第一个点的纵坐标
   }
   //鼠标拖动,产生边画边现实的效果,因为要擦去拖动过程产生的线,所以要用背景色重绘一遍
  //利用临时变量储存终点
private int  tempx=0,tempy=0;
public void mouseDragged(MouseEvent e){
   x2=e.getX();//得到第二个点的横坐标
   y2=e.getY();//得到第二个点的纵坐标
   //画直线
   g.drawLine(x1, y1, x2, y2);
//利用临时变量绘制背景线,详细代码与画彩线类似
	tempx=shape.x2;
                tempy=shape.y2;

 }
   //鼠标被释放后
   public void mouseReleased(MouseEvent e){
}

                
主函数:
 
(画布位于窗体上方,需申请得到)
   //申请得到画布
   Graphics gr=jf2.getGraphics();
   //声明鼠标监听器
   Mouse1 mouse1=new Mouse1(gr);
   //添加鼠标监听器
   jf2.addMouseListener(mouse1);
  jf2.addMouseMotionListener(mouse1);
二.可以选择图形的画板
1.新组件
           动作监听器:ActionListener
           颜色选项:Color c=new Color(66,6,2);
           数学函数:如x3=Math.min(x1, x2);//x1,x2的最小值
2.通过选择不同的按钮画出不同的形状:动作监听器
ActionChoose类:
 
  //通过ActionChoose实现动作监听器
    public class ActionChoose implements ActionListener{
   //通过按钮的不同来得到不同的画图标识
   private String command;
   //用getCommand方法得到类型
   public String getCommand()
   {
    return command;
   }
   public void actionPerformed(ActionEvent e){
   //根据不同的按钮类型赋给command不同的值进行画线的判断
   if(e.getActionCommand().equals("直线"))
   {
    command = "line";
   }
 ````
    }
 }
主函数:
  
 //声明动作选择监听器
    ActionChoose acc=new ActionChoose();
    //设置图形按钮
    JRadioButton line=new JRadioButton("直线");
    //添加监听器
    line.addActionListener(acc);
    //在Mouse1中需要根据ActionChoose的选择进行判断所画图形形状 
    Mouse1 mouse1=new Mouse1(gr,acc);
Mouse1类:
  
 public class Mouse1 implements MouseListener{
    private Graphics g;
    private ActionChoose ac;
    int x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x7,y7;
    //传参
    public Mouse1(Graphics g,ActionChoose ac){
   this.g=g;
   this.ac = ac;
   }
   //根据加到按钮监听器对象得到选择按钮的类型进行判断画图
   String nValue = ac.getCommand();
   //直线
   if(nValue.equals("line"))
   g.drawLine(x1, y1, x2, y2);
                 }
三.关于画图
    扩展思维
    ·线可以组成三角形,箭头等;
    ·多个平面图形的重复累加可形成立体图形;
    ·多个线条可形成立体图形;
    ·通过对图形颜色的控制可以画出立体效果;
四.关于画图板的重绘
    在改变窗体大小或移动除桌面时,图形会消失。这是因为所绘图形保存在缓存而不是内存中,所以,改变窗体后,只显示窗体,不显示图形。在JFrame中,有paint方法,系统会自动调用,因此,如果想重绘图形,则要重写paint方法,是指可以画出之前的图形,即遍历所画图形。利用队列保存图形,再利用paint重绘。
//注意写在JFrame中
public void paint(Graphics g){
         //重写窗体,否则不显示窗体
		super.paint(g);
		for(int i=0;i<shapelist1.size();i++){
			Shape shape=shapelist1.get(i);
			g.getColor();
			shape.draw(g);
		}
//每放开鼠标一次,保存一次
public void mouseReleased(MouseEvent e){
                //要在内部定义,否则只保存最后一个图形
                     Shape shape = new Shape();
		shape.x1=x1;	    	
		shape.y1=y1;
	    	shape.x2=e.getX();
	    	shape.y2=e.getY();
	    	shape.color = jcc.getColor();
	    	shape.type=nValue;
	    	//保存图形
		 shapelist.add(shape);
	 }
  • 大小: 44.1 KB
  • 查看图片附件
发表评论
用户名: 匿名