您的位置:首页 > 其它

画图板的重绘

2015-10-17 00:27 337 查看
import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.ArrayList;

import javax.swing.ButtonGroup;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JRadioButton;

//内存:存运行数据

//闪存:存用于界面显示数据(最快)

//硬盘:存储文件(持久化数据,最慢)

/*1.重写paint方法

* 2.构造图形类,并把跟当前图形相关的所有数据定义成属性

* 3.画图形时候,把图形构造成对象,并添加list中

* 4.在paint方法中,重新绘制list中的所有图形

*/

public class DrawBoardFrame extends JFrame{
//创建一个统一图形管理的集合队列
public ArrayList<Shape> list = new ArrayList<Shape>();
//全局化颜色(设为属性)
public Color color;
public static void main(String[] args){
DrawBoardFrame dbf = new DrawBoardFrame();
dbf.initFrame();

}
public void initFrame(){
//实现的逻辑
//构造窗体对象
//设计窗体默认关闭方式
this.setDefaultCloseOperation(3);
//设置窗体大小
this.setSize(600, 600);
//设置标题
this.setTitle("画图板工具");
//设置布局
this.setLayout(new BorderLayout());
//JPanel对象 画板,容器组件
//以J开头的组件包括容器组件和非容器组件
//容器组件:组件上可以添加组件 如JFrame,JPanel,JScrollPanel 
//非容器组件:组件上不能添加组件 如JButton,JRadioButton,JLable,JTextFiled
JPanel jpLeft = new JPanel();
JPanel jpDown = new JPanel();
JPanel jpCenter = new JPanel(){//匿名内部类形式,重写JPanel的paint方法
//绘制窗体:从内存中调用对象加载到闪存中,并显示到界面上
public void paint(Graphics g){
//调用父类的paint方法
super.paint(g);
//把之前绘制的图形重新再绘制出来(访问队列的方式,因为所有的图形数据全部都在队列中保存着)
for(int i=0;i<list.size();i++){
Shape shape = list.get(i);
//执行当前图形对象的draw方法
shape.draw((Graphics2D)g);
}
}

};

//设置大小
Dimension dimen = new Dimension(80,80);
jpLeft.setPreferredSize(dimen);
jpDown.setPreferredSize(dimen);
jpCenter.setPreferredSize(dimen);

//设置背景颜色
jpLeft.setBackground(Color.green);
jpDown.setBackground(Color.DARK_GRAY);
jpCenter.setBackground(Color.white);

//添加到窗体指定位置
this.add(jpLeft,BorderLayout.WEST);
this.add(jpDown,BorderLayout.SOUTH);
this.add(jpCenter,BorderLayout.CENTER);

/*********************功能单选按钮*****************************/
//定义变量数组
//String[] command1 = new String[]{};
String[] command={"Wujiao","Create","Eraser","Penqi",
         "GetColor","Bigger","Pencil","Brush",
         "Pengtong","Word","Line","Quxian",
         "Rect","Duobian","Oval","RoundRect"};
//按钮组类对象,实现单选
ButtonGroup bg = new ButtonGroup();
//循环创建对象
for(int i=0;i<command.length;i++){
JRadioButton jrb = new JRadioButton();
if(i==6){
jrb.setSelected(true);
}
jrb.setActionCommand(command[i]);
jpLeft.add(jrb);
bg.add(jrb);
//创建图片对象
ImageIcon icon1 = new ImageIcon("images/draw"+i+".jpg");
ImageIcon icon2 = new ImageIcon("images/draw"+i+"-1.jpg");
ImageIcon icon3 = new ImageIcon("images/draw"+i+"-2.jpg");
ImageIcon icon4 = new ImageIcon("images/draw"+i+"-3.jpg");
//设置按钮图片
jrb.setIcon(icon1);
jrb.setIcon(icon2);
jrb.setIcon(icon3);
jrb.setIcon(icon4);

}

/***********************颜色选择按钮************************/

//给颜色选择按钮添加监听器 (匿名内部类)
ActionListener action = new ActionListener(){
public void actionPerformed(ActionEvent e){
//获取事件源
JButton jb = (JButton)e.getSource();
//获取按钮本身背景色
color = jb.getBackground();

}
};
//定义颜色变量数组
Color [] yanse = ne
4000
w Color[]{Color.black,Color.gray,Color.lightGray,
                    Color.red,Color.orange,Color.yellow,
                    Color.green,Color.blue,Color.cyan,
                    Color.magenta,Color.pink,Color.white,    
                    };
//循环创建颜色按钮对象
for(int j=0;j<yanse.length;j++){
JButton jbColor = new JButton();
jbColor.setBackground(yanse[j]);
Dimension dimen1 = new Dimension(30,30);
jbColor.setPreferredSize(dimen1);
jpDown.add(jbColor);
jbColor.addActionListener(action);

}

//设置窗体可见
this.setVisible(true);
//获取画笔
Graphics g = jpCenter.getGraphics();
//设置鼠标监听
DrawListener m1 = new DrawListener(g,bg,this);
//传值只能传不变的对象,不能传变量
jpCenter.addMouseListener(m1);//添加鼠标监听器
jpCenter.addMouseMotionListener(m1);//添加移动鼠标监听器

}
}

import java.awt.AWTException;

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Rectangle;

import java.awt.Robot;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.event.MouseMotionListener;

import java.awt.image.BufferedImage;

import java.util.Random;

import javax.swing.ButtonGroup;

import javax.swing.ButtonModel;

public class DrawListener implements MouseListener, MouseMotionListener{
public Graphics2D g;
public ButtonGroup bg;
public DrawBoardFrame dbf;
public int x1,y1,x2,y2,x3,y3,x4,y4;
public boolean flag = true;
public DrawListener(Graphics g,ButtonGroup bg,DrawBoardFrame dbf){
this.g = (Graphics2D)g;
this.bg = bg;
this.dbf = dbf;
}
//鼠标点击自动执行
@Override
public void mouseClicked(MouseEvent e) {
int x2 = e.getX();
int y2 = e.getY();
//确定是双击
int clickCount = e.getClickCount();
if(clickCount==2){
Shape line = new LineShape(x4,y4,x2,y2,dbf.color,1);
   dbf.list.add(line);
   line.draw(g);
//归零flag值,重新绘制多边形
flag = true;
}
}

    //鼠标按压自动执行
@Override
public void mousePressed(MouseEvent e) {
//保存当前按下点的坐标
x1 = e.getX();
y1 = e.getY();
//设置画笔的颜色
g.setColor(dbf.color)

}

    //鼠标释放自动执行
@Override
public void mouseReleased(MouseEvent e) {
//保存当前释放点的坐标
x2 = e.getX();
y2 = e.getY();
// 确定按钮组中,被选中的按钮对象是哪个?
// 获取按钮组中被选中的按钮对象
ButtonModel bm = bg.getSelection();
String command = bm.getActionCommand();
// 在按下点和释放点之间绘制图形
//在按下点和释放点之间绘制图形
//TODO获取画笔
if("Line".equals(command)){
/**************直线图形保存***************/
Shape line = new LineShape(x1,y1,x2,y2,dbf.color,1);
dbf.list.add(line);
line.draw(g);
}else if("Rect".equals(command)){
/**************矩形图形保存***************/
   Shape rect = new RectShape(x1,y1,x2,y2,dbf.color,1);
   dbf.list.add(rect);
   rect.draw(g);
}else if("Oval".equals(command)){
/**************椭圆图形保存***************/
   Shape oval = new OvalShape(x1,y1,x2,y2,dbf.color,1);
   dbf.list.add(oval);
   oval.draw(g);
}else if("RoundRect".equals(command)){
/**************圆角矩形图形保存***************/
   Shape roundrect = new RoundRect(x1,y1,x2,y2,dbf.color,1);
   dbf.list.add(roundrect);
   roundrect.draw(g);
}else if("Duobian".equals(command)){
/**************多边形图形保存***************/
if(flag){
Shape duobian = new LineShape(x1,y1,x2,y2,dbf.color,1);
dbf.list.add(duobian);
duobian.draw(g);
x4 = x1;
y4 = y1;
flag = false;
}else{
Shape duobian = new LineShape(x3, y3, x2, y2,dbf.color,1);
dbf.list.add(duobian);
duobian.draw(g);
}
x3 = x2;
y3 = y2;
}else if("GetColor".equals(command)){
x2 = e.getXOnScreen();
y2 = e.getYOnScreen();
try{
Robot robot = new Robot();
//1.截取当前鼠标释放点的图片(矩形图片:宽高度为1个像素)
Rectangle rect = new Rectangle(x2,y2,1,1);
BufferedImage bi = robot.createScreenCapture(rect);
//2.获取当前图片的第一个像素点的背景色
int value = bi.getRGB(0, 0);
Color color = new Color(value);
//3.把获取到的背景色赋值给画笔
dbf.color = color;
//byte   00000000
//int  =   4byte
//00000000 00000000 00000000 00000011

} catch (AWTException e1){
e1.printStackTrace();

}

}else if ("Create".equals(command)){
x2 = e.getXOnScreen();
y2 = e.getYOnScreen();
try {
Robot robot = new Robot();
//1.截取当前鼠标释放点的图片(矩形图片:宽高度为1个像素)
Rectangle rect = new Rectangle(x1,y1,x2,y2);
BufferedImage bi = robot.createScreenCapture(rect);
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
//鼠标拖动函数,鼠标拖动自动执行
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
//获取当前鼠标移动后的坐标
x2 = e.getX();
y2 = e.getY();
// 确定按钮组中,被选中的按钮对象是哪个?
// 获取按钮组中被选中的按钮对象
ButtonModel bm = bg.getSelection();
String command = bm.getActionCommand();
if("Pencil".equals(command)){
/**************铅笔图形保存***************/
Shape pencil = new LineShape(x1,y1,x2,y2,dbf.color,1);
dbf.list.add(pencil);
pencil.draw(g);
x1 = x2;
y1 = y2;
}else if("Brush".equals(command)){
/**************刷子图形保存***************/
//设置画笔粗细
BasicStroke bs = new BasicStroke(10);
   g.setStroke(bs);
   Shape brush = new LineShape(x1,y1,x2,y2,dbf.color,10);
   dbf.list.add(brush);
   brush.draw(g);
x1 = x2;
y1 = y2;
//还原画笔粗细
BasicStroke bs1 = new BasicStroke(1);
g.setStroke(bs1);
}else if("Pengtong".equals(command)){
/**************喷桶图形保存***************/
//构造一个随机数对象
Random ran = new Random();
for(int i=0;i<20;i++){
int xs = ran.nextInt(20)-10;
int ys = ran.nextInt(20)-10;
Shape pengtong = new LineShape(x2-xs, y2-ys, x2-xs, y2-ys,dbf.color,1);
dbf.list.add(pengtong);
pengtong.draw(g);
}
}else if("Eraser".equals(command)){
/**************橡皮擦图形保存***************/
   g.setColor(Color.white);
//设置画笔粗细
BasicStroke bs = new BasicStroke(10);
   g.setStroke(bs);
   Shape eraser = new LineShape(x1, y1, x2, y2,Color.white,10);
   dbf.list.add(eraser);
   eraser.draw(g);
x1 = x2;
y1 = y2;
//还原画笔粗细
BasicStroke bs1 = new BasicStroke(1);
g.setStroke(bs1);
//还原画笔颜色
g.setColor(dbf.color);
}
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}
}

//index索引 bounds边界

import java.awt.Color;

import java.awt.Graphics2D;

public abstract class Shape {
//封装坐标
public int x1,y1,x2,y2;
public Color color;
public int strock;
//重写构造方法
public Shape(int x1,int y1,int x2,int y2,Color color,int strock){
super();
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
this.color = color;
this.strock = strock;

}
public abstract void draw(Graphics2D g);

}

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Graphics2D;

public class LineShape extends Shape {
public LineShape(int x1, int y1, int x2, int y2, Color color, int strock) {
super(x1, y1, x2, y2, color, strock);
// TODO Auto-generated constructor stub
}
//对象封装的方法
//封装坐标
@Override
public void draw(Graphics2D g) {
// TODO Auto-generated method stub
g.setColor(color);
g.setStroke(new BasicStroke(strock));
g.drawLine(x1, y1, x2, y2);

}

}    

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Graphics2D;

public class OvalShape extends Shape {

public OvalShape(int x1, int y1, int x2, int y2, Color color, int strock) {
super(x1, y1, x2, y2, color, strock);
// TODO Auto-generated constructor stub
}
@Override
public void draw(Graphics2D g) {
// TODO Auto-generated method stub
g.setColor(color);
g.setStroke(new BasicStroke(strock));
g.drawOval(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x2-x1),Math.abs(y2-y1));

}

}

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Graphics2D;

public class RoundRect extends Shape {
public RoundRect(int x1, int y1, int x2, int y2, Color color, int strock) {
super(x1, y1, x2, y2, color, strock);
// TODO Auto-generated constructor stub
}
@Override
public void draw(Graphics2D g) {
// TODO Auto-generated method stub
g.setColor(color);
g.setStroke(new BasicStroke(strock));
g.drawRoundRect(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x2-x1),Math.abs(y2-y1),40,40);

}

}

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Graphics2D;

import java.awt.Stroke;

public class RectShape extends Shape {
public RectShape(int x1, int y1, int x2, int y2, Color color, int strock) {
super(x1, y1, x2, y2, color, strock);
// TODO Auto-generated constructor stub
}
@Override
public void draw(Graphics2D g) {
// TODO Auto-generated method stub
g.setColor(color);
g.setStroke(new BasicStroke(strock));
g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1),
Math.abs(y2 - y1));
}
}

                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                               
                                 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  画图板 简单队列