创意画板——(java)小游戏(3)

创意画板——(java)小游戏(3)

我们继续来完善我们的画板,这次我们来看看橡皮擦和三角形,3D图形和菜单等代码。接着上一篇文章来说

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class DrawUI {
    //定义按钮和颜色的字符串
    String[] btnstrs = {"直线","矩形","圆","曲线","三角形","递归图形","迭代分形","撤回","清空","橡皮擦","3D图形","谢尔宾斯基三角形"};
    Color[] colors ={
    Color.WHITE,Color.YELLOW,Color.BLACK,Color.BLUE,Color.RED,Color.MAGENTA,
            Color.GRAY,Color.LIGHT_GRAY,Color.PINK,Color.GREEN,Color.CYAN
    };
	public void initUI() {
		//创建一个窗口
		JFrame jf=new JFrame();
		jf.setTitle("画板");
		jf.setSize(800,600);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setBackground(Color.WHITE);
		
		//添加流式布局管理器
		FlowLayout fl = new FlowLayout();
        jf.setLayout(fl);
       
		//创建画板监听器的对象
		DrawListener dl=new DrawListener();
		
		
		//定义菜单
		 String[] filestrs={"New","OPen","OPenFiles","Import","Setting"};
		JMenuBar bar=new JMenuBar();//菜单容器
        JMenu fileMenu=new JMenu("文件");
        JMenu shapeMenu=new JMenu("图形");
        JMenu colorMenu=new JMenu("颜色");
        JMenu helpMenu=new JMenu("Help");
        //文件下
        for (int i = 0; i < filestrs.length; i++) {
            JMenu jm=new JMenu(filestrs[i]);// 菜单     
            for (int j = 0; j < filestrs.length; j++) {
                JMenuItem jmi=new JMenuItem(filestrs[j]);// 菜单
                jm.add(jmi);
                jmi.addActionListener(dl);
            }
            fileMenu.add(jm);
        }
        // 颜色
        for (int i = 0; i < colors.length; i++) {
            JMenuItem jmi=new JMenuItem();// 菜单
            jmi.setBackground(colors[i]);
            colorMenu.add(jmi);
            jmi.addActionListener(dl);
        }
        //图形
        for (int i = 0; i < btnstrs.length; i++) {
            JMenuItem jmi=new JMenuItem(btnstrs[i]);// 菜单
            shapeMenu.add(jmi);
            jmi.addActionListener(dl);
        }
        bar.add(fileMenu);
        bar.add(shapeMenu);
        bar.add(colorMenu);
        bar.add(helpMenu);
        jf.setJMenuBar(bar);
		
		 Dimension dim = new Dimension(100,40); //按钮的尺寸
	        for (int i = 0; i < btnstrs.length; i++) {        // 在循环中调用下面封装的方法
	            addButton(btnstrs[i],dim,Color.white,dl,jf);
	        }
	        Dimension colordim = new Dimension(40,40);//颜色按钮的尺寸
	        for (int i = 0; i < colors.length; i++) {
	            addButton("",colordim,colors[i],dl,jf);
	        }
	        jf.setVisible(true);
	    
	        //添加画笔
			Graphics g = jf.getGraphics();
		    dl.g2=g;
		    jf.addMouseListener(dl);
		    jf.addMouseMotionListener(dl);
		    jf.repaint();
	
	}
	      //封装
    public void addButton(String btnstr,Dimension dim, Color color, ActionListener al,JFrame jf){
        JButton btn = new JButton(btnstr);
        btn.setBackground(color);
        btn.setPreferredSize(dim);
        jf.add(btn);
        btn.addActionListener(al);
        
    }
 
	public static void main(String[] args) {
		DrawUI d =new DrawUI();
		d.initUI();

	}
}

下一部分是我们的监听器类

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
public class DrawListener implements MouseListener,ActionListener,MouseMotionListener{ 
	int x,y,x1,x2,y1,y2,x3,y3,x4,y4,x5,y5,x6,y6,x7,y7,x8,y8;
	int count=0;
	Graphics g2; // 定义画笔
	 String shapeStr="";
	 

    public void actionPerformed(ActionEvent e){
         String btnstr = e.getActionCommand();// 字符串
           System.out.println("点击了"+btnstr);
           //  区分按钮颜色和按钮字符
           if(btnstr.equals("")){
               JButton btn = (JButton) e.getSource();
              Color btnBgcolor = btn.getBackground();
               System.out.println("按钮对象:"+btn.getText());
               g2.setColor(btnBgcolor);
           }else{
               shapeStr=btnstr;
           }
       
}

	public void mouseClicked(MouseEvent e){
		 x = e.getX();
		 y = e.getY();
		 if(shapeStr.equals("三角形")) {   
 	      	if(count==0) {
 	      	 x3 = e.getX();
 			 y3 = e.getY();
 	      	
 	    		g2.drawOval(x3-2, y3-2, 4, 4);
 	    		count++;
 	    	}else if(count==1) {
 	    		x4=e.getX();
 				y4=e.getY();
 	    		g2.drawLine(x3, y3, x4, y4);
 	    		count++;
 	    	}else if(count==2) {
 	    		x5=e.getX();
 				y5=e.getY();
 							
 	    		g2.drawLine(x5, y5, x4, y4);
 	    		g2.drawLine(x5, y5, x3, y3);
 	    		
 	    		count=0;
 	  	   }
		 }
 	  	   
                     System.out.println("点击:x="+x+" y="+y);
		
		 }

		public void mousePressed(MouseEvent e){
		
			x1=e.getX();
			y1=e.getY();
			System.out.println("按下");
		}
		
		public void mouseReleased(MouseEvent e){
			x2=e.getX();
			y2=e.getY();
		
						
						// 画线
			 if (shapeStr.equals("直线")){
		            g2.drawLine(x1,y1,x2,y2);
		        }else if(shapeStr.equals("矩形")){
		            // 左上角的坐标 宽 高
		            g2.drawRect(min(x1,x2),min(y1,y2),abs(x2-x1),abs(y2-y1));
		        }else if(shapeStr.equals("圆")){
		            // 外切矩形 左上角的坐标 宽 高
		            g2.drawOval(Math.min(x1,x2),min(y1,y2),abs(x2-x1),abs(y2-y1));
		    	}else if (shapeStr.equals("3D图形")) {
		    		for (int i = 0; i < 255; i++) {
		    			Color color = new Color(i,i ,i );
		    			g2.setColor(color);
		    			g2.fillOval(x1+i/3,y1+i/3,255-i,255-i);//坐标移动 尺寸减小
		    			}
		    	}else if(shapeStr.equals("递归图形")) {
                         drawMyOval(min(x1,x2),min(y1,y2),abs(x2-x1),abs(y2-y1));	
		    	} 
			System.out.println("松开");
		}
		public void drawMyOval(int x,int y,int w,int h){ //递归
			if(w<50) {  //递归的结束语 ,不能一直递归下去
				return;
			}
			for (int i = 0; i < w; i++) {    
    			
    			Color color = new Color(i%255,i%255 ,i%255); //构建3D风格
    			g2.setColor(color);
    			g2.drawRect(x+i/2, y+i/2, w-i, h-i);
			}
			
			g2.drawRect(x, y, w, h); //在方法中调用方法就是递归
			drawMyOval(x, y, w/3,h/3);
			drawMyOval(x+w/3, y, w/3, h/3);
			drawMyOval(x+2*(w/3), y, w/3, h/3);
			drawMyOval(x, y+h/3, w/3,h/3);
			drawMyOval(x+w/3, y+h/3, w/3, h/3);
			drawMyOval(x+2*(w/3), y+h/3, w/3, h/3);
		    drawMyOval(x, y+2*(h/3), w/3, h/3);
			drawMyOval(x+w/3, y+2*(h/3), w/3, h/3);
			drawMyOval(x+2*(w/3), y+2*(h/3), w/3, h/3);
		
		}
		   public int min(int a,int b){
		        return a < b ? a : b;
		    }
		    public int abs(int a){
		        return a < 0 ? -a : a;
		    }
	
		public void mouseEntered(MouseEvent e){
		}
	
		public void mouseExited(MouseEvent e){
		}
		
		
		 public void mouseDragged(MouseEvent e) {
			int x3=e.getX();
			int y3=e.getY();
			
			if (shapeStr.equals("橡皮擦")) {
				g2.fillRect(x3, y3, 30, 30);
			 Color a =new Color(238,238,238);
				g2.setColor(a);
			}else if (shapeStr.equals("曲线")) {
				//g2.fillOval(x3, y3, 10, 10);
				  g2.drawLine(x1,y1,x3,y3);
			     x1=x3;
			     y1=y3;
			}
		 }
		  
		    public void mouseMoved(MouseEvent e) {
		    	
		    }

	}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真真最可爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值