【java用监听器实现选择处理图片的效果】

        思路:用监听器实现选择图片处理效果,首先需要写出界面,再在窗体中添加按钮,每个按钮对应着相应的分形,点击后得到下图;

我们以两个类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;

用监听器实现选择图片处理效果,首先需要写出界面,再在窗体中添加按钮,每个按钮对应着相应的分形。点击按钮后,鼠标监听器调用相应的方法,在图片上画出分形。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值