功能分析
- 用鼠标拖动在界面中画出任意大小的矩形和圆形
- 在输入框中输入边数利用鼠标点击画出多边形
- 画出多边形的外轮廓
- 通过按钮实现功能切换
功能实现
界面与鼠标相应
- 生成界面以及添加组件的方法请参考我的另一篇博客吧(^ v ^)
https://blog.youkuaiyun.com/G_Y_Chen/article/details/121119768
- 鼠标响应与按键响应的配置是类似的:
- 实例鼠标监听器接口
- 界面添加鼠标监听器
当然二者也是有不同的,关于按键的接口只有一个,鼠标响应的接口有两个:
- MouseListener
这个接口处理的是鼠标点击相关的行为,其包括5个方法:
mouseClicked鼠标点击(按下+抬起)、mousePressed鼠标按下、mouseReleased鼠标抬起、mouseEntered鼠标进入界面、mouseExited鼠标离开界面 - 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画直线。
图形外轮廓
- 算法概括
- 计算图形重心
- 视重心为坐标轴原点,建立坐标系。将图形的坐标点分为四个象限如图:
- 对各象限的坐标点进行排序,本案例使用各点的X轴坐标进行排序,第一第二象限是降序排列,第三第四象限是升序排列,这样图形坐标点就实现了逆时针排序
- 根据重排列的数组重新画出图形的轮廓
总体展示
- 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, MouseMotionListener{
int x1,y1