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个图形?感觉好麻烦…… 应该有更好的办法吧……