package paint_1;
import java.awt.AWTException;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Stroke;
import java.awt.TextArea;
import java.awt.TextComponent;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.sql.Time;
import java.util.Random;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JTextArea;
import javax.swing.event.AncestorListener;
/**
* PaintPanel 画图区的鼠标监听类:按下,拖曳,释放时取得坐标,画直线等
* 需得到:PaintPanel 的画布(gra,color);tool_panel 的工具命令(tool_command);保存坐标的队列(list)
* 仅传出参数给PaintPanel
*/
public class MyMouseAdapter extends MouseAdapter{
private String tool_command;
private String n;
private Color color;
private int X1,X2,Y1,Y2;
private Graphics2D g;
private ToolPanel tool_panel;
private ColorPanel color_panel;
private PaintPanel paint_panel;
private MyList myList_1=new MyList();
private MyList myList_2=new MyList();
private Cursor cursor; //显示光标
private Robot robot;
private Point mousepoint;//相对于屏幕的坐标
private boolean airbrush_value=false;
//画多边形使用的数据
private int count;
private int first_x,first_y,next_x,next_y;
//画文本框使用的数据
private JTextArea textArea;
private String text;
private int text_x,text_y;
private MyList textList=new MyList();
private boolean textArea_show=false;
/**
* 自定义构造函数,将传递进来的三个面板接收
* @param toolPanel,colorPanel,paintPanel
*/
public MyMouseAdapter(ToolPanel toolPanel,ColorPanel colorPanel,PaintPanel paintPanel){
tool_panel=toolPanel;
color_panel=colorPanel;
paint_panel=paintPanel;
try {
robot=new Robot();
} catch (AWTException e2) {
e2.printStackTrace();
}
}
/**
* 鼠标按下
*/
public void mousePressed(MouseEvent e){
X1 = e.getX();
Y1 = e.getY();
//类 MouseInfo仅两个方法:2.返回表示鼠标指针当前位置的 PointerInfo 实例
mousepoint = MouseInfo.getPointerInfo().getLocation();
color=color_panel.getColorButton().getBackground();
g=(Graphics2D) paint_panel.getGraphics();
g.setColor(color);
//按下鼠标后,画出随机喷墨,保存随机数
if("airbrush".equals(tool_command)){
//画10个点,在距离鼠标10个单位内
for(int i=0;i<10;i++){
int x,y;
x=X1+new Random().nextInt(10);
y=Y1+new Random().nextInt(10);
paint_panel.setList(myList_2.saveValue(x, y, 1, 1,tool_command,color),2);
g.fillRect(x, y, 1, 1);
}
};
//取色笔命令
if("color_picker".equals(tool_command)&&n!=null){
color = robot.getPixelColor(mousepoint.x, mousepoint.y);
color_panel.getColorButton().setBackground(color); //设置按钮的颜色为取色笔所取颜色
g.setColor(color);
tool_command=n; //用完取色笔命令之后还原command,初始值保证n不为空
}else {
n=tool_command; //使用取色笔命令之前保存command
};
//取色之后,改变光标,显示原来选择的画图工具
this.setCursor();
}
/**
* 鼠标释放
*/
public void mouseReleased(MouseEvent e) {
X2=e.getX();
Y2=e.getY();
if(!"polygon".equals(tool_command)){
/*
* 接收调用“保存值方法”后返回的Object类的队列,设置list给 paint_panel
*/
paint_panel.setList(myList_1.saveValue(X1, Y1, X2, Y2,tool_command,color),1);
};
if("dot_rect".equals(tool_command)){
//得到鼠标释放点的坐标,创建一个相对屏幕的矩形
Rectangle rectangle=new Rectangle(mousepoint.x, mousepoint.y, Math.abs(X1-X2), Math.abs(Y1-Y2));
new ImageCut(rectangle).cutImage();//创建截图对象,调用截图方法
//
// g.setColor(Color.white);
// g.clearRect(Math.min(X1,X2),Math.min(Y1, Y2) , Math.abs(X1-X2), Math.abs(Y1-Y2));
// g.setColor(c);
}else if("line".equals(tool_command)){
g.drawLine(X1, Y1, X2, Y2);
}else if("rect".equals(tool_command)){
g.drawRect(Math.min(X1,X2),Math.min(Y1, Y2) , Math.abs(X1-X2), Math.abs(Y1-Y2));
}else if("oval".equals(tool_command)){
g.drawOval(Math.min(X1,X2),Math.min(Y1, Y2) , Math.abs(X1-X2), Math.abs(Y1-Y2));
}else if("round_rect".equals(tool_command)){
g.drawRoundRect(Math.min(X1,X2),Math.min(Y1, Y2) , Math.abs(X1-X2), Math.abs(Y1-Y2), (Math.abs(X1-X2))/3, (Math.abs(Y1-Y2))/3);
}else if("word".equals(tool_command)&&(textArea_show==false)&&(Math.abs(X1-X2)>20&& Math.abs(Y1-Y2)>20)){
//创建文本框,宽必须大于20,防止画出空框使得textArea_show==true。第二次单击画板后,text空,报错
textArea= new JTextArea();
textArea.setBounds(X1, Y1, Math.abs(X1-X2), Math.abs(Y1-Y2));
textArea.setLineWrap(true);//自动换行
paint_panel.add(textArea);
textArea.setBackground(Color.lightGray);
/**
* 文本框添加键盘监听,每按下一个键,保存一次文本,窗口重绘一次
* 此监听方法不妥,总是要重绘。应该在输入完毕后再进行重绘
*/
KeyListener text_keyListener=new KeyAdapter(){
public void keyReleased(KeyEvent e){
text=textArea.getText();
System.out.println(text);
}
};
textArea.addKeyListener(text_keyListener);
//保存画字符串的位置
text_x=X1;
text_y=Y1+13;
textArea_show=true;//改变文本框的显示状态
}else if("polygon".equals(tool_command)){
count++;
if(count==1){
first_x=X1;
first_y=Y1;
g.drawLine(X1,Y1,X2,Y2);
paint_panel.setList(myList_1.saveValue(X1, Y1, X2, Y2,tool_command,color),1);
}else{
g.drawLine(next_x,next_y,X2,Y2); //第二点的坐标为释放的坐标
paint_panel.setList(myList_1.saveValue(next_x,next_y, X2, Y2,tool_command,color),1);
//如果画图结束,则count清零
if(Math.abs(X2-first_x)<3&&Math.abs(Y2-first_y)<3){
count=0;
}
};
next_x=X2;
next_y=Y2;
}
}
/**
* 鼠标拖曳:喷枪,刷子,铅笔,橡皮擦
*/
public void mouseDragged(MouseEvent e) {
X2=e.getX();
Y2=e.getY();
//如果是喷枪,则保存随机数,否则保存坐标原值
if("airbrush".equals(tool_command)){
for(int i=0;i<10;i++){
int x,y;
x=X2+new Random().nextInt(10);
y=Y2+new Random().nextInt(10);
//在重绘面板中保存喷枪画出的随机数坐标
paint_panel.setList(myList_2.saveValue(x, y, 1, 1,tool_command,color),2);
g.fillRect(x,y, 1, 1);
}
}else if("pencil".equals(tool_command)||"eraser".equals(tool_command)||"brush".equals(tool_command)){
/*
* 接收调用“保存值方法”后返回的Object类的队列,设置list给 paint_panel
*/
paint_panel.setList(myList_2.saveValue(X1, Y1, X2, Y2,tool_command,color),2);
}
/**
* 铅笔画直线 :(X1, Y1)为当前的坐标; ( X2, Y2)为下一点的坐标
* 橡皮擦
*/
if("pencil".equals(tool_command)){
g.drawLine(X1, Y1, X2, Y2);
X1=X2;
Y1=Y2;
}else if("eraser".equals(tool_command)||"brush".equals(tool_command)){
if("eraser".equals(tool_command)){
g.setColor(Color.white);}
for(int x=X2;x<X2+8;x++){
for(int y=Y2;y<Y2+8;y++){
g.drawLine(x, y,X2, Y2);
}
}
}else if("rect".equals(tool_command)){
g.drawRect(X1, Y1, Math.abs(X1-X2), Math.abs(Y1-Y2));
}
}
/**
* 鼠标点击,文本框内的字符串显示
*/
public void mouseClicked(MouseEvent e) {
//必须要有此判断,否则每单击一次就会显示一次,形成复制字符串的效果
if