新浪博客

我的java学习003-鼠标点击生成一个圆

2019-03-22 09:48阅读:
Java鼠标点击绘制圆
需求:当鼠标点击界面某处的时候,会在以点击处为圆心的地方绘制一个圆
在我成功地完成这个需求之后,我才发现这是一个特别简单的事情。可是,作为一个初学者,我还是被困住了很久,百度了很久。这也让我认识到,的确要多思考,多摸索。
废话不说了,开始。
首先是分析:这玩意要用到什么功能。
第一步,要画一个窗体。
我们就先画一个600*600的窗体吧!先创建一个JFrame全局变量,然后在构造函数中对窗体进行属性的设置,在Main函数中new一下构造函数。

package test01;

import javax.swing.JFrame;


public class
DrawCircle {
private JFrame jFrame=new JFrame('鼠标点击绘制圆');

public DrawCircle(){
jFrame.setSize(600 , 600);
jFrame.setLocationRelativeTo(null);
jFrame.setLayout(null);// 默认布局
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}




public static void main(String[] args) {
// TODO Auto-generated method stub
new DrawCircle();
}

}
界面如下:
我的java学习003-鼠标点击生成一个圆
现在我们已经画出界面了,现在就要为窗体添加点击事件。
第二步,为窗体添加点击事件。
有两种方法:
1. 让类继承MouserLister借口
2. 在类中New一个MouseLister接口,并实现接口中的方法。
这里为了简单,选择第一种。
在类名后加上implements MouseListener,这时候Eclipse会报错,因为类还没有实现接口中的方法。利用IDE的帮助功能,IDE会补全并产生以下几个还没有实现的方法体。
void mouseClicked(MouseEvent e)
在组件上单击(按下并释放)鼠标按钮时调用。
void mouseEntered(MouseEvent e)
当鼠标进入组件时调用。
void mouseExited(MouseEvent e)
当鼠标退出组件时调用。
void mousePressed(MouseEvent e)
在组件上按下鼠标按钮时调用。
void mouseReleased(MouseEvent e)
在组件上释放鼠标按钮时调用。
这里我选择了mousePressed方法,其实mouseClicked方法也是可以的,但我觉得后者不太灵活。
我们可以再该方法体中写上测试
int x=e.getX();
int y=e.getY();
System.out.println('x='+x+';y='+y);
但这时候点击却并没有效果,这是为什么呢?
原来我们要在构造函数中加上一句话:
jFrame.addMouseListener(this);
这样就能给窗体添加一个监听了
我的java学习003-鼠标点击生成一个圆
点击窗体时,控制台输出了位置的坐标,说明这是正确的。
第三步,在点击处画圆。
当我们通过点击事件获取到点击处的坐标的时候,我们可能会想,是否会有一个方法存在,直接在以坐标处为中心的地方画圆呢?实际上是有的,这个方法就是Graphics类中的方法。实际上,Graphics中有很多的方法可以绘制图像。但是似乎没有直接绘制圆的方法。
但是,有两个方法可以绘制椭圆。我们不难想到,如果绘制一个长宽相同的椭圆,那不就是圆了么?
这两个方法是:
drawOval(int x, int y, int width, int height)
绘制椭圆形轮廓。
fillOval(int x, int y, int width, int height)
用当前颜色填充由指定矩形界定的椭圆。
我们选择第二种,因为我想画一个填充了颜色的圆。
那么,究竟是如何绘制呢?
首先,我们在刚才点击事件中继续写代码。
我们已经获得了点击处的坐标位置。现在我们设置变量r=50;作为圆的半径。也许我们想,是不是可以直接使用fillOval(x,y,r,r);这行语句?当然是不行的了。因为它是Graphics类的方法,所以我们应该先获得一个类的对象。
其实,Jframe类有一个方法名叫getGraphics() ,解决了我们的难题。
我们先获得窗体的Graphics对象,再去使用该对象的fillOval方法即可
Graphics g=jFrame.getGraphics();
g.fillOval(x,y,r,r);
我们在画圆之前可以把颜色改成绿色。
g.setColor(Color.green);
这样就能在我们点击处画出圆了。

但是,我们似乎发现,这个圆并不是我们预期的圆,它的位置和大小都不太对劲。
原来画圆的函数,其参数是这样的:
fillOval(int x, int y, int width, int height)
x:横坐标;y:纵坐标;width:宽度;height:高度
我的java学习003-鼠标点击生成一个圆
所以绘图的那一句代码应改为:
g.fillOval(x-r,y-r,2*r,2*r);
这样就能获得正确的图形了。
我的java学习003-鼠标点击生成一个圆
这样就能获得正确的图形了。
完整源码展示:

package test01;

import java.awt.Color;
import java.awt.Graphics;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;

import javax.swing.JFrame;


public class DrawCircle implements MouseListener{
private JFrame jFrame=new JFrame('鼠标点击绘制圆');

public DrawCircle(){
jFrame.setSize(600 , 600);
jFrame.setLocationRelativeTo(null);
jFrame.setLayout(null);// 默认布局
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.addMouseListener(this);
jFrame.setVisible(true);
}




public static void main(String[]

我的更多文章

下载客户端阅读体验更佳

APP专享