Java基础入门(awt&swing实现图形绘制)

功能分析

  1. 鼠标拖动在界面中画出任意大小的矩形和圆形
  2. 在输入框中输入边数利用鼠标点击画出多边形
  3. 画出多边形的外轮廓
  4. 通过按钮实现功能切换

功能实现

界面与鼠标相应

  • 生成界面以及添加组件的方法请参考我的另一篇博客吧(^ v ^)

https://blog.csdn.net/G_Y_Chen/article/details/121119768

  • 鼠标响应与按键响应的配置是类似的:
  1. 实例鼠标监听器接口
  2. 界面添加鼠标监听器

当然二者也是有不同的,关于按键的接口只有一个,鼠标响应的接口有两个:

  1. MouseListener
    这个接口处理的是鼠标点击相关的行为,其包括5个方法:
    mouseClicked鼠标点击(按下+抬起)、mousePressed鼠标按下、mouseReleased鼠标抬起、mouseEntered鼠标进入界面、mouseExited鼠标离开界面
  2. MouseMotionListener
    这个接口处理的是鼠标的移动相关的行为,其包括2个方法:
    mouseDragged鼠标拖动、mouseMoved鼠标移动

上述方法也获取一个鼠标对象MouseEvent e,可以通过e.getX()、e.getY()获取鼠标执行对应操作时的坐标。

本案例使用了mousePressed、mouseReleased两个方法实现图形的坐标点记,按压鼠标记录第一个点,松开鼠标记录第二个点。

图形绘制

Java实现图形渲染需要使用Graphics类。Graphics类实例化对象不能用new,需要通过界面对象调用getGraphics()方法获得Graphics对象。

JFrame jf = new JFrame("图形绘制");
Graphics g =  jf.getGraphics ();

Graphics对象能实现图形绘制如:g.drawRect画矩形、g.drawOval画圆形、g.drawLine画直线。

图形外轮廓

  • 算法概括
  1. 计算图形重心
  2. 视重心为坐标轴原点,建立坐标系。将图形的坐标点分为四个象限如图:
    坐标系示意图
  3. 对各象限的坐标点进行排序,本案例使用各点的X轴坐标进行排序,第一第二象限是降序排列,第三第四象限是升序排列,这样图形坐标点就实现了逆时针排序
  4. 根据重排列的数组重新画出图形的轮廓

总体展示

总体展示

  • UI设计
package draw;

import javax.swing.*;
import java.awt.*;

public class DrawUI {
   
    public void initUI(){
   
        JFrame jf = new JFrame("图形绘制");
        jf.setSize(1000,1000);
        jf.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);// 关闭选项- 退出
        jf.setLayout(new FlowLayout());
        jf.setResizable (false);// 不能最大化 改变尺寸

        DrawListener DrawListener = new DrawListener();

        JButton bt_Rect = new JButton("方形");
        JButton bt_Ovel = new JButton("圆形");
        JButton bt_RectTen = new JButton("多边形");
        JButton bt_Outline = new JButton("构建外轮廓");

        JLabel shapein = new JLabel("边数:");
        JTextField namein = new JTextField();

        Dimension dim = new Dimension(50, 30);
        namein.setPreferredSize(dim);

        jf.add(bt_Rect);
        jf.add(bt_Ovel);
        jf.add(bt_RectTen);
        jf.add(shapein);
        jf.add(namein);
        jf.add(bt_Outline);

        jf.setVisible(true);
        jf.addMouseListener (DrawListener);
        jf.addMouseMotionListener(DrawListener);
        Graphics g =  jf.getGraphics ();
        DrawListener.setG(g);
        bt_Rect.addActionListener(DrawListener);
        bt_Ovel.addActionListener(DrawListener);
        bt_RectTen.addActionListener(DrawListener);
        bt_Outline.addActionListener(DrawListener);

        DrawListener.setNamein(namein);
    }

    public static void main(String[] args) {
   
        DrawUI drawui = new DrawUI();
        drawui.initUI();

    }
}
  • 鼠标与按键监听器
package draw;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Arrays;

public class DrawListener implements MouseListener, ActionListener, 
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G_Y_Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值