鼠标事件的事件源往往与容器相关,当鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionListener接口。
MouseListener接口
MouseListener接口能处理5种鼠标事件:按下鼠标,释放鼠标,点击鼠标、鼠标进入、鼠标退出。相应的方法有:
(1) getX():鼠标的X坐标
(2) getY():鼠标的Y坐标
(3) getModifiers():获取鼠标的左键或右键。
(4) getClickCount():鼠标被点击的次数。
(5) getSource():获取发生鼠标的事件源。
(6) addMouseListener(监视器):加放监视器。
(7) removeMouseListener(监视器):移去监视器。
要实现的MouseListener接口的方法有:
(1) mousePressed(MouseEvent e);
(2) mouseReleased(MouseEvent e);
(3) mouseEntered(MouseEvent e);
(4) mouseExited(MouseEvent e);
(5) mouseClicked(MouseEvent e);
【例】小应用程序设置了一个文本区,用于记录一系列鼠标事件。当鼠标进入小应用程序窗口时,文本区显示“鼠标进来”;当鼠标离开 窗口时,文本区显示“鼠标走开”;当鼠标被按下时,文本区显示“鼠标按下”,当鼠标被双击时,文本区显示“鼠标双击”;并显示鼠标的坐标。程序还显示一个红色的圆,当点击鼠标时,圆的半径会不断地变大。
import java.applet.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyPanel extends JPanel{ public void print(int r){ Graphics g = getGraphics(); g.clearRect(0,0,this.getWidth(),this.getHeight()); g.setColor(Color.red); g.fillOval(10,10,r,r); } } class MyWindow extends JFrame implements MouseListener{ JTextArea text; MyPanel panel; int x,y,r =10; int mouseFlg=0; static String mouseStates[]={"鼠标键按下","鼠标松开","鼠标进来","鼠标走开","鼠标双击"}; MyWindow(String s){ super(s); Container con = this.getContentPane(); con.setLayout(new GridLayout(2,1)); this.setSize(200,300); this.setLocation(100,100); panel = new MyPanel(); con.add(panel); text = new JTextArea(10,20); text.setBackground(Color.blue); con.add(text); addMouseListener(this); this.setVisible(true); this.pack(); } public void paint(Graphics g){ r = r+4; if(r>80){ r=10; } text.append(mouseStates[mouseFlg]+"了,位置是:" +x+","+y+"\n"); panel.print(r); } public void mousePressed(MouseEvent e){ x = e.getX(); y = e.getY(); mouseFlg = 0; repaint(); } public void mouseRelease(MouseEvent e){ x = e.getX(); y = e.getY(); mouseFlg = 1; repaint(); } public void mouseEntered(MouseEvent e){ x = e.getX(); y = e.getY(); mouseFlg = 2; repaint(); } public void mouseExited(MouseEvent e){ x = e.getX(); y = e.getY(); mouseFlg = 3; repaint(); } public void mouseClicked(MouseEvent e){ if(e.getClickCount()==2){ x = e.getX(); y = e.getY(); mouseFlg = 4; repaint(); } else{} } } public class Example6_8 extends Applet{ public void init(){ MyWindow myWnd = new MyWindow("鼠标事件示意程序"); } }
任何组件上都可以发生鼠标事件:鼠标进入、鼠标退出、按下鼠标等。例如,在上述程序中添加一个按钮,并给按钮对象添加鼠标监视器,将上述程序中的init()方法修改成如下形式,即能示意按钮上的所有鼠标事件。
JButton button; public void init(){ button = new JButton(“按钮也能发生鼠标事件”); r = 10; text = new JTextArea(15,20); add(button); add(text); button.addMouseListener(this); }
如果程序希望进一步知道按下或点击的是鼠标左键或右键,鼠标的左键或右键可用InputEvent类中的常量BUTTON1_MASK和BUTTON3_MASK来判定。例如,以下表达式判断是否按下或点击了鼠标右键:
e.getModifiers()==InputEvent. BUTTON3_MASK
MouseMotionListener接口
MouseMotionListener接口处理拖动鼠标和鼠标移动两种事件。
注册监视器的方法是:
addMouseMotionListener(监视器)
要实现的的接口方法有两个:
(1) mouseDragged(MouseEvent e)
(2) mouseMoved(MouseEvent e)
【例】一个滚动条与显示窗口同步变化的应用程序。窗口有一个方块,用鼠标拖运方块,或用鼠标点击窗口,方块改变显示位置,相应水平和垂直滚动条的滑块也会改变它们在滚动条中的位置。反之,移动滚动条的滑块,方块在窗口中的显示位置也会改变。
import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyWindow extends JFrame{ public MyWindow(String s){ super(s); Container con = this.getContentPane(); con.setLayout(new BorderLayout()); this.setLocation(100,100); JScrollBar xAxis = new JScrollBar(JScrollBar.HORIZONTAL,50,1,0,100); jScrollBar yAxis = new jScrollBar(JScrollBar.VERTICAL,50,1,0,100); MyListener listener = new MyListener(xAxis,yAxis,238,118); Jpanel scrolledCanvas = new JPanel(); scrolledCanvas.setLayout(new BorderLayout()); scrolledCanvas.add(listener,BorderLayout.CENTER); scrolledCanvas.add(xAix,BorderLayout.SOUTH); scrolledCanvas.add(yAix,BorderLayout.EAST); con.add(scrolledCanvas,BorderLayout.NORTH); this.setVisible(true); this.pack(); } public Dimension getPreferredSize(){ return new Dimension(500,300); } } class MyListener extends JComponent implements MouseListener, MouseMotionListener,AdjustmentListener{ private int x,y; private JScrollBar xScrollBar; private JScrollBar yScrollBar; private void updateScrollBars(int x,int y){ int d; d = (int)(((float)x/(float)getSize().width)*100.0); xScrollBar.setValue(d); d = (int)(((float)y/(float)getSize().height)*100.0); yScrollBar.setValue(d); } public MyListener(JScrollBar xaxis,JScrollBar yaxis,int x0,int y0){ xScrollBar =xaxis; yScrollBar =yaxis; x = x0; y=y0; xScrollBar.addAdjustmentListener(this); yScrollBar.addAdjustmentListener(this); this.addMouseListener(this); this.addMouseMotionListener(this); } public void paint(Graphics g){ g.setColor(getBackground()); Dimension size = getSize(); g.fillRect(0,0,size.width,size.height); g.setColor(Color.blue); g.fillRect(x,y,50,50); } public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void mouseRelease(MouseEvent e){} public void mouseMoved(MouseEvent e){} public void mousePressed(MouseEvent e){ x = e.getX(); y = e.getY(); updateScrollBars(x,y); repaint(); } public void mouseDragged(MouseEvent e){ x = e.getX(); y = e.getY(); updateScrollBars(x,y); repaint(); } public void adjustmentValueChanged(AdjustmentEvent e){ if(e.getSource()==xScrollBar) x=(int)((float)(xScrollBar.getValue()/100.0)*getSize().width); else if(e.getSource()==yScrollBar) y = (int)((float)(yScrollBar.getValue()/100.0)*getSize().height); repaint(); } } public class Example6_9{ public static void main(){ MyWindow myWindow = new MyWindow("滚动条示意程序"); } }
上述例子中,如果只要求通过滑动滑块,改变内容的显示位置,可以简单地使用滚动面板JScrollPane。如果是这样,关于滚动条的创建和控制都可以免去,直接由JScrollPane内部实现。参见以下修改后的MyWindow的定义:
class MyWindow extends JFrame{ public MyWindow(String s){ super(s); Container con = this.getContentPane(); con.setLayout(new BorderLayout()); this.setLocaltion(100,100); MyListener listener = new MyListener(); listener.setPreferredSize(new Dimension(700,700)); JScrollPane scrolledCanvas = new JScrollPane(listener); this.add(scrolledCanvas,BorderLayout.CENTER); this.setVisible(true); this.pack(); } public Dimension getPreferredSize(){ return new Dimension(400,400); } }
鼠标指针形状也能由程序控制 ,setCursor()方法能设置鼠标指针形状。例如,代码setCursor(Cursor.getPredefinedCursor(cursor.WAIT_CURSOR))。
本文向大家介绍Java图形化编程中的键盘事件设计简介,包括了Java图形化编程中的键盘事件设计简介的使用技巧和注意事项,需要的朋友参考一下 键盘事件的事件源一般丐组件相关,当一个组件处于激活状态时,按下、释放或敲击键盘上的某个键时就会发生键盘事件。键盘事件的接口是KeyListener,注册键盘事件监视器的方法是addKeyListener(监视器)。实现KeyListener接口有3个: key
问题内容: 默认情况下,事件一键启动。我有一个,但我想从双击开始。可能吗? 问题答案: 我相信您可以从MouseEvent中提取点击计数(假设其名为e) 试试这个
我正在JavaFX 2.2中动态创建一个StocckedBarChart(见下面的代码片段)我想让每个条形图充当一个超链接,这样当悬停在它上面时它会发光,当单击它时它会打开一个详细信息屏幕,其中包含有关用于绘制图表中相关条形图的源数据的更多信息。 我想做这样的事情:
本文向大家介绍JavaScript事件类型中焦点、鼠标和滚轮事件详解,包括了JavaScript事件类型中焦点、鼠标和滚轮事件详解的使用技巧和注意事项,需要的朋友参考一下 本文针对JavaScript 事件中“事件类型”下“焦点、鼠标和滚轮事件”的注意要点进行整理,分享给大家供大家参考,具体内容如下 一、焦点事件 一般利用这些事件与document.hasFocus()方法和document.ac
本文向大家介绍Node.js中的事件驱动编程详解,包括了Node.js中的事件驱动编程详解的使用技巧和注意事项,需要的朋友参考一下 在传统程编程模里,I/O操作就像一个普通的本地函数调用:在函数执行完之前程序被堵塞,无法继续运行。堵塞I/O起源于早先的时间片模型,这种模型下每个进程就像一个独立的人,目的是将每个人区分开,而且每个人在同一时刻通常只能做一件事,必须等待前面的事做完才能决定下一件事做什
本文向大家介绍php事件驱动化设计详解,包括了php事件驱动化设计详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php事件驱动化设计。分享给大家供大家参考,具体如下: 最近在做一个需要用到异步php的项目, 翻阅php源码的时候,发现了三个没有用过的模块,sysvsem,sysvshm,sysvmsg,一番研究以后,受益非浅。 在php中有这么一族函数,他们是对unix的v ipc函