项目历程—画图板
步骤一:(内容大致与下先前画板一致:DrawListener和ActionListener的步骤,都是先在画板类中创建自己的对象然后作为该登陆界面/画板对象的参数)(不同的是不像登陆界面那样把可视化放到最后 而要在创建画板参数时提前把可视化确定,因为要获取不为空的渲染器)
package DrawPad;import java.awt.*;
import javax.swing.*;public class DrawPad {public void showInfo(){JFrame jf=new JFrame();jf.setSize(500,600);jf.setLocation(50,60);jf.setTitle("画图板");jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true);Graphics g=jf.getGraphics();DrawListener dl=new DrawListener();jf.addMouseListener(dl);dl.g1=g;}public static void main(String[] args) {DrawPad dp=new DrawPad();dp.showInfo();}
}
步骤二:创建监听类并且在监听类中创建小类
DrawListener内包含MouseListener
并且新的监听器导入的包也不一样,改为鼠标监听器的两个新包分别是Mouseevent和MouseListener
并且在点击和松开两个方法里面创建赋值x1,x2,y1,y2;因为图形的创立只依靠这两个东西
package DrawPad;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;public class DrawListener implements MouseListener{Graphics g1;int x1,y1,x2,y2;@Overridepublic void mouseClicked(MouseEvent e) {System.out.println("点击");int x=e.getX();int y=e.getY();}@Overridepublic void mousePressed(MouseEvent e) {System.out.println("按下");int x=e.getX();int y=e.getY();x1=x;y1=y;}@Overridepublic void mouseReleased(MouseEvent e) {System.out.println("松开");int x=e.getX();int y=e.getY();x2=x;y2=y;g1.drawLine(x1,y1,x2,y2);}@Overridepublic void mouseEntered(MouseEvent e) {System.out.println("进入");}@Overridepublic void mouseExited(MouseEvent e) {System.out.println("离开");}
}
至此初步实现画笔在监听器和画板之间的互通,能够实现两点之间的连线,后面我会加入新的图形:五角形,等腰,等边三角形,正方形。先搞从左上到右下的顺序创建,再搞定各个方向。
步骤三:加入形状和颜色按钮,为方便我们引入遍历,并且实现按钮的被监听
package DrawPad;import java.awt.*;
import javax.swing.*;public class DrawPad {public void showInfo(){JFrame jf=new JFrame();jf.setSize(500,600);jf.setLocation(50,60);jf.setTitle("画图板");jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true);Graphics g=jf.getGraphics();DrawListener dl=new DrawListener();jf.addMouseListener(dl);dl.g1=g;
String[] ButtonTexts={"直线","线框矩形","线框圆形","实心矩形","实心圆形","等腰三角形"};for (int i=0;i<ButtonTexts.length;i++){JButton btn =new JButton(ButtonTexts[i]);jf.add(btn);btn.addActionLIstener(dl)}
String[] ColorTexts={"红色","绿色","黑色","白色"};for (int i=0;i<ColorTexts.length;i++){JButton btn=new JButton(ColorTexts[i]);jf.add(btn);btn.addActionListener(dl)}}public static void main(String[] args) {DrawPad dp=new DrawPad();dp.showInfo();}
}
为了实现按不同按钮时我们能够执行不同的操作,接下来我们进入监听器:
在鼠标监听器”松下”方法中加入不同图形所对应的新的变量,新的画笔方法。在动作监听器中加入不同的颜色,并将其与相应的按钮对应。在鼠标监听器中将不同的方法对应其不同的按钮。
package DrawPad1;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;public class DrawListener implements MouseListener, ActionListener {Graphics g1;int x1,y1,x2,y2,bx,mx,my,minx,miny;String shapeType;
//在“松下”方法中我们没有办法使用e.getActionCommand来获取鼠标按下后对应的文本
,所以只能在actionPerformed里面实现文本并将其赋值给name,如果按下的不是对应颜色的按钮,就把name赋值给shapeType,进而传递
给“松下”方法,所以建议把actionPerformed方法提前。@Overridepublic void actionPerformed(ActionEvent e) {String name = e.getActionCommand();if (name.equals("红色")) {g1.setColor(Color.red);} else if (name.equals("绿色")) {g1.setColor(Color.green);}else if (name.equals("黑色")){g1.setColor(Color.BLACK);}else if(name.equals("白色")){g1.setColor(Color.WHITE);}else{shapeType=name;}}@Overridepublic void mouseClicked(MouseEvent e) {System.out.println("点击");int x=e.getX();int y=e.getY();}@Overridepublic void mousePressed(MouseEvent e) {System.out.println("按下");int x=e.getX();int y=e.getY();x1=x;y1=y;}@Overridepublic void mouseReleased(MouseEvent e) {System.out.println("松开");int x=e.getX();int y=e.getY();x2=x;y2=y;bx=(x1+x2)/2;minx=Math.min(x1,x2);miny=Math.min(y1,y2);mx=Math.abs(x1-x2);my=Math.abs(y1-y2);if(shapeType.equals("直线")){g1.drawLine(x1,y1,x2,y2);
}else if(shapeType.equals("等腰三角形")){g1.drawLine(x1,y2,bx,y1);g1.drawLine(x1,y2,x2,y2);g1.drawLine(bx,y1,x2,y2);
}else if(shapeType.equals("线框矩形")){g1.drawRect(minx,miny,mx,my);
}else if(shapeType.equals("线框圆形")){g1.drawOval(minx,miny,mx,my);
}else if(shapeType.equals("实心矩形")){g1.fillRect(minx,miny,mx,my);
}else if(shapeType.equals("实心圆形")){g1.fillOval(minx,miny,mx,my);
}}@Overridepublic void mouseEntered(MouseEvent e) {System.out.println("进入");}@Overridepublic void mouseExited(MouseEvent e) {System.out.println("离开");}}
至此,实现了不同按钮能够对应不同的执行方法。
补充说明:
如果目标只是单纯画一条横线的话,那么没必要在监听器中导入其他包,但如果想实现多种类型的图的话,
1.就必须要加入对应的按钮,则这时就需要在监听器类中加入ActionListener和Actionevent两个监听器,且不必再创建一个新类来监听按钮例如BtnAction.
2.并且在implements后再加入一个ActionListener新的监听器,并列MouseListener.
3.此时我们再在画板中创建一个监听对象ActionListener dl2=new ActionLIstener(),把之前那个改为dl改为dl1需要注意的是,我们对jf施加的操作是addMouseActionListener(dl1),而对两个按钮施加的操作是addActionListener(dl2)。此后关于不同类型的图都在“松下”这个方法里面实现,一个g2.drawline足以搞定,只需在drawline里面体现坐标就可以。接下来是关于画图的事项,多边图就意味着要连画多条边。
关于上面第三条我再在这里修改一下,不必再在画图板里面另外创建一个所谓的ActionListener的监听器dl2,因为dl这一个监听对象就同时包含了MouseListener和Actionlistener的作用