简单画板开发总结

虽然题目是简单画板,可是对于咱这个菜鸟来说就是一把辛酸泪啊,巴特,至于以下是不是荒唐言咱就,嘿嘿不好说了。

开发画板有三个基本点。
1.窗口界面。
  画板窗口包括四个主要部分。
  工具按钮面板颜色选择面板画布,以及菜单栏
这并不难,无非就是JButton和JPanel和JToolBar。
不过我被一个小小的问题难住了好久,就是设置按钮的大小。
只有JFrame可以用setSize,其他的容器统统只能用setPreferredZize,例如 

this.setPreferredSize(new Dimension(100,400)); 


但是想要给容器里的容器,恩简单来说,比如工具按钮是加在工具面板上的,这时想要设置工具按钮的大小,比如让它和贴图的大小一致,就会遇上问题。这时需要将布局设为流式布局!

         JToolBar jtb = new JToolBar("工具");
         jtb.setPreferredSize(new Dimension(90,250));
         jtb.setLayout(  new FlowLayout(FlowLayout.CENTER));
         this.add(jtb);

 不同容器默认的布局管理器是不一样的。可以使用这几行代码

public class Test {
public static void main(String[]args){
	System.out.println(new JToolBar().getLayout());
	System.out.println(new JFrame().getLayout());
	System.out.println(new JPanel().getLayout());
	System.out.println(new JButton().getLayout());
}
}

 

得到的是

javax.swing.JToolBar$DefaultToolBarLayout@2e7263
java.awt.BorderLayout[hgap=0,vgap=0]
java.awt.FlowLayout[hgap=5,vgap=5,align=center]
null

  
2.绘制图形

一个画图板至少可以绘制四种以上的图形,显然把这些图形的代码全部写在一起是不现实的,某人一开始就是写在一起,结果,出错的时候自己都不愿意看。

 

在画图的时候显然我们使用的是一个概念“画”!那么就可以直接定义一个有“画”这个方法的图形的抽象类,让其他的图形实现的类来继承它,

(为什么我们不使用接口要使用抽象类?因为画一个图形你起码得要四个以上的参数x1,x2,y1,y2才行,接口的属性可不能是它们!)

public abstract class Shape {
	private int x1,x2,y1,y2;
	private float size;
	private Color color;
	
	public abstract void draw(Graphics2D g);

}

 

Graphics里面有各种方法,drawLine,drawRect,drawOval...

关键就在于你怎么将得到的参数传进去,让它正确的画出你想要的图形。

直线不用说,最简单了!可是就是这最简单的直线是实现后面铅笔什么的基础。

这里举个矩形的例子,如果你只是简单的把 x1,x2,y1,y2传进去肯定是不行的。这是它自己的描述:

  public void drawRect(int x, int y, int width, int height) {
        if ((width < 0) || (height < 0)) {
            return;
        }

        if (height == 0 || width == 0) {
            drawLine(x, y, x + width, y + height);
        } else {
            drawLine(x, y, x + width - 1, y);
            drawLine(x + width, y, x + width, y + height - 1);
            drawLine(x + width, y + height, x + 1, y + height);
            drawLine(x, y + height, x, y + 1);
        }
    }

 

要传入的参数分别是最左上方那个点,以及它的长与宽。由于你画矩形的方向不一样,最左上角的点不一定是x1,y1,

此时可以写判断!

if(x2>x1&&y1>y2)
	      { g.drawRect(x1,y2,x2-x1,y1-y2);}
	      else if(x1>x2&&y1>y2)
           {g.drawRect(x2, y2, x1-x2, y1-y2);}
	      else if(x1>x2&&y2>y1){
	    	  g.drawRect(x2,y1,x1-x2,y2-y1);
	      }
	      else if(x2>x1&&y2>y1){
	    	  g.drawRect(x1,y1,x2-x1,y2-y1);
	      }

 这样写就有点纠结了,因为后面的画圆和圆角矩形都是类似矩形的传参。Java对椭圆的定义是填充一个矩形里的椭圆,穿的也是这个矩形的参数。

由于左上角的点永远是坐标最小的点,要想简化的话,所以可以用到Math这个包包里的东西

g.drawRect(Math.min(x1, x2),Math.min(y1, y2),Math.abs(x1-x2),Math.abs(y1-y2));

 在有就是铅笔(就是曲线)和橡皮了。看上去这两种工具都是随你的鼠标落点画线。换个角度看,这种曲线可以细分成无数条直线,简而言之就是在你的鼠标落点之间作线,只不过这些线无限短罢了。这样你只要吧得到的坐标传递一下,让你现在的落点,也就是上一条直线的终点变成下一条直线的起点!

那么橡皮功能就只要设置线条粗一点,颜色是白色(和画布颜色一致)就好了!

	x2 = e.getX();
		y2 = e.getY();

		command = tb.getCommand();
		Shape shape = new ImpLine(x1, y1, x2, y2, 1, color);
		if (command.equals("pencil")) {
			shape = new ImpLine(x1, y1, x2, y2, 1, color);
			
		} else if (command.equals("eraser")) {
			shape = new ImpLine(x1, y1, x2, y2, 10, Color.white);
			
		}
		shape.draw(g);
		x1 = x2;
		y1 = y2;

 

注意:这里得到坐标的是在mouseDragged()里面哦!

 

3.图形重绘

只要设置好监听,并重载构造方法传递参数,注意传参时最好传递不会改变的对象,比如JPanel类型的画布面板,再在传入后得到画布就好了,而不要直接传入画布。

 

那么基本的小画板就可以画画了,可是又有一个问题,当画布大小改变的时候,上面的东西全部没有啦!

为什么呢?因为你没用让他“记住”你画的图形!

 

为了让画板记住,要定义个队列的类,这个类里起码要有三种方法!加入(add()),得到(get()),长度(size())。以下是这个队列所继承的接口

public interface ListInterface<E> {
          public void add(E e);
          public E get(int index);
          public int size();

}

 

在画图形的监听器里面调用这个add()方法,把图形存进去。

 

此时工作完成了一半,还需要一个重绘的方法。

 //重绘的方法
   public void drawShape(Graphics2D g){

		   for(int i=0;i<shapeList.size();i++){
		   //取出
		   Shape sh =shapeList.get(i);
		   //重绘
		   sh.draw(g);
	   }
   }

 把存进去的图形依次取出来,再重新画出来。

 sh是Shape(画图形的抽象类)类型,draw()是该类里“画”的方法!

 

重绘的方法时写完了,谁来调用这个方法呢?每个容器里都自带了一个paint()方法!他是用来显示容器的,可以重写这个方法哦!这样在每一次显示容器的时候(改变大小)就可以重绘了。

   public void paint(Graphics g){
			   //调用父类的方法绘制正确的窗体
				   super.paint(g);
				   
			  //取出队列中存储的形状
				   drawShape((Graphics2D)g);
			   }

 

 

这个画板目前确实很简陋,很多功能都很蹩脚,不过总是会慢慢完善的啦!

 




有源代码哦!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值