swing设计基础2

上次说到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)程序是实现一个猜数字小游戏。程序代码简单不多说。


到这里事件处理基本总结完!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值