Java Swing教程 - 事件

2018-01-09 19:23 更新

Java Swing教程 - 事件


Swing中的事件是用户采取的动作。 例如,按下按钮,在键盘上向下/向上按下一个键。

事件的源是生成事件的组件。例如,当我们按下一个JButton时,点击的事件发生在那个JButton上。 在这种情况下,JButton是点击事件的来源。

事件表示在源组件上发生的操作。

行动事件

ActionListener接口有一个称为actionPerformed()的方法。接口声明如下:

public interface  ActionListener extends EventListener {
    void  actionPerformed(ActionEvent event);
}

所有事件侦听器接口都从java.util.EventListener接口继承。

EventListener接口是一个标记接口,它没有任何方法。

当按下JButton时,将调用其所有注册的Action侦听器的actionPerformed()方法。

以下代码使用lambda表达式向JButton添加Actionlistener:

closeButton.addActionListener(e ->  System.exit(0));

以下代码显示了如何为关闭按钮添加点击事件处理程序以退出Swing应用程序。

import java.awt.Container;
//from  w w  w. ja v a 2  s  .c o  m
import javax.swing.JButton;
import javax.swing.JFrame;

public class Main {
  public static void main(String[] args) {
    JFrame frame = new JFrame("JFrame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container contentPane = frame.getContentPane();

    // Add a close button
    JButton closeButton = new JButton("Close");
    contentPane.add(closeButton);

    closeButton.addActionListener(e -> System.exit(0));
    
    frame.pack();
    frame.setVisible(true);
  }
}


例子

以下代码将操作侦听器添加到具有匿名类的按钮。

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/*from  ww  w  .j  ava  2  s.co  m*/
import javax.swing.JButton;
import javax.swing.JFrame;

public class Main {
  static int counter;

  public static void main(String[] args) {

    JFrame frame = new JFrame("JFrame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container contentPane = frame.getContentPane();

    JButton counterButton = new JButton("Clicked #0");
    JButton closeButton = new JButton("Close");
    frame.setLayout(new FlowLayout());
    contentPane.add(closeButton);
    contentPane.add(counterButton);

    counterButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        counterButton.setText("Clicked #" + counter++);
      }
    });

    closeButton.addActionListener(e -> System.exit(0));

    frame.pack();
    frame.setVisible(true);
  }
}


实施例2

此示例显示如何从JButton获取操作命令。 动作命令是一个字符串对象,我们可以使用它来计算哪个按钮被点击。

import java.awt.Container;
/*from   w  w  w  .  j a va 2 s . c  o m*/
import javax.swing.JButton;
import javax.swing.JFrame;

public class Main {
  public static void main(String[] args) {
    JFrame frame = new JFrame("JFrame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container contentPane = frame.getContentPane();

    // Add a close button
    JButton closeButton = new JButton("Close");
    contentPane.add(closeButton);

    closeButton.addActionListener(e ->{
      System.out.println(e.getActionCommand());
      System.exit(0);
    } );
    
    frame.pack();
    frame.setVisible(true);
  }
}

鼠标事件

我们可以处理鼠标事件,例如鼠标点击,进入,退出,按下和释放组件。

MouseEvent类的一个对象表示组件上的鼠标事件。

要处理Mouse事件,请使用MouseListener接口。这里是如何声明接口:

public interface MouseListener extends EventListener {
  public void mouseClicked(MouseEvent e);

  public void mousePressed(MouseEvent e);

  public void mouseReleased(MouseEvent e);

  public void mouseEntered(MouseEvent e);

  public void mouseExited(MouseEvent e);
}

MouseListener接口有五个方法,我们不能使用lambda表达式来创建鼠标事件处理程序。

当发生特定的鼠标事件时,将调用MouseListener接口的一种方法。

MouseEvent类具有向我们提供有关鼠标事件的详细信息的方法:

getClickCount()方法返回鼠标点击次数。getX()和getY()方法返回鼠标的x和y位置。getXOnScreen()和getYOnScreen()方法返回鼠标的绝对x和y位置。

以下代码演示了JButton的鼠标输入和退出事件。

import java.awt.Container;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
//from  w  w  w.ja  v  a  2  s .co m
import javax.swing.JButton;
import javax.swing.JFrame;

public class Main {
  public static void main(String[] args) {
    JFrame frame = new JFrame("JFrame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container contentPane = frame.getContentPane();

    JButton closeButton = new JButton("Close");
    contentPane.add(closeButton);

    closeButton.addActionListener(e -> System.exit(0));
    // Add a MouseListener to the JButton
    closeButton.addMouseListener(new MouseListener() {
      @Override
      public void mouseClicked(MouseEvent e) {
      }

      @Override
      public void mousePressed(MouseEvent e) {
      }

      @Override
      public void mouseReleased(MouseEvent e) {
      }

      @Override
      public void mouseEntered(MouseEvent e) {
        closeButton.setText("Mouse has  entered!");
      }

      @Override
      public void mouseExited(MouseEvent e) {
        closeButton.setText("Mouse has  exited!");
      }
    });
    frame.pack();
    frame.setVisible(true);
  }
}

事件适配器

Swing包括一些事件侦听器接口的方便类。类名称以Adapter结尾。

Adapter类被声明为抽象,并且实现了一种Listener接口。

Adapter类为事件侦听器接口中的所有方法提供了空实现。

并非所有事件侦听器接口都具有对应的适配器类。具有多个方法的事件侦听器接口具有对应的适配器类。

以下代码在上面的代码中重写了事件处理程序。

import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/*from  w  ww  .  j ava 2 s  .c om*/
import javax.swing.JButton;
import javax.swing.JFrame;

public class Main {
  public static void main(String[] args) {
    JFrame frame = new JFrame("JFrame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container contentPane = frame.getContentPane();

    JButton closeButton = new JButton("Close");
    contentPane.add(closeButton);

    closeButton.addActionListener(e -> System.exit(0));
    // Add a MouseListener to the JButton
    closeButton.addMouseListener(new  MouseAdapter() {
      @Override
      public void  mouseEntered(MouseEvent e)  {
        closeButton.setText("Mouse has  entered!");
      }

      @Override
      public void  mouseExited(MouseEvent e)  {
        closeButton.setText("Mouse has  exited!");
      }
      });
    frame.pack();
    frame.setVisible(true);
  }
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号