if(e.getSource()==choices[j]){
currentChoice=j;
createNewItem();
repaint();
}
}
}
}
(2)ButtonHandler2监听颜色选色器、画笔粗细、添加文字按钮,if语句判断事件源,相应的按钮被触发,就执行相应的函数,具体代码如下:
publicclassButtonHandler2implementsActionListener{
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==choices[choices.length-3]){
chooseColor();
}
if(e.getSource()==choices[choices.length-2]){
setStroke();
}
icon=newImageIcon(getClass().getResource("/images/smile.png"));
if(e.getSource()==choices[choices.length-1]){
JOptionPane.showMessageDialog(null,"想在哪里添加文字呢?
鼠标先点一下那里吧!
",
"",JOptionPane.INFORMATION_MESSAGE,icon);
currentChoice=14;
createNewItem();
repaint();
}
}
}
3.1.3画图区域
(1)createNewItem()用来new各种基本图形,在函数的一开始,我设置了一下光标的样子,然后用switch函数接收currentChoice来判断用户要new的是哪一个基本图形,关键代码如下:
voidcreateNewItem(){
if(currentChoice==14){
drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
}
else{
drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
switch(currentChoice){
case3:
itemList[index]=newPencil();break;
case4:
itemList[index]=newLine();break;
case5:
itemList[index]=newRect();break;
case6:
itemList[index]=newfillRect();break;
case7:
itemList[index]=newOval();break;
case8:
itemList[index]=newfillOval();break;
case9:
itemList[index]=newCircle();break;
case10:
itemList[index]=newfillCircle();break;
case11:
itemList[index]=newRoundRect();break;
case12:
itemList[index]=newfillRoundRect();break;
case13:
itemList[index]=newRubber();break;
case14:
itemList[index]=newWord();break;
}
itemList[index].type=currentChoice;
itemList[index].R=R;
itemList[index].G=G;
itemList[index].B=B;
itemList[index].stroke=stroke;
}
(2)chooseColor()用来选择各种颜色,具体代码如下:
publicvoidchooseColor(){
color=JColorChooser.showDialog(null,"在这里选择自己喜欢的颜色",color);
R=color.getRed();
G=color.getGreen();
B=color.getBlue();
}
(3)setStroke()用来设置画笔粗细,具体代码如下:
publicvoidsetStroke(){
Stringinput;
input=JOptionPane.showInputDialog(null,"在这里重新输入画笔的粗细值(一个>0的实数)","1.0");
stroke=Float.parseFloat(input);//将字符串参数转换为一个float值
itemList[index].stroke=stroke;
}
(4)mouseA监听鼠标单击、释放、进入、离开四个事件,当鼠标单击的时候,用e.getSource()先得到一个点的坐标初始化(x1,y1),再判断单击的是哪一个按钮,如果是绘制其它图形的按钮,那就光得到一个点(x1,y1);如果是铅笔或者橡皮擦,则继续初始化第二个点的坐标(x2,y2),此时x1=x2,y1=y2,即鼠标单击绘出一个点,而这个点是用绘直线方式画出的,表示已绘制的图形个数的index++;如果是添加文字按钮,则弹出一个可以输入文字的对话框。
当鼠标释放的时候,如果是铅笔或橡皮,同样得到一个点,如果是绘制其它图形的基本按钮,那就光得到(x2,y2),关键代码如下:
classmouseAextendsMouseAdapter{
publicvoidmousePressed(MouseEvente){
statusBar.setText("MousePressed@:
["+e.getX()+","+e.getY()+"]");
itemList[index].x1=e.getX();
itemList[index].y1=e.getY();
if(currentChoice==3||currentChoice==13){
itemList[index].x2=e.getX();
itemList[index].y2=e.getY();
index++;
createNewItem();
repaint();
}
if(currentChoice==14){
itemList[index].x1=e.getX();
itemList[index].y1=e.getY();
Stringinput;
input=JOptionPane.showInputDialog("可以添加你想写的文字咯!
");//可以输入内容的对话框
itemList[index].s1=input;
itemList[index].x2=f1;
itemList[index].y2=f2;//f1,f2用来存放当前字体风格
itemList[index].s2=stylel;
index++;
currentChoice=14;
createNewItem();
drawingArea.repaint();
}
}
publicvoidmouseReleased(MouseEvente){
statusBar.setText("MouseReleased@:
["+e.getX()+","+e.getY()+"]");
if(currentChoice==3||currentChoice==13){
itemList[index].x1=e.getX();
itemList[index].y1=e.getY();
}
itemList[index].x2=e.getX();
itemList[index].y2=e.getY();
index++;
createNewItem();
repaint();
}
}
(5)mouseB监听鼠标拖拽和移动,在鼠标拖拽的时候,由于鼠标的拖拽一定是在单击之后的,所以mouseA和mouseB的监听功能必须连在一起来分析,上面得知,如果事件源是铅笔或橡皮,鼠标单击就得到了第一个点,紧接着鼠标开始拖拽,拖拽的过程中,也一直在动态的得到点,只是第一个点的x2,y2一直在以点的长度动态增加,index++;如果事件源是绘制其它图形的按钮,则鼠标在动态拖拽的过程中只需要,得到点(x2,y2)就好:
classmouseBextendsMouseMotionAdapter{
publicvoidmouseDragged(MouseEvente){
statusBar.setText("MouseDragged@:
["+e.getX()+","+e.getY()+"]");
if(currentChoice==3||currentChoice==13){
itemList[index-1].x2=itemList[index].x2=itemList[index].x1=e.getX();
itemList[index-1].y2=itemList[index].y2=itemList[index].y1=e.getY();
index++;
createNewItem();
}
else{
itemList[index].x2=e.getX();
itemList[index].y2=e.getY();
}
repaint();
}
publicvoidmouseMoved(MouseEvente){
statusBar.setText("MouseMoved@:
["+e.getX()+","+e.getY()+"]");
}
}
3.2基本图形类
3.2.1父类Drawings
classDrawingsimplementsSerializable{
intx1,y1,x2,y2;
intR,G,B;
floatstroke;
inttype;
Strings1,s2;
voiddraw(Graphics2Dg2d){};
}
3.2.2子类(只列出部分)
(1)铅笔:
classPencilextendsDrawings{
voiddraw(Graphics2Dg2d){
g2d.se