上次说到mouseEvent事件处理,现在继续总结:
一:有关mouseEvent事件的第二种监听器MouseMotionListener
简单介绍:
1 ,这个接口中有二个方法分别用来处理二种事件:
(1)在事件源上拖动鼠标;mouseDragged(MouseEvent)
(2)在事件源上移动鼠标;mouseMoved(MouseEvent)
2 ,这个监听器有一个重要的运用就是:使用坐标的变换来移动组件;
在拖动组件时只要 组件上角在容器中的坐标为(a+x-x0,b+y-y0)那么就可以实现移动;
其中:(x0,y0)是鼠标按下拖动组件时,鼠标指针在组件上的坐标。
(x,y)是在拖动组件时鼠标指针在组件上的动态坐标;(a,b)这个是在拖动鼠标时组件左上角在容器中的动态坐标;
3实现代码如下:
//LP.java
package Demoswing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
public class LP extends JLayeredPane implements MouseMotionListener,MouseListener
{
JButton button;
JButton button1,button2;
int x,y,a,b,x0,y0;
LP()
{
button=new JButton("ok");
button1=new JButton("test1");
button2=new JButton("test2");
button.addMouseListener(this);
button.addMouseMotionListener(this);
setLayout(new FlowLayout());
add(button,JLayeredPane.DEFAULT_LAYER);
add(button1,JLayeredPane.DRAG_LAYER);
add(button2,JLayeredPane.MODAL_LAYER);
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void mousePressed(MouseEvent e) {
JComponent com;
com=(JComponent)e.getSource();
setLayer(com,JLayeredPane.DRAG_LAYER);
a=com.getBounds().x;
b=com.getBounds().y;
x0=e.getX();
y0=e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
JComponent com=null;
com=(JComponent)e.getSource();
setLayer(com, JLayeredPane.DEFAULT_LAYER);
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void mouseExited(MouseEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void mouseDragged(MouseEvent e) {
Component com=null;
if(e.getSource() instanceof Component)
{
com=(Component)e.getSource();
a=com.getBounds().x;
b=com.getBounds().y;
x=e.getX();
y=e.getY();
a=a+x;
b=b+y;
com.setLocation(a-x0,b-y0);
}
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO 自动生成的方法存根
}
}
//WindowMove.java
package Demoswing;
import javax.swing.*;
import java.awt.*;
public class WindowMove extends JFrame
{
LP layeredpane;
WindowMove()
{
layeredpane=new LP();
layeredpane.setVisible(true);
add(layeredpane,BorderLayout.CENTER);
this.setVisible(true);
this.setBounds(100, 200, 200, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//Demotest.java
package Demoswing;
import javax.swing.*;
import java.awt.*;
public class Demotest {
public static void main(String[] args) {
WindowMove win=new WindowMove();
win.setTitle("处理鼠标拖动事件");
}
}
4,程序总结:得到一个可以拖动的按钮;
二:FocusEvent+keyEvent事件
1,焦点事件介绍
里面有二种方法:
(1)焦点从有到无 ;public void focusGained(FocusEvent e);
(2)焦点从无到有;public void focusLost(FocusEvent e);
介绍3种组件的重要方法
(1)组件可以调用 public boolean requestFocusInWindow()方法来获取焦点,这个方法很重要;
(2) transferFocus()方法,组件可以调用来它来实现光标转移到下一个组件;这个方法很重要;
(3)getCaretPosition()这个方法可以获取文本组件插入符(光标)的位置;就可以控制文本数字;
2,键盘事件介绍:
(1)里面有3个函数来处理3个不同的事件;
(2)KeyEvent 类可以调用public int getKeyCode()得到你在按下,释放或者敲打的那个键;这个键以“键码值”的形式显示出来。或者public char getKeyChar()返回的是键上的“字符”;
3,代码实现:
//police.java
package keyEventthing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class police implements KeyListener,FocusListener
{
@Override
public void focusGained(FocusEvent e) {
JTextField text=(JTextField)e.getSource();
text.setText(null);
}
@Override
public void focusLost(FocusEvent e) {
// TODO 自动生成的方法存根
}
@Override
public void keyTyped(KeyEvent e) {
JTextField text=(JTextField)e.getSource();
if(text.getCaretPosition()>=6)
{
text.transferFocus();
}
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
// TODO 自动生成的方法存根
}
}
//Windowtest.java
package keyEventthing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Windowtest extends JFrame
{
JTextField text[]=new JTextField[3];
JButton button;
police po;
Windowtest()
{
this.setLayout(new FlowLayout());
po=new police();
for(int i=0;i<3;i++)
{
text[i]=new JTextField(7);
text[i].addKeyListener(po);
text[i].addFocusListener(po);
add(text[i]);
}
text[0].requestFocusInWindow();
button=new JButton("ok");
add(button);
this.setVisible(true);
this.setTitle("KeyEventTest");
}
}
//Demo.java
package keyEventthing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Demo {
public static void main(String[] args) {
Windowtest win=new Windowtest();
win.setBounds(600, 400, 200, 200);
}
}
附图:
(4)程序简单易懂,不解释。
三:匿名类和窗口 作为监听器实例
1,这二种方法在事件处理简单而且系统也不复杂的时候 都具有简化程序的功能。但是事件复杂的时候使用这二种方法都会使
系统缺乏弹性。比如匿名类,在修改里面代码的时候会导致这个外部类同时被编译。窗口也一样的意思。
2,如何简化程序:
(1)匿名内部类(注意匿名类一定是内部类):假如一个ActionListener监听器,假如它要获取窗口文本框里面的信息,或者是修改标签内容。那么他就要引用这个文本和标签,这样不仅仅要在监听器里面定义文本变量和标签变量,而且是程序变得复杂(加函数赋值)。假如使用匿名类不仅仅可以简化代码(匿名类的重要特性)而且可以直接对组件进行操作(内部类对外部类的成员是可以直接操作的)。
(2)窗口作为监听器也是一样的,就不解释了。
(3)实例代码实现:
//windowdemo.java
package 匿名类和窗口作为监听器;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class windowdemo extends JFrame implements ActionListener
{
JButton ButtonGetNumber,ButtonEnter;
JLabel label;
JTextField text;
int a=0;
windowdemo() //初始化窗口;
{
this.setLayout(new FlowLayout());//一般先是设置window的布局,大小,可见;
this.setBounds(300, 400, 200, 200);
this.setVisible(true);
this.setTitle("猜数字游戏");
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
ButtonGetNumber=new JButton("得到0一10随机数");//接着实例化组件
ButtonEnter=new JButton("ok");
text=new JTextField(8);
label=new JLabel("提示");
label.setBackground(Color.black);
ButtonGetNumber.addActionListener(this);//注册监听器;
ButtonEnter.addActionListener(this);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
dispose();
}
});
//添加组件;
this.add(ButtonGetNumber);
this.add(label);
this.add(text);
this.add(ButtonEnter);
this.validate();//这句话最好加上,有助于正确显示组件;
}
//事件处理;
@Override
public void actionPerformed(ActionEvent e) //the most important
{
JButton button=(JButton)e.getSource();
int guess=0;
if(button==ButtonGetNumber)
{
a=(int)(10*Math.random()+1);//0-10
label.setText("输入你的猜测!");
}
if(button.equals(ButtonEnter))
{
guess=Integer.parseInt(text.getText());
if(guess==a)
{
label.setText("true");
}
else if(guess>a)
{
label.setText("猜大了");
}
else if(guess<a)
{
label.setText("猜小了");
}
}
}
}
//demo.java
package 匿名类和窗口作为监听器;
public class demo {
public static void main(String[] args) {
windowdemo win=new windowdemo();
}
}
附图:
(4)程序是实现一个猜数字小游戏。程序代码简单不多说。
到这里事件处理基本总结完!!