思路:用监听器实现选择图片处理效果,首先需要写出界面,再在窗体中添加按钮,每个按钮对应着相应的分形,点击后得到下图;
我们以两个类DrawListener,ImageUI以及相应的方法来实现。
一、分类部分
ImageUI类,
1、成员变量
①监听器对象dl;
②按钮文本数组strs[]
2、成员方法
方法1、initUI 创建界面
方法2、addButton 添加按钮
方法3、主方法main
DrawListener类,需要继承重写鼠标监听器、动作监听器中的方法;
1、成员变量
①需要先定义x1,y1x2,y2,用于获取鼠标点击时与松开时的坐标;
②图像类对象g;
③按钮上的文本shapType,用于鼠标点击按钮后,切换到对应绘制方法;
2、 成员方法
方法1、actionPerformed (ActionListener里的方法)
方法2、mouseClicked (MouseListener里的方法)
方法3、mousePressed(MouseListener里的方法)
方法4、mouseReleased(MouseListener里的方法)
方法5、6、mouseEntered,mouseExited
方法7、分形图形一的绘制
方法8、分形图形二的绘制
方法9、分形图形三的绘制
二、处理效果
分形效果图一
分形效果图二
三、类代码
ImageUI类:
public class ImageUI {
1、成员变量
①监听器对象dl;
//添加监听器
DrawListener dl = new DrawListener();
②按钮文本数组strs[]
//按钮文本数组
String []strs= {"分形1","分形2","分形3"};
2、成员方法
方法1、initUI 创建界面
public void initUI() {
//创建界面对象
JFrame jf= new JFrame();
//设置标题
jf.setTitle("监听器处理分形效果");
//设置大小
jf.setSize(800,800);
//退出方式
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置可视化
jf.setVisible(true);
//流体界面
FlowLayout fl = new FlowLayout();
jf.setLayout(fl);
//添加按钮,循环添加,传入界面对象jf,监听器对象dl;
for(int i=0;i<strs.length;i++) {
addButton(strs[i],jf,dl);
}
//将点击的按钮反馈到监听器
jf.addMouseListener(dl);
Graphics g=jf.getGraphics();
//将图像对象传给监听器对象
dl.g=g;
}
方法2、addButton 添加按钮
//每个按钮有文本信息btnText,,界面对象jf,动作监听对象al;
public void addButton(String btnText,JFrame jf,ActionListener al) {
/* 创建按钮对象btn
* btn调用方法设置按钮文本
* 窗体界面对象添加按钮
* btn调用添加动作监听器方法
*/
JButton btn = new JButton();
btn.setText(btnText);
jf.add(btn);
btn.addActionListener(al);
}
方法3、主方法main
//主函数方法
public static void main(String[] args) {
ImageUI Imageui = new ImageUI();
Imageui.initUI();
}
DrawListener类,需要继承重写鼠标监听器、动作监听器中的方法;
public class DrawListener implements ActionListener,MouseListener{
1、成员变量
①需要先定义x1,y1x2,y2,用于获取鼠标点击时与松开时的坐标;
int x1,x2,y1,y2;
②图像类对象g;
Graphics g = null;
③按钮上的文本shapType,用于鼠标点击按钮后,切换到对应绘制方法;
String shapType="1"; //初始化为1
2、 成员方法
方法1、actionPerformed (ActionListener里的方法)
public void actionPerformed(ActionEvent e) {
String btnstr=e.getActionCommand();
shapType = btnstr;
}
方法2、mouseClicked
public void mouseClicked(MouseEvent e) {
int x=e.getX();
int y=e.getY();
}
方法3、mousePressed
public void mousePressed(MouseEvent e) {
x1=e.getX();
y1=e.getY();
}
方法4、mouseReleased
public void mouseReleased(MouseEvent e) { //松开处进行选择
x2=e.getX();
y2=e.getY();
if(shapType.equals("分形1")) {
draw_01(g); //调用分形的方法
}
else if(shapType.equals("分形2")) {
draw_02(g);
}
else if(shapType.equals("分形3")) {
draw_03(g,x2);
}
}
方法5、6、mouseEntered,mouseExited此处可以不用重写,将“;”改为“{}”即可
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
方法7、分形图形一的绘制draw_01
public void draw_01(Graphics g) {
double a=-1.7d, b=1.3d, c=-0.1d, d=-1.2 ;
double x=0d, y=0d;
g.fillRect(50,70,700,700);
for(int i=0;i<50000;i++) {
double tempx = Math.sin(a*y) + c*Math.cos(a*x);
double tempy = Math.sin(b*x) + d*Math.cos(b*y);
x = tempx;
y = tempy;
System.out.println("x= "+x);
System.out.println("y= "+y);
int px= (int)(tempx*120)+400;
int py= (int)(tempy*120)+400;
Color color =new Color (0,i%255,0);
g.setColor(color);
g.drawLine(px,py,px,py);
}
g.setColor(Color.white);
}
方法8、分形图形二的绘制draw_02
public void draw_02(Graphics g) {
double a=-1.7d, b=1.8d, c=-1.9d, d=-0.4;
double x=0d, y=0d;
g.fillRect(50,70,700,700);
for(int i=0; i<50000; i++) {
double tempx = Math.sin(a*y) + c*Math.cos(a*x);
double tempy = Math.sin(b*x) + d*Math.cos(b*y);
x = tempx;
y = tempy;
System.out.println("x= "+x);
System.out.println("y= "+y);
int px= (int)(tempx*120)+400;
int py= (int)(tempy*120)+400;
Color color =new Color (i%255, i%255, 0);
g.setColor(color);
g.drawLine(px,py,px,py);
}
g.setColor(Color.WHITE);
}
方法9、分形图形三的绘制draw_03
public void draw_03(Graphics g,int mx) {
double[] a = {0.1400, 0.4300, 0.4500, 0.4900};
double[] b = {0.0100, 0.5200, -0.4900, 0.0000};
double[] c = {0.0000, -0.4500, 0.4700, 0.0000};
double[] d = {0.5100, 0.5000, 0.4700, 0.5100};
double[] e = {-0.0800, 1.4900, -1.6200, 0.0200};
double[] f = {-1.3100, -0.7500, -0.7400, 1.6200};
double x=0d,y=0d;
Random ran = new Random(); //随机数的添加方法
for(int i=0; i<50000; i++) {
int ranint = ran.nextInt(4); //0~3,一共四组
double tempx= a[ranint]*x + b[ranint]*y + e[ranint];
double tempy= c[ranint]*x + d[ranint]*y + f[ranint];
x= tempx;
y= tempy;
int px= (int)(tempx*70)+ mx;
int py= (int)(tempy*70)+ 300;
Color color = new Color (0,i%255,0);
g.setColor(color);
g.drawLine(px,py,px,py);
}
}
分形图形的绘制用到了迭代分形的公示知识。
四、使用到的类别
ImageUI中:
import java.awt.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.event.ActionListener;
import java.awt.FlowLayout;
DrawListener中:
import java.awt.Color;
import java.util.Random;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
五、总结
在initUI类中最关键的是
将点击的按钮反馈到监听器 jf.addMouseListener(dl)
以及窗体对象调用方法将图像信息传给g图像对象 Graphics g=jf.getGraphics();
和将图像对象传给监听器对象 dl.g=g;
用监听器实现选择图片处理效果,首先需要写出界面,再在窗体中添加按钮,每个按钮对应着相应的分形。点击按钮后,鼠标监听器调用相应的方法,在图片上画出分形。