//图形接口
packageCbs;//图形集合
public interfaceNetJavaShape {public abstract voiddraw();
}//直线类
packageCbs;importjava.awt.Color;importjava.awt.Graphics;importCbs.NetJavaShape;public class ImpLine implementsNetJavaShape{
Graphics g;intx1, y1,x2, y2;
Color c;public ImpLine(Graphics g,int x1,int y1,int x2,inty2,Color c){this.g=g;this.c=c;this.x1=x1;this.y1=y1;this.x2=x2;this.y2=y2;
}public voiddraw() {
g.setColor(c);
g.drawLine(x1, y1, x2, y2);
}
}//DrawListener类
packageCbs;importjava.awt.Color;importjava.awt.Graphics;importjava.util.List;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.awt.event.MouseMotionListener;importjava.util.ArrayList;importCbs.NetJavaShape;importjavax.swing.JButton;public class DrawListener implementsActionListener, MouseListener,
MouseMotionListener {private Color color=Color.BLACK;//颜色属性,初始值为黑色
private Graphics g;//画笔属性
private String str;//保存按钮上的字符串,区分不同的按钮
private int x1,y1,x2,y2;//(x1,y1),(x2,y2)分别为鼠标的按下和释放时的坐标
private JButton nowColor;//当前颜色按钮//保存图形对象的集合
private List shapesArray = new ArrayList();//图形
privateNetJavaShape shape;//在draw类中获取集合
public ListgetShapesArray() {returnshapesArray;
}//获取Draw类的画笔对象
public voidsetG(Graphics g) {this.g =g;
}//获取当前颜色按钮
public voidsetNowColor(JButton nowColor) {this.nowColor =nowColor;
}
@Override//鼠标拖动的方法
public voidmouseDragged(MouseEvent e) {//画曲线的方法
if ("画曲线".equals(str)) {intx, y;
x=e.getX();
y=e.getY();//实例化对象,曲线也是直线画的所以不同新建一个曲线类了
shape=newImpLine(g,x,y,x1,y1,color);//调用画图方法
shape.draw();//将图形存入集合中
shapesArray.add(shape);//g.drawLine(x, y, x1, y1);
x1 =x;
y1=y;
}
}
@Override//鼠标移动方法
public voidmouseMoved(MouseEvent e) {
}
@Override//鼠标单击方法
public voidmouseClicked(MouseEvent e) {
}
@Override//鼠标按下方法
public voidmousePressed(MouseEvent e) {
g.setColor(color);//改变画笔的颜色
x1=e.getX();//获取按下时鼠标的x坐标
y1=e.getY();//获取按下时鼠标的y坐标
}
@Override//鼠标释放方法
public voidmouseReleased(MouseEvent e) {
x2=e.getX();//获取释放时鼠标的x坐标
y2=e.getY();//获取释放时鼠标的y坐标//画直线的方法
if ("画直线".equals(str)) {//实例化对象,
shape=newImpLine(g,x1,y1,x2,y2,color);//调用画图方法
shape.draw();//将图形存入集合中
shapesArray.add(shape);//g.drawLine(x1, y1, x2, y2);
}
}
@Override//鼠标进入方法
public voidmouseEntered(MouseEvent e) {
}
@Override//鼠标退出方法
public voidmouseExited(MouseEvent e) {
}
@Override//处理按钮上的鼠标点击动作
public voidactionPerformed(ActionEvent e) {if ("".equals(e.getActionCommand())) {
JButton jb=(JButton) e.getSource();
color=jb.getBackground();
nowColor.setBackground(color);//处理当前颜色
} else{
str=e.getActionCommand();
}
}
}//draw类
packageCbs;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.FlowLayout;importjava.awt.Graphics;importjava.awt.GridLayout;importjava.util.ArrayList;importjava.util.List;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JPanel;/*** Draw类,用于界面的初始化
*@authorCBS*/@SuppressWarnings("serial")public class Draw extendsJFrame {privateDrawListener dl;privateGraphics g;//保存图形对象的集合
private List shapesArray = new ArrayList();//界面初始化方法
public voidshowUI() {
setTitle("画图");//窗体名称
setSize(1200, 900);//窗体大小
setDefaultCloseOperation(3);
setLocationRelativeTo(null);//窗体居中
FlowLayout layout = new FlowLayout(FlowLayout.LEFT);//流式布局左对齐
setLayout(layout);//窗体使用流式布局管理器
this.setResizable(false);//窗体大小不变//使用数组保存按钮名
String buttonName[] = { "画直线", "画椭圆", "画曲线", "多边形", "橡皮擦", "拖动线","三角形", "画球形", "笔刷", "喷枪", "色子", "立体矩形", "立体圆", "立体三角","迭代分形", "现代分形", "枫叶", "画树", "mandelbrot集", "L-System", "迭代画线","迭代三角形", "谢尔宾斯基地毯", "画字符", "清空","吸管" ,"矩形","五角星","多线","字符"};
JPanel jp1=new JPanel(new GridLayout(15, 2,10,10));//用于保存图形按钮,使用网格布局
jp1.setPreferredSize(new Dimension(200, 800));//实例化DrawListener对象
dl=newDrawListener();//循环为按钮面板添加按钮
for (int i = 0; i < buttonName.length; i++) {
JButton jbutton= newJButton(buttonName[i]);
jbutton.addActionListener(dl);//为按钮添加监听
jp1.add(jbutton);
}
JPanel jp2=new JPanel();//画布面板
jp2.setPreferredSize(new Dimension(970, 800));
jp2.setBackground(Color.WHITE);//定义Color数组,用来存储按钮上要显示的颜色信息
Color[] colorArray ={ Color.BLUE, Color.GREEN, Color.RED, Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,Color.LIGHT_GRAY,Color.YELLOW};//用于保存颜色按钮的面板
JPanel jp3=new JPanel(new GridLayout(1,colorArray.length,3,3));//循环遍历colorArray数组,根据数组中的元素来实例化按钮对象
for (int i = 0; i < colorArray.length; i++) {
JButton button= newJButton();
button.setBackground(colorArray[i]);
button.setPreferredSize(new Dimension(30, 30));
button.addActionListener(dl);//为按钮添加监听
jp3.add(button);
}//将面板添加到主窗体
this.add(jp1);this.add(jp2);this.add(jp3);//添加按钮,作为当前颜色
JButton nowColor=newJButton();
nowColor.setPreferredSize(new Dimension(40,40));
nowColor.setBackground(Color.BLACK);//默认黑色
add(nowColor);//设置窗体的组件可见,如果为FALSE就看不到任何组件
setVisible(true);//获取画笔对象
g=jp2.getGraphics();
dl.setG(g);
dl.setNowColor(nowColor);//获取保存的集合
shapesArray=dl.getShapesArray();//为面板添加鼠标监听,用于绘制图形
jp2.addMouseListener(dl);
jp2.addMouseMotionListener(dl);
}
@Override//重写paint方法
public voidpaint(Graphics g) {//调用父类的paint方法,绘制界面上的组件
super.paint(g);//foreach遍历集合
for(NetJavaShape l : shapesArray) {
l.draw();
}
}
}