上一个文章已经讲了画直线,三角形,多边形,椭圆,矩形,还有加了两个带名字的颜色按钮。
那么这一个博客我们主要来看看,如何画不规则的图形以及拖动鼠标画直线,还有当按钮上没有名字了,我们该怎么去处理,另外还介绍如何做橡皮擦;
1.不规则的图形
之前我们做的都是有关直线的,现在我们想做任意的曲线,这个时候我们需要添加一个鼠标拖动监听器,因为可以继承多个接口,所以直接在一个类里继承。
同理,接口类的全部方法需要重写,不然会报错,我们发现MouseMotionListener类有两个方法,拖动与移动,拖动是按下鼠标挪动鼠标,移动松开鼠标挪动鼠标。同理我们也可以直接get,x,y,的坐标,是时时刻刻的反馈,所以,当我们画不规则图形的时候,可以把它想象成无线短的一个个线段的连接,所以我们需要保存前一个线段的末坐标。

if ("不规则".equals(name)) {
   x4 = e.getX();
   y4 = e.getY();
   gr.drawLine(x1, y1, x4, y4);
   x1 = x4;
   y1 = y4;
  }

2.画可拖动的直线

java swing画血条 java怎么画线_java

这是按照拖动轨迹不断画直线,但我们想要的只是一条最终释放开的直线,中间的过程可视但不可出现在最后,所以,我们对代码进行了改进,画一个白线覆盖之前的黑线。
PS:大家写东西的时候一定记得保存,我…一言难尽

if ("直线2".equals(name)) {
   gr.setColor(Color.WHITE);
   gr.drawLine(x1, y1, x4, y4);
   x4 = e.getX();
   y4 = e.getY();
   gr.setColor(color);
   gr.drawLine(x1, y1, x4, y4);
  }

画板的其他直线有明显的擦除效果,其实就是被白线覆盖了。

java swing画血条 java怎么画线_拖动鼠标监听器_02

3.做橡皮擦,上面作直线给我们很好的启发,所以我们首先做一个橡皮擦的按钮,然后根据拖动的特点,时时刻刻获得坐标,我们可以利用这一点画一个矩形,将需要擦除的覆盖掉。

if("橡皮擦".equals(name))
  {
   gr.setColor(Color.WHITE);
   gr.drawRect(x4, y4, 8, 8);
   x4 = e.getX();
   y4 = e.getY();
   gr.setColor(color);
   gr.drawRect(x4, y4, 8, 8);
  }

这个代码还有一个瑕疵的地方就是,最后还会遗留下来一个矩形,所以我们需要在释放的时候再次把这个矩形覆盖掉。

if("橡皮擦".equals(name))
  {
   x2 = e.getX();
   y2 = e.getY();
   gr.setColor(Color.WHITE);
   gr.drawRect(x2, y2, 8, 8);
  }

4.无名字的颜色按钮
首先我们可以换一下画板的背景颜色

jf.getContentPane().setBackground(Color.WHITE);

然后创建无颜色的按钮

javax.swing.JButton blackButton=new javax.swing.JButton();
  blackButton.setPreferredSize(new Dimension(40,30));
  jf.add(blackButton);
  blackButton.setBackground(Color.BLACK);
  javax.swing.JButton redButton=new javax.swing.JButton();
  redButton.setPreferredSize(new Dimension(40,30));
  jf.add(redButton);
  redButton.setBackground(Color.RED);

然后按钮是无法传到我们的监听器的,所以,我们需要在监听器里找到事件发生源,强制转换成按钮类型,然后获取事件源-按钮的背景色,从而改变画笔的颜色。
代码实在沾不上啦,下一个补上。