一.鼠标点击事件 MouseListener
这个接口MouseListener
总共有五个函数
1.mousePressed(MouseEvent e)
按下触发事件
2.mouseReleased(MouseEvent e)
释放触发事件
3.mouseEntered(MouseEvent e)
进入组件触发事件
4.mouseExited(MouseEvent e)
离开组件触发事件
5.mouseClicked(MouseEvent e)
单击触发事件
还有MouseEvent
的5个方法(不需要覆盖)
1.getX()
获取x坐标
2.getY()
获取yzuob
3.getButton()
获取左键或右键,左键MouseEvent.Button1
,右键MouseEvent.Button3
4.getCickCount()
获取点击次数
5.getSource()
获取鼠标的事件源,返回值是对象,为组建的子类
//Inner class 事件处理例一
import java.awt.*;
import java.awt.event.*;
import java.net.PortUnreachableException;
import java.rmi.MarshalledObject;
import javax.swing.*;class WindowMouse extends JFrame
{
JTextField text;JButton button;JTextArea textArea;MousePolice police; // 鼠标事件监听器WindowMouse(String s){
init(s);setVisible(true);setDefaultCloseOperation(EXIT_ON_CLOSE);}void init(String s){
setTitle(s);setBounds(10,10,460,360);setLayout(new FlowLayout());text = new JTextField(8);textArea = new JTextArea(5,28);police = new MousePolice();police.setJTextArea(textArea); // 与文本框建立连接text.addMouseListener(police);button = new JButton("按钮");button.addMouseListener(police);add(button);add(text);add(textArea);}private class MousePolice implements MouseListener{
JTextArea area;public void setJTextArea(JTextArea area){
this.area = area;}// 实现接口函数// 按下获取位置public void mousePressed(MouseEvent e){
area.append("\n鼠标按下,位置: " + e.getX() + " ," + e.getY());}// 释放获取位置public void mouseReleased(MouseEvent e){
area.append("\n鼠标释放,位置: " + e.getX() + " ," + e.getY());}// 鼠标进入组件事件public void mouseEntered(MouseEvent e){
if(e.getSource() instanceof JButton) // 进入按钮,getsource返回对象area.append("\n鼠标进入按钮");if(e.getSource() instanceof JTextField) // 进入按钮area.append("\n鼠标进入文本框");if(e.getSource() instanceof JFrame) // 进入按钮area.append("\n鼠标进入窗口");}public void mouseExited(MouseEvent e) // 鼠标退出组件{
area.append("\n鼠标退出,位置: \" + e.getX() + \" ,\" + e.getY()");}public void mouseClicked(MouseEvent e){
if(e.getClickCount() >= 2)area.append("\n鼠标连击");else if(e.getButton() == e.BUTTON1)area.append("\n鼠标左键");else if(e.getButton() == e.BUTTON2)area.append("\n鼠标中键");else if(e.getButton() == e.BUTTON3)area.append("\n鼠标右键");}}
}//主类
public class test
{
public static void main(String args[]){
WindowMouse win = new WindowMouse("鼠标事件");}
}
二.鼠标拖动事件 MouseMotionListener
这类的参数也还是MouseEvent
实现接口中的两个方法mouseDragged(MouseEvent e)
和 mouseMoved(MouseEvent e)
//Inner class 事件处理例一
import java.awt.*;
import java.awt.event.*;
import java.net.PortUnreachableException;
import java.rmi.MarshalledObject;
import javax.swing.*;class WindowMove extends JFrame
{
LP layeredpane; // 面板类,同时实现监听器接口WindowMove(String s){
layeredpane = new LP();add(layeredpane, BorderLayout.CENTER);setVisible(true);setTitle(s);setBounds(10, 10, 460, 360);setDefaultCloseOperation(EXIT_ON_CLOSE);}// 创建鼠标移动监听器// 继承了 JLayeredPane 类,这是个分层的面板private class LP extends JLayeredPane implements MouseListener, MouseMotionListener{
JButton button;int x, y, a, b, x0, y0;// 初始化监听器LP(){
// 创建按钮组件button = new JButton("别拽我");// 给组件注册监听器button.addMouseListener(this);button.addMouseMotionListener(this);setLayout(new FlowLayout());add(button, JLayeredPane.DEFAULT_LAYER); // 将 button 添加到JLayeredPane 面板中,DEFAULT_LAYER 是int类,表示放在最上层}// 实现接口函数public void mousePressed(MouseEvent e){
JComponent com = null; // 容器类com = (JComponent)e.getSource(); // 将组件的子类转化为 JComponent 类setLayer(com, JLayeredPane.DRAG_LAYER); // 重新将 com 组件设置为 DRAG_LAYER 层。这里第一个参数必须是JComponent类a = com.getBounds().x; // 获得组件左上角的x坐标b = com.getBounds().y;x0 = e.getX(); // 获取鼠标在事件源 (刚在组件点击下的位置) 中的位置坐标y0 = e.getY();}public void mouseReleased(MouseEvent e){
JComponent com = null;com = (JComponent)e.getSource();setLayer(com, JLayeredPane.DEFAULT_LAYER);}public void mouseEntered(MouseEvent e){
}public void mouseExited(MouseEvent e){
}public void mouseClicked(MouseEvent e){
}public void mouseMoved(MouseEvent e){
}public void mouseDragged(MouseEvent e){
JComponent com = null;if(e.getSource() instanceof Component){
com = (JComponent)e.getSource();a = com.getBounds().x;b = com.getBounds().y;x = e.getX();y = e.getY();a += x; // a = a + xb += y; // b = b + ycom.setLocation(a - x0, b - y0); // 重新设置组件的坐标// 在拖拽组件的时候,要利用公式 a + x - x0,b + y - y0}}}
}//主类
public class test
{
public static void main(String args[]){
WindowMove win = new WindowMove("鼠标拖动事件");}
}
这个程序主要需要一个公式
获取鼠标指针的坐标 x, y
组件的左上角的坐标 a, b
最初鼠标在组件上按下的坐标 x0, y0
移动时,组件左上角的坐标应该是 a + x - x0, a + y - y0
另一个重要的部分是面板的选择
这里选择了 JLayeredPane
面版,可以拖动组件
它利用了组件都是JComponent
的子类,所以可以将组件转化为这个父类,使用setLayer(JComponent, int)
来重新设置组件在这个面板中的图层位置