Java中的事件处理,及事件传递方式(非常实用)(重要)


一.MouseListener、MouseAdapter
 
       void mouseClicked(MouseEvent e)
                                        鼠标按键在组件上单击(按下并释放)时调用。
       void mouseEntered(MouseEvent e)
                                        鼠标进入到组件上时调用。
       void mouseExited(MouseEvent e)
                                        鼠标离开组件时调用。
       void mousePressed(MouseEvent e)
                                        鼠标按键在组件上按下时调用。
       void mouseReleased(MouseEvent e)
                                        鼠标按钮在组件上释放时调用。
 
二.MouseMotionListener 、MouseAdapter
 
       void mouseDragged(MouseEvent e)
                                       鼠标按键在组件上按下并拖动时调用。
       void mouseMoved(MouseEvent e)
                                       鼠标光标移动到组件上但无按键按下时调用。
 
   注意:MouseAdapter包含了MouseListener和MouseMotionListener,同时还有如下方法
       
         void mouseWheelMoved(MouseWheelEvent e)       鼠标滚轮旋转时调用。

   以下是使用的简单例子,需要同时实现两个监听(如下:
                jlb.addMouseListener(new MouseHandler());      
               jlb.addMouseMotionListener(new MouseHandler());    //鼠标移动或按住拖动时使用


private class MouseHandler extends MouseAdapter{             //写一个自己的适配器类
  @Override
  public void mousePressed(MouseEvent e) {
     
  }
  
  public void  mouseClicked(MouseEvent e){          //如果点击的是鼠标右键(1,2,3分别对应鼠标上的3个按键)
    if(3==e.getButton()){                     
     Component com = (Component)pop.getParent();
     pop.show(com, X, Y);
       }
  }
  
  public  void mouseDragged(MouseEvent e){      //按下鼠标并移动所产生的事件
                       X=e.getX();
         Y=e.getY();                            //处理这种事件通常要先得到当前坐标
  }         
}

 

 

二.KeyListener / KeyAdapter
 
    void keyPressed(KeyEvent e)
                              按下某个键时调用此方法。
    void keyReleased(KeyEvent e)
                              释放某个键时调用此方法。
    void keyTyped(KeyEvent e)
                              键入某个键时调用此方法。

                 
         JComponent → add(new KeyHandler());
        private class KeyHandler extends KeyAdapter{   

    public void keyPressed(KeyEvent e) {
    System.out.println(e.getKeyCode());
    if(e.getKeyCode()==(KeyEvent.VK_DOWN))    //如果按下了↓键,输出123
    System.out.println(123);
 }

 

 


三.FocusListener
     void focusGained(FocusEvent e)
                                组件获得键盘焦点时调用。
     void focusLost(FocusEvent e)
                                组件失去键盘焦点时调用。

 

 

四:设置传递事件   (非常重要)

    设置一个面板控件的事件,先在面板上添加一个JLabel,并在构造函数中传入监听事件
         public ProOutlookBar(String text,MouseAdapter mh) {
    this();                                               //调用本类的无参构造函数
    label = new JLabel(" "+text);             
    label.setBounds(5, 0, getPreferredSize().width-15, 25);   //设置左右间距
    label.addMouseListener(mh);                               //将上级监听事件传给这个JLabel
    add(label);
        }

          
        构造 ProOutlookBar时传入监听事件    ProOutlookBar bar=new ProOutlookBar("name",mh );
                                                  ProOutlookBar currentBar=new ProOutlookBar( );
          private static MouseAdapter mh = new MouseAdapter() {
  public void mouseClicked(MouseEvent e) {
      currentBar = (ProOutlookBar) e.getComponent().getParent();   //得到组件面板(强制转换)
                    String str = ((JLabel)e.getSource()).getText();     //得到面板中的Jlabel.
  }
         }


    注:这里也可以设置为添加JButton,实现方法基本相同,
          public ProLeftReduceBar(ActionListener a) {
    this();
    Btn.addActionListener(a);
                  add(Btn);
         }
                                        构造时传入  ProLeftReduceBar(new  LeftActionListener());
             可以再写一个:          
             public class LeftActionListener extends AbstractAction{
  public void actionPerformed(ActionEvent e) {
 
               }
            }

       菜单类也可以按以上方法设置传入事件, 在规范程序代码分类时一般都采用这种方式写事件处理(视图与操作分开)


    给一个面板写鼠标事件可按如下方法处理:

    MouseAdapter leftdragMouseAdapter;
  JPanel.addMouseMotionListener(leftdragMouseAdapter = new MouseAdapter() {
                      public void mouseEntered(MouseEvent e) {
    setCursor(new Cursor(10));
   }
   public void mouseExited(MouseEvent e) {         //注:这里是写的内部类,
    setCursor(new Cursor(0));               //在实际运用中可以直接封装在一个函数中
   }
             
   public void mousePressed(MouseEvent e) {
    pressPoint = e.getPoint();
   }
   public void mouseDragged(MouseEvent e) {

                       }
               }        

           JPanel.addMouseListener(leftdragMouseAdapter);
 

 

  附: 上面的public void mouseDragged(MouseEvent e)中写入的代码,仅供参考

      public void mouseDragged(MouseEvent e) {                          //下面这一句非常重要,转换坐标
     Point p = SwingUtilities.convertPoint(leftdragPanel, e.getPoint(), getContentPane());
     if (p.x>=40&&p.x<=400) {
  p.x -= pressPoint.x;
  p.y = 0;
     
  leftdragPanel.setLocation(p);
     
  leftPanel.setPreferredSize(new Dimension(p.x,getHeight()));
     
  midPanel.setLocation(p.x+5, 0);
  midPanel.setPreferredSize(new Dimension(getWidth()-p.x-10-rightPanel.getWidth(),getHeight()));
     
  Component[] leftcs = leftPanel.getComponents();
  for(Component c:leftcs){
   c.setPreferredSize(new Dimension(p.x,c.getPreferredSize().height));
   if (c instanceof ProOutlookBar) {
   if(((ProOutlookBar) c).getComponent(0) instanceof JLabel){
   JLabel l =(JLabel) ((ProOutlookBar) c).getComponent(0);
   l.setSize(p.x,c.getPreferredSize().height);
       }
    }
  }
     
  Component[] midcs = midPanel.getComponents();
  for(Component c:midcs){
   c.setPreferredSize(new Dimension(midPanel.getWidth(),c.getPreferredSize().height));
  }
     
  validate();
      }
    }
 
                      

                   

 

 

 

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值