Java画布:直线三角形,矩形,椭圆等

刚刚开始学习做画布,大概模板参照电脑自带的画图软件来写
这就是电脑的画图界面

我们看到,首先是要有一个界面,作为画板;
然后就会有各式各样的按钮,本次主要讲添加形状按钮与换画笔颜色的按钮。

上一个做界面的我们大概都知道了,这一次我们没有复选框文本框,就是一个简单的画面,选择他的框的长宽,然后,流式布局。界面的代码,参照上个博客就好。
所以本次我们的任务分为几个步骤完成:
1.创建窗体(咱们的画布);
根据我们的需要添加三角形,直线,矩形,椭圆,多边形,三角形,画笔颜色,我这里有两种黑色和红色,7个按钮。
2.在画布上获取画笔

Graphics g = jf.getGraphics();

其中jf是界面的对象名
3.监听鼠标,并将画笔传到鼠标监听器去

DrawMouse mouse = new DrawMouse();
jf.addMouseListener(mouse);
mouse.setGr(g);
在监听器里,有
 public void setGr(Graphics g){
  gr = g;
 }

4.开始写监听的类,即DrawMouse,而按钮鼠标监听都是接口类,当我们继承之后,需要重写里面的所有方法。
对于鼠标类来说,有四个,包括按下,点击,进入,释放,而按钮就是一个方法,按下之后要执行的动作。
我们可以获取到画笔在画布的坐标,然后,通过画直线的方法去将两点坐标画出来。

         if("直线".equals(name))
         {
          gr.drawLine(x1, y1, x2, y2);
         }

当按下的按钮上是直线的时候,那么就用画直线的方法;
同理,画其他;

         if("矩形".equals(name))
         {
          gr.drawRect(Math.min(x1, x2),Math.min(y1, y2), Math.abs(x2-x1),Math.abs(y2-y1));
         }
         if("椭圆".equals(name))
         {
          gr.drawOval(Math.min(x1, x2),Math.min(y1, y2), Math.abs(x2-x1),Math.abs(y2-y1));
         }

而画三角形的时候,需要先画一条直线,然后点击某一点就将另外两条线连起来,这个时候,我用的方法就是,首先画一根线,就会进入一次按下的操作,当按下是一次的时候,我连的是一个直线,当按下并且分别保存此时的按下与释放的坐标值,当第二次按下的时候,用此时的按下坐标与前一次按下与释放的坐标相连。

画多边形的时候,主要解决的就是最后双击,让多边形实现闭合。(画多边形可以参照电脑自带画图软件的步骤)
这个时候,我们可以设置一个标志位flag=1,最后双击的时候,flag=2
具体还是看一下代码:

    public void mouseClicked(MouseEvent e)
    {
     x3=e.getX();
     y3=e.getY();
     if("多边形".equals(name)&&flag==2&&e.getClickCount()==1)
     {
      gr.drawLine(x2, y2, x3, y3);
      x2=x3;
      y2=y3;
     }
     if("多边形".equals(name)&&e.getClickCount()==2)
     {
      gr.drawLine(x1, y1, x3, y3);
      flag=1;
     }
    }
    这是在释放方法里的
         if("多边形".equals(name))
         {
          if(flag==1)
          {
           gr.drawLine(x1, y1, x2, y2);
           flag=2;
          }
         }

最后,就是画笔颜色了,同样的在按钮上先颜色的名字

 public void actionPerformed(ActionEvent e) {
  name=e.getActionCommand();
  System.out.println(name);
  if("红色".equals(name))
   gr.setColor(Color.RED);
  if("黑色".equals(name))
   gr.setColor(Color.BLACK);
 }

颜色是可以直接获取的,因为Color类里面的颜色都是静态变量,可以直接用类.颜色名就可以了。
最后来一个图
在这里插入图片描述
好啦!
如果想知道按钮上没有名字,也可以画图换颜色,请看后面。

好的,以下是使用命令模式设计的Java程序: 首先,我们需要定义一个抽象命令类`Command`,它包含了撤销和恢复操作的方法: ```java public abstract class Command { public abstract void execute(); public abstract void undo(); public abstract void redo(); } ``` 然后,我们需要定义具体的命令类,例如绘制矩形命令类`DrawRectangleCommand`,它继承自`Command`类,实现了`execute()`、`undo()`和`redo()`方法,来实现矩形绘制、撤销和恢复操作: ```java public class DrawRectangleCommand extends Command { private Rectangle rectangle; private DrawCanvas drawCanvas; public DrawRectangleCommand(Rectangle rectangle, DrawCanvas drawCanvas) { this.rectangle = rectangle; this.drawCanvas = drawCanvas; } @Override public void execute() { drawCanvas.addShape(rectangle); } @Override public void undo() { drawCanvas.removeShape(rectangle); } @Override public void redo() { drawCanvas.addShape(rectangle); } } ``` 同样的,我们也可以定义绘制椭圆命令类`DrawOvalCommand`、绘制三角形命令类`DrawTriangleCommand`,它们的实现与绘制矩形命令类类似。 接着,我们定义一个请求者类`Invoker`,它包含了一个命令列表和一个撤销和恢复的指针: ```java public class Invoker { private List<Command> commandList = new ArrayList<>(); private int undoPointer = -1; public void executeCommand(Command command) { command.execute(); commandList.add(command); undoPointer++; } public void undo() { if (undoPointer >= 0) { Command command = commandList.get(undoPointer); command.undo(); undoPointer--; } } public void redo() { if (undoPointer < commandList.size() - 1) { undoPointer++; Command command = commandList.get(undoPointer); command.redo(); } } } ``` 最后,我们定义一个绘制画布类`DrawCanvas`,它包含了所有绘制的图形,以及一个请求者实例,用于执行绘制命令: ```java public class DrawCanvas { private List<Shape> shapeList = new ArrayList<>(); private Invoker invoker = new Invoker(); public void addShape(Shape shape) { invoker.executeCommand(new DrawShapeCommand(shape, this)); } public void removeShape(Shape shape) { invoker.executeCommand(new EraseShapeCommand(shape, this)); } public void undo() { invoker.undo(); } public void redo() { invoker.redo(); } public void paint(Graphics g) { for (Shape shape : shapeList) { shape.draw(g); } } } ``` 在程序中,我们可以通过调用`DrawCanvas`的`addShape()`方法添加图形,`removeShape()`方法删除图形,`undo()`方法撤销上一步操作,`redo()`方法恢复上一步撤销的操作。 这样,我们就可以通过命令模式来实现一个简单的图形绘制系统,支持撤销和恢复操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值