JAVA画图板的第一步——Graphics
本次我们试着在窗体上画一条线,鼠标按住的时候起,鼠标松开的时候止;
首先当然是构建一个showUI函数创建一个窗体,在窗体上我们才可以进行下面的操作
JFrame line = new JFrame();
//设置窗体属性
line.setSize(1200, 800);
line.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体可见
line.setVisible(true);
由于这个事件是有关于鼠标的位置,归属于鼠标事件,因此我们创建一个监听器,是MouseListener的一个接口
public class mouse implements MouseListener
由于接口中的方法都是抽象方法,我们需要在这个类中重新定义MouseListener接口内的所有方法
//showUI函数
//设置监听器类
mouse m = new mouse();
//给窗体设置监听器
line.addMouseListener(m);
//监听器
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
这样的话我们就实现了鼠标事件的应用
再想想:我们画线要分几步?
首先是按住的时候给个坐标(x1,y1)
然后松开的时候给个坐标(x2,y2)
再根据这个坐标把线画出来,大功告成
因此,我们首先要在监听器设置坐标值的数据
int x1,x2,y1,y2;
mousePressed函数中返回起始坐标值
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}
mouseRelease函数中返回结束坐标值
public void mouseReleased(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
}
下面是画线!!!!
画线我们需要使用的就是我们这次的重点:Graphics
Graphics是一个可以用来画一些简单图形的类
Graphics是一个抽象类,我们同样不能在监听器类中直接new一个对象
那该怎么办呢?
想到了!
在我们的showUI方法中new一个然后搞回去就成了!
那就得在showUI函数中开一个Graphics的对象
特别:这里我们不需要创建画布,因为窗体的组件都有一个getGraphics函数返回这个组件的画布
//showUI函数
//设置graphics类
Graphics g = line.getGraphics();
//传入g
m.setG(g);
然后在监听器设置一个Graphics类型的引用,并将传入的画布给赋到这个引用上
//监听器类
Graphics g;
public void setG(Graphics g){
this.g = g;
}
最后,在mouseRelease函数中将这个线画出来
这里我们需要调用Graphics类中的drawLine方法
参数是前两个是起点坐标值,后两个是终点坐标值
g.drawLine(x1, y1, x2, y2);
最后就是惊喜刺激的跑程序时间!
Graphics类中还有许多相关的函数,例如画矩形的drawRect,画椭圆的drawOval等;
附代码:
lineUI.java
import java.awt.Graphics;
import java.util.Random;
import javax.sound.sampled.Line;
import javax.swing.JFrame;
public class LineUI {
Random random = new Random();
public void showUI(){
//设置窗体
JFrame line = new JFrame();
//设置窗体属性
line.setSize(1200, 800);
line.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置监听器类
mouse m = new mouse();
//给窗体设置监听器
line.addMouseListener(m);
//设置窗体可见
line.setVisible(true);
//设置graphics类
Graphics g = line.getGraphics();
//传入g
m.setG(g);
}
public static void main(String[] args){
LineUI g = new LineUI();
g.showUI();
}
}
mouse.java
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
public class mouse implements MouseListener{
int x1,x2,y1,y2;
Graphics g;
public void setG(Graphics g){
this.g = g;
}
@Override
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}
}
public void mouseReleased(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
g.drawLine(x1, y1, x2, y2);
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
还有一个小问题:三角分形
利用Graphics,我们可以先选择三个点A,B,C,然后再选择一个随机点P,让这个点随机和A,B,C相连取中点记为新的P,重复操作
代码:
public void mousePressed(MouseEvent e) {
point[count][0] = e.getX();
point[count][1] = e.getY();
count++;
if(count==4){
for(int i = 0;i < 100000000;i++){
int nowpoint=random.nextInt(4);
int x =(point[nowpoint][0] + point[3][0]) / 2;
int y =(point[nowpoint][1] + point[3][1]) / 2;
point[3][0] = x;
point[3][1] = y;
g.drawOval(x, y, 0, 0);
}
}
}
最后会出现这样的图像
重复10000次
重复1000000次
重复100000000次
本期over!