Java基础学习-GUI之 事件处理基础

  • 944

事件处理可以简单地这么理解,当有一个事件产生,程序要根据这个事件做出响应。比如,我们做了一个可以通过按钮改变背景颜色的窗口,当我们点击按钮时便产生了一个事件,程序会根据这个事件来做出响应,也就是去改变背景的颜色。

那么程序是怎样做出响应的呢?这就需要事件监听器ActionListener,这是一个接口,里面包含了actionPerformed方法(也就是根据事件去执行的操作),所以我们要实现这个接口(实现接口里的actionPerformed方法)做出一个监听器对象出来,并且用按钮来注册这个监听器对象,这样当按钮被点击的时候,就会调用这个监听器来执行响应了。

Java基础学习-GUI之 事件处理基础Java基础学习-GUI之 事件处理基础Java基础学习-GUI之 事件处理基础

运行结果

代码(第42行开始为实现接口):

  1. package buttonPanel;
  2. import java.awt.*;
  3. import java.awt.event.*; //事件监听器接口ActionListener的位置。
  4. import javax.swing.*;
  5. public class ButtonFrame extends JFrame {
  6.     private ButtonPanel buttonPanel;
  7.     private static final int DEFAULT_WIDTH = 300;
  8.     private static final int DEFAULT_HEIGHT = 200;
  9.     public ButtonFrame() {
  10.         setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
  11.         setLocationByPlatform(true);
  12.         //构造按钮
  13.         JButton redButton = new JButton("RED");
  14.         JButton yellowButton = new JButton("YELLOW");
  15.         JButton blueButton = new JButton("BLUE");
  16.         buttonPanel = new ButtonPanel();
  17.         //添加按钮到面板
  18.         buttonPanel.add(redButton);
  19.         buttonPanel.add(yellowButton);
  20.         buttonPanel.add(blueButton);
  21.         add(buttonPanel);
  22.         //构造对应颜色的动作监听器
  23.         ColorAction redAction = new ColorAction(Color.red);
  24.         ColorAction yellowAction = new ColorAction(Color.yellow);
  25.         ColorAction blueAction = new ColorAction(Color.blue);
  26.         //每个按钮注册对应的监听器
  27.         redButton.addActionListener(redAction);
  28.         yellowButton.addActionListener(yellowAction);
  29.         blueButton.addActionListener(blueAction);
  30.     }
  31.     //为了方便调用buttonPanel,将ColorAction作为ButtonFrame的内部类。
  32.     private class ColorAction implements ActionListener {
  33.         private Color backgroundColor;
  34.         public ColorAction(Color c) {
  35.             backgroundColor = c;
  36.         }
  37.         public void actionPerformed(ActionEvent event) {
  38.             buttonPanel.setBackground(backgroundColor);
  39.         }
  40.     }
  41.     public static void main(String[] args) {
  42.         EventQueue.invokeLater(new Runnable() {
  43.             public void run() {
  44.                 JFrame frame = new ButtonFrame();
  45.                 frame.setTitle("ColorButton");
  46.                 frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
  47.                 frame.setVisible(true);
  48.             }
  49.         });
  50.     }
  51. }
  52. class ButtonPanel extends JPanel {
  53.     private static final int DEFAUT_WIDTH = 300;
  54.     private static final int DEFAUT_HEIGHT = 200;
  55.     @Override
  56.     protected void paintComponent(Graphics g) {
  57.         g.create();
  58.         super.paintComponent(g);
  59.     }
  60.     @Override
  61.     public Dimension getPreferredSize() {
  62.         return new Dimension(DEFAUT_WIDTH,DEFAUT_HEIGHT);
  63.     }
  64. }

在上述代码中,为了方便监听器调用buttonPanel,将ColorAction作为ButtonFrame的内部类。如果将ColorAction类独立出去,需要将buttonPanel传递到ColorAction,实现如下:

代码存在一个缺陷,就是在构造按钮、添加按钮到面板、构造相应颜色的监听器和注册监听器的时候有代码复制的情况,为了避免代码复制,我们可以创建一个makeButton方法,把这些重复的操作包含在内,实现如下:

在代码中,监听器只被调用了一次,也就是在addActionListener()时。所以我们没有必要为监听器单独做一个类出来,而是只需在用到监听器时直接new一个ActionListener接口出来,并在花括号里实现接口方法即可。

weinxin
我的微信
这是我的微信扫一扫
开拓者博主
  • 本文由 发表于 2016年10月20日13:17:27
  • 转载请务必保留本文链接:https://www.150643.com/378.html
匿名

发表评论

匿名网友 填写信息