zoukankan      html  css  js  c++  java
  • 在一个窗口上点击,能以点击点的坐标为中心画三角形、矩形、圆形

    不是什么高级程序,就是基础知识的练习,所以不叙述了。

    代码如下:

    package mt;
    
    import java.awt.Graphics;
    /**
     * 是否在窗口画图
     * @author mt
     *
     */
    public interface Drawable {
    	public abstract void draw(Graphics g);
    }
    
    
    package mt;
    
    import java.awt.Color;
    
    /**
     * 自定义工具类
     * @author jackfrued
     *
     */
    public final class MyUtil {
    
    	private MyUtil() {
    	}
    	
    	/**
    	 * 产生指定范围的随机整数
    	 * @param min 最小值(闭区间)
    	 * @param max 最大值(闭区间)
    	 * @return 指定范围的随机整数
    	 */
    	public static int random(int min, int max) {
    		return (int) (Math.random() * (max - min + 1) + min);
    	}
    	
    	/**
    	 * 生成随机颜色
    	 * @return Color对象
    	 */
    	public static Color randomColor() {
    		int r = random(0, 255);
    		int g = random(0, 255);
    		int b = random(0, 255);
    		return new Color(r, g, b);
    	}
    }
    
    
    package mt;
    
    import java.awt.Color;
    /**
     * 图像(抽象的)
     * @author mt
     *
     */
    public abstract class Shape implements Drawable{
    	protected int x , y ; //中心的横纵坐标
    
    	protected Color color; //颜色
    	/**
    	 * 计算面积
    	 * @return  面积值
    	 */
    	public abstract double area();
    	/**
    	 * 算周长
    	 * @return  周长值
    	 */
    	public abstract double perimiter();
    
    	public void setColor(Color color) {
    		this.color = color;
    	}
    
    
    	public void setX(int x) {
    		this.x = x;
    	}
    
    	public void setY(int y) {
    		this.y = y;
    	}
    
    	public int getX() {
    		return x;
    	}
    
    	public int getY() {
    		return y;
    	} 
    	
    
    }
    
    
    package mt;
    
    import java.awt.Graphics;
    /**
     * 圆形
     * @author mt
     *
     */
    public class Circle extends Shape {
    	private int radius; //半径
    	
    	/**
    	 * 构造器
    	 * @param radius  半径
    	 */
    	public Circle(int radius) {
    		this.radius = radius;
    	}
    
    	@Override
    	public void draw(Graphics g) {
    		g.setColor(color);
    		g.drawOval(x-radius, y-radius, radius << 1, radius << 2);
    
    	}
    
    	@Override
    	public double area() {	
    		return Math.PI * radius * radius;
    	}
    
    	@Override
    	public double perimiter() {
    		return Math.PI * 2 *radius;
    	}
    
    }
    
    
    package mt;
    
    import java.awt.Graphics;
    /**
     * 矩形
     * @author mt
     *
     */
    public class Rect extends Shape {
    	private int widgt;  //宽带
    	private int height;  //高度
    
    /**
     * 构造器
     * @param widgt  宽度
     * @param height  高度
     */
    	public Rect(int widgt, int height) {
    		this.widgt = widgt;
    		this.height = height;
    	}
    
    	@Override
    	public void draw(Graphics g) {
    		g.setColor(color);
    		g.drawRect(x - widgt / 2, y - height / 2, widgt, height);
    	}
    
    	@Override
    	public double area() {		
    		return widgt * height;
    	}
    
    	@Override
    	public double perimiter() {
    		return (widgt + height) << 1 ;
    	}
    
    }
    
    
    package mt;
    
    import java.awt.Graphics;
    /**
     * 三角形
     * @author mt
     *
     */
    public class Trigon extends Shape {
    	private int length;  //边长
    	/* a = {x,(int) (y-length/2/0.866)};
    	   b = {x-length/2,(int) (y+length/2*0.577)};
    	   c = {x+length/2,(int) (y+length/2*0.577)};  三点坐标*/
    	
    	
    	/**
    	 * 构造器
    	 * @param length  边长
    	 */
    	public Trigon(int length) {
    		this.length = length;
    	}
    
    	@Override
    	public void draw(Graphics g) {
    		g.setColor(color);
    		g.drawLine(x, (int) (y-length/2/0.866),x-length/2, (int) (y+length/2*0.577));
    		g.drawLine(x, (int) (y-length/2/0.866), x+length/2,(int) (y+length/2*0.577));
    		g.drawLine(x-length/2, (int) (y+length/2*0.577),x+length/2, (int) (y+length/2*0.577));
    
    	}
    
    	@Override
    	public double area() {
    	double p = 3 * length /2;
    		return Math.sqrt(p*((p-length)*(p-length)*(p-length)));
    	}
    
    	@Override
    	public double perimiter() {
    	
    		return 3 * length;
    	}
    
    }
    
    
    package mt;
    
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    @SuppressWarnings("serial")
    public class MyFrame extends JFrame {
    	private BufferedImage offImage = new BufferedImage(900, 600, 1);
    	private String temp = "Circle";  //临时字符串(用于记录按按钮读取到的字符串)
    	private Shape shape = null;    //创建一个形状对象
    	private List<Shape> shapeList = new ArrayList<Shape>();  //装形状的数组
    	private JButton circleBtton = new JButton();  //画圆形的按钮
    	private JButton rectBtton = new JButton();    //画矩形的按钮
    	private JButton trigonBtton = new JButton();  //画三角形的按钮
    	
    	public MyFrame() {
    		this.setSize(900,600);
    		this.setTitle("绘图");
    		this.setResizable(false);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		circleBtton = new JButton("Circle");
    		rectBtton = new JButton("Rect");
    		trigonBtton = new JButton("Trigon");
    		this.setLayout(null);
    		this.add(circleBtton);
    		circleBtton.setBounds(200, 20, 100, 30);
    		this.add(rectBtton);
    		rectBtton.setBounds(400, 20, 100, 30);
    		this.add(trigonBtton);
    		trigonBtton.setBounds(600, 20, 100, 30);
    
    		ActionListener cilck = new CilckButton();
    		circleBtton.addActionListener(cilck);
    		rectBtton.addActionListener(cilck);
    		trigonBtton.addActionListener(cilck);
    		this.addMouseListener(new MouseAdapter() {
    
    			@Override
    			public void mousePressed(MouseEvent e) {
    				if (temp.equals("Circle")) {
    					shape = new Circle(MyUtil.random(10, 250));
    				}
    				else if(temp.equals("Rect")) {
    					shape = new Rect(MyUtil.random(10, 300),
    							MyUtil.random(20, 400));
    				}
    				else  {
    					shape = new Trigon(MyUtil.random(100, 300));
    				}
    				
    				
    				shape.setX(e.getX());
    				shape.setY(e.getY());
    				shape.setColor(MyUtil.randomColor());
    				shapeList.add(shape);
    				
    				repaint();
    			}
    		});
    	}
    
    	private class CilckButton implements ActionListener {
    
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			temp = e.getActionCommand();
    		}
    	}
    
    
    	@Override
    	public void paint(Graphics g) {
    		Graphics g2 = offImage.getGraphics();
    		super.paint(g2);
    		for(Shape temp : shapeList) {
    			temp.draw(g2);
    		}
    		if (shape != null) {			
    			shape.draw(g2);
    			g2.drawString(String.format("周长: %.2f", shape.perimiter()), 
    					shape.getX(), shape.getY());
    			g2.drawString(String.format("面积: %.2f", shape.area()), 
    					shape.getX(), shape.getY()+50);
    		}
    		g.drawImage(offImage, 0, 0, null);
    	}
    }
    
    
    
    package mt;
    
    public class Test {
    	public static void main(String[] args) {
    		new MyFrame().setVisible(true);
    	}
    }
    
    

  • 相关阅读:
    python 并发编程 多线程 event
    python 并发编程 多线程 定时器
    python 并发编程 多线程 信号量
    linux top 查看CPU命令
    python 并发编程 多线程 GIL与多线程
    python 并发编程 多线程 死锁现象与递归锁
    python 并发编程 多线程 GIL与Lock
    python GIL全局解释器锁与互斥锁 目录
    python 并发编程 多线程 GIL全局解释器锁基本概念
    执行python程序 出现三部曲
  • 原文地址:https://www.cnblogs.com/mt1500/p/4498567.html
Copyright © 2011-2022 走看看