关于监听器那些让人头疼的事 监听器鼠标监听器画图板
本人初学JAVA,对于界面开发我只能说有点蛋疼,用JAVA来做界面的话确实需要一定的耐心(不使用插件,就算使用插件的话也没好多少)既然Java提供了界面开发,老师又要求做,只能硬着头皮上啦。但是监听器还真是个难懂的地方,我是上了几次课才略微搞懂了些。
今天是说监听器,至于界面怎么写就不说啦。
首先,监听器是干什么的?Java是事件监听机制,我觉得龙哥对这点有个很形象的说法:就比如我们要监视一间房子中会发生什么事情,就会给这间房子装上一个摄像头。对于事件的处理在Java中有类似的机制。我们要监视一个按钮有没有被点击,就要给按钮装上一个类似监视器的东西。这个东西我们就叫做事件监听器。而监听按钮有没有被点击的这种机制就是事件监听机制。在Java当中,每个事件都对应有一个事件监听器。我刚刚开始的时候硬是没有理解监听器的作用,没理解的话就多体会上面一段话。
其次,监听器是什么?监听器其实就是一系列的接口,说到接口就要想到接口是用来实现的,如果要用它的话,它就需要一个类来实现它的功能,例如:在写一个画图板的时候,要达到在画布的一个像素点上按下鼠标,然后在另一个点松开鼠标的时候会画一条直线的效果,这就需要给这个画布安装一个鼠标监听器了,刚刚说了,监听器是接口,接口需要一个类来实现其功能,所以我们创建一个DrawListener类,来实现MouseListener这个接口。
然后,监听器接口怎么用?首先要有一个类来实现你所需要的监听器,以写的DrawListener类为例,那么它就要来实现一个鼠标监听器:public class drawListener implements MouseListener{} 然后为里面的功能函数写上需要的代码,比如说,我需要按下鼠标的时候获得该位置的点的坐标,这个方法就应该写在public void mousePressed(MouseEvent e) 这个函数里面。最后,将监听器的函数实现后需要给这个需要监听的对象安装上我们写的这个监听器,那就是绑定监听器,先声明一个所写的监听器类的对象,然后用对应的add函数绑上。
我们创建的监听器类的构造函数的作用。自己创建了监听器类,那么它的构造函数起到一个传值的作用,把实例化的对象的值传给函数。
附上画图板监听器的代码:
package jhf.draw; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import javax.swing.ButtonGroup; import javax.swing.ButtonModel; public class drawListener implements MouseListener ,MouseMotionListener{ private Graphics g; private int x1,x2,y1,y2; private ButtonGroup group; String command; //声明一个动态数组对象来存储shap 然后再遍历出来 public static ArrayList<shap> shaplist=new ArrayList<shap>(); /** * drawListener 的构造函数 * @param g 一个画布区域 * @param group 按钮组 */ public drawListener(Graphics g, ButtonGroup group) { this.g = g; this.group = group; } @Override public void mousePressed(MouseEvent e) { // TODO 自动生成的方法存根 ButtonModel bm=group.getSelection(); command=bm.getActionCommand(); x1=e.getX(); y1=e.getY(); } @Override public void mouseReleased(MouseEvent e) { // TODO 自动生成的方法存根 x2=e.getX(); y2=e.getY(); if(command.equals("line")) { drawLine line =new drawLine(x1,y1,x2,y2); line.draw(g); shaplist.add(line); } else if(command.equals("rect")) { Color color; color=Color.RED; drawRect rect=new drawRect(x1,y1,x2,y2); g.setColor(color); rect.draw(g); shaplist.add(rect); } else if(command.equals("oval")) { Color color; color=Color.BLUE; drawOval oval=new drawOval(x1,y1,x2,y2); oval.draw(g); g.setColor(color); shaplist.add(oval); } } @Override public void mouseDragged(MouseEvent e) { if(command.equals("write")) { g.setColor(Color.green); int x3 = e.getX(); int y3 = e.getY(); g.drawLine(x1, y1, x3, y3); x1=x3; y1=y3; } } @Override public void mouseClicked(MouseEvent arg0) { // TODO 自动生成的方法存根 } @Override public void mouseEntered(MouseEvent arg0) { // TODO 自动生成的方法存根 } @Override public void mouseExited(MouseEvent arg0) { // TODO 自动生成的方法存根 } @Override public void mouseMoved(MouseEvent arg0) { // TODO 自动生成的方法存根 } }
画图界面中有关监听器的代码:
//在面板上加上一个用来绘制的面板 JPanel drawPanel = new JPanel(); drawPanel.setPreferredSize(new Dimension(385,500)); //drawPanel.setBackground(Color.WHITE); drawPanel.setUI(ui4); center.add(drawPanel); this.setVisible(true); //从绘制面板上获得画布对像 //获得绘制面板在屏幕上占据的区域,这块区域允许当前应用绘制图形 Graphics g=drawPanel.getGraphics(); drawListener dlis=new drawListener(g,group);//创建监听器对象 drawPanel.addMouseListener(dlis);//安装鼠标监听器 drawPanel.addMouseMotionListener(dlis);
值得说明的是,创建的类实现了几个监听器接口就要add几次。
<!--EndFragment-->