1.在800 *800 的窗口中加入3个按钮 可以选择当前的画笔画出什么样的图形 有圆 正方形 直线 三种
JFrame 监听器使用 内部类 匿名内部类 接口 多态
1.先做所有图形的抽象类
package com.lovo.homework; import java.awt.Color; import java.awt.Graphics; /** * 抽象类:图形 * @author Abe * 属性:起点坐标 终点坐标 颜色 */ public abstract class Figure { protected int startX, startY; protected int endX, endY; protected Color color; /** * 构造器 */ public Figure() { this.color = this.radomColor(); } /** * 方法:随机颜色 */ public Color radomColor(){ int r = (int) (Math.random() * 256); int g = (int) (Math.random() * 256); int b = (int) (Math.random() * 256); Color color = new Color(r, g, b); return color; } /** * 方法 :get and set //不知道用不用得上先加上再说 * @return */ public int getStartX() { return startX; } public void setStartX(int startX) { this.startX = startX; } public int getStartY() { return startY; } public void setStartY(int startY) { this.startY = startY; } public int getEndX() { return endX; } public void setEndX(int endX) { this.endX = endX; } public int getEndY() { return endY; } public void setEndY(int endY) { this.endY = endY; } public Color getColor() { return color; } /** * 抽象方法 画图 * @param g */ public abstract void draw(Graphics g) ; }
2.类 :圆形
package com.lovo.homework; import java.awt.Graphics; /** * 类: 圆 * 父类:图形 * @author Abe */ public class Circle extends Figure{ @Override public void draw(Graphics g) { g.setColor(this.radomColor()); //重写绘制方法 沿用了老师的XY判断 int x = startX < endX? startX : endX; int y = startY < endY? startY : endY; g.drawOval(x, y, Math.abs(endX - startX),Math.abs( endY - startY)); } }
3.类 :正方形
package com.lovo.homework; /** * 类:正方形 * @author Abe * 父类 :Figrue 图形 */ import java.awt.Graphics; public class Ractangle extends Figure { @Override public void draw(Graphics g) { //重写绘制方法,本来想用交换大小的方法绘图的 结果感觉麻烦多了 g.setColor(this.radomColor()); //优化了下老师的坐标确定方法 int x = Math.min(startX, endX); int y = Math.min(startY, endY); g.drawRect(x, y, Math.abs(endX - startX), Math.abs(endY - startY)); } }
4.类 :直线
package com.lovo.homework; import java.awt.Graphics; /** * 类:直线 * 父类:Figure * @author Abe */ public class Line extends Figure { @Override public void draw(Graphics g) { g.setColor(this.radomColor()); g.drawLine(startX, startY,endX,endY); } }
5.绘制窗口,加事件监听器,加鼠标监听器(适配器)
适配器,用于继承,只用重写需要的功能,其他的自动打酱油
package com.lovo.homework; import java.awt.Button; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /** * 类 :作图窗口 * 父类: JFrame * @author Abe */ import javax.swing.JFrame; @SuppressWarnings("serial") //不知道这货是啥意思 MyFrame自动修复出来的 public class MyFrame extends JFrame { private Button b1 = new Button("圆形"); private Button b2 = new Button("矩形"); private Button b3 = new Button("线段"); private Figure fig = null; private Boolean boo = true; /** * 内部类:事件监听器 * @author Abe */ public class MyListenner implements ActionListener {//接口事件监听器 @Override public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj == b1) { fig = new Circle(); } else if (obj == b2) { fig = new Ractangle(); } else if (obj == b3) { fig = new Line(); } } } /** * 内部类 :鼠标适配器 * @param e */ public class MyMouseAdapter extends MouseAdapter { //继承鼠标适配器 @Override public void mousePressed(MouseEvent e) { //重写点击事件 if (fig != null) { fig.setStartX(e.getX()); fig.setStartY(e.getY()); fig.setEndX(e.getX()); fig.setEndY(e.getY()); } } @Override public void mouseDragged(MouseEvent e) { //重写拖拽事件 if (fig != null) { fig.setEndX(e.getX()); fig.setEndY(e.getY()); repaint(); } } } /** * 构造器 */ public MyFrame() { this.setTitle("选择工具作画"); this.setSize(800, 800); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setResizable(false); this.setLocationRelativeTo(null); this.setLayout(null); b1.setBounds(220, 10, 75, 35); b2.setBounds(350, 10, 75, 35); b3.setBounds(480, 10, 75, 35); this.add(b1); this.add(b2); this.add(b3); MyMouseAdapter adapter = new MyMouseAdapter(); this.addMouseListener(adapter); this.addMouseMotionListener(adapter); MyListenner l = new MyListenner(); b1.addActionListener(l); b2.addActionListener(l); b3.addActionListener(l); } /** * 重写绘图方法 */ @Override public void paint(Graphics g) { if (boo != true) { g.clearRect(0, 0, 800, 800); boo = true; } // super.paint(g); //启用则 窗口无残影 只能看到最后的绘制的图形 if (fig != null) { fig.draw(g); } } public static void main(String[] args) { new MyFrame().setVisible(true); } }
绘图效果看起来很虚幻 ,可惜刷新窗口后 就只会显示最后的图形
本来想用个数组存起来的,但是这数组一旦实例化之后 多态又加不进去 …… 要不就是用3个数组分别存3个图形?感觉好麻烦…… 应该有更好的办法吧……
时间: 2024-10-21 11:02:53