画图板的多图形的实现


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
public class DrawBoardFrame extends JFrame{
//全局化颜色(设为属性)
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();

//设置大小
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==10){
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 = new 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){
g.drawLine(x4, y4, x2, y2);
//归零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)){
   g.drawLine(x1, y1, x2, y2 );
}else if("Rect".equals(command)){
   g.drawRect(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x2-x1),Math.abs(y2-y1));
}else if("Oval".equals(command)){
   g.drawOval(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x2-x1),Math.abs(y2-y1));
}else if("RoundRect".equals(command)){
   g.drawRoundRect(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x2-x1),Math.abs(y2-y1),40,40);
}else if("Duobian".equals(command)){
if(flag){
g.drawLine(x1, y1, x2, y2);
x4 = x1;
y4 = y1;
flag = false;
}else{
g.drawLine(x3, y3, x2, y2);
}
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)){
g.drawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;
}else if("Brush".equals(command)){
//设置画笔粗细
BasicStroke bs = new BasicStroke(10);
   g.setStroke(bs);
   g.drawLine(x1, y1, x2, y2);
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;
g.drawLine(x2-xs, y2-ys, x2-xs, y2-ys);
}
}else if("Eraser".equals(command)){
   g.setColor(Color.white);
//设置画笔粗细
BasicStroke bs = new BasicStroke(10);
   g.setStroke(bs);
   g.drawLine(x1, y1, x2, y2);
x1 = x2;
y1 = y2;
//还原画笔粗细
BasicStroke bs1 = new BasicStroke(1);
g.setStroke(bs1);
}

}
@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边界                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值