详解Java图形化编程中的鼠标事件设计

作者:goldensun 时间:2022-07-11 08:11:31 

鼠标事件的事件源往往与容器相关,当鼠标进入容器、离开容器,或者在容器中单击鼠标、拖动鼠标时都会发生鼠标事件。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
0
投稿

猜你喜欢

  • Android的Fragment的生命周期各状态和回调函数使用

    2022-12-10 17:44:34
  • Springboot打包为Docker镜像并部署的实现

    2023-06-05 23:11:52
  • Unity打开淘宝app并跳转到商品页面功能的实现方法

    2023-06-17 01:05:18
  • 登录验证全局控制的几种方式总结(session)

    2022-09-03 15:25:41
  • C语言手把手带你掌握带头双向循环链表

    2023-01-14 16:52:59
  • C++集体数据交换实现示例讲解

    2023-12-17 11:35:07
  • 详解使用Spring Security OAuth 实现OAuth 2.0 授权

    2023-10-01 23:05:10
  • Android实现图片点击爆炸效果

    2023-06-04 04:18:55
  • C# 多线程学习之基础入门

    2022-11-08 05:38:13
  • Android编程实现滑动按钮功能详解

    2022-04-14 04:58:39
  • Spring 实现excel及pdf导出表格示例

    2023-12-21 04:17:32
  • java 对象参数去空格方式代码实例

    2023-11-27 09:49:34
  • C#实现启动项管理的示例代码

    2022-07-30 09:09:04
  • C#统计字符串里中文汉字个数的方法

    2022-05-12 21:47:10
  • C#中ref和out的区别浅析

    2021-12-22 23:00:50
  • 详解Android Lint的原理及其使用

    2022-12-23 16:05:47
  • JetCache 缓存框架的使用及源码解析(推荐)

    2021-07-23 12:21:25
  • C语言详细分析宏定义与预处理命令的应用

    2021-10-06 00:39:24
  • Spring Cloud Hystrix 服务降级限流策略详解

    2022-05-02 15:20:27
  • android 之Spinner下拉菜单实现级联

    2023-01-24 04:15:45
  • asp之家 软件编程 m.aspxhome.com