Java进阶09 事件响应

GUI中,我们看到了如何用图形树来组织一个图形界面。然而,这样的图形界面是静态的。我们无法互动的对该界面进行操作。GUI的图形元素需要增加事件响应(event handling),才能得到一个动态的图形化界面。

元素, 事件, 监听器

我们在GUI一文中提到了许多图形元素。有一些事件(Event)可能发生在这些图形元素上,比如:

  • 点击按钮
  • 拖动滚动条
  • 选择菜单

Java中的事件使用对象表示,比如ActionEvent。每个事件有作用的图形对象,比如按钮,滚动条,菜单。

所谓互动的GUI,是指当上面事件发生时,会有相应的动作产生,比如:

  • 改变颜色
  • 改变窗口内容
  • 弹出菜单

每个动作都针对一个事件。我们将动作放在一个监听器(ActionListener)中,然后让监听器监视(某个图形对象)的事件。当事件发生时,监听器中的动作随之发生。

因此,一个响应式的GUI是图形对象、事件对象、监听对象三者互动的结果。我们已经知道了如何创建图形对象。我们需要给图形对象增加监听器,并让监听器捕捉事件。

按钮响应

下面实现一个响应式的按钮。在点击按钮之后,面板的颜色会改变,如下图:

 (这个例子改编自Core Java 2,Volume 1, Example 8-1)

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class HelloWorldSwing {
    private static void createAndShowGUI() {
        JFrame frame = new JFrame("HelloWorld");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Pane's layout
        Container cp = frame.getContentPane();
        cp.setLayout(new FlowLayout());

        // add interactive panel to Content Pane
        cp.add(new ButtonPanel());

        // show the window
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable tr = new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        };
        javax.swing.SwingUtilities.invokeLater(tr);
    }
}

/**
 * JPanel with Event Handling
 */
class ButtonPanel extends JPanel
{
    public ButtonPanel()
    {
        JButton yellowButton = new JButton("Yellow");
        JButton redButton = new JButton("Red");
        
        this.add(yellowButton);
        this.add(redButton);
        
        /**
         * register ActionListeners
         */
        ColorAction yellowAction = new ColorAction(Color.yellow);
        ColorAction redAction    = new ColorAction(Color.red);
        
        yellowButton.addActionListener(yellowAction);
        redButton.addActionListener(redAction);
    }
    
    /**
     * ActionListener as an inner class
     */
    private class ColorAction implements ActionListener
    {
        public ColorAction(Color c)
        { 
            backgroundColor = c;
    }
   
    
        /**
         * Actions
         */
        public void actionPerformed(ActionEvent event)
        {
            setBackground(backgroundColor); // outer object, JPanel method
            repaint();
        }
    
        private Color backgroundColor;
    }
}

上面,我们用一个内部类ColorAction来实施ActionListener接口。这样做是为了让监听器能更方便的调用图形对象的成员,比如setBackground()方法。

ActionListener的actionPerformed()方法必须被覆盖。该方法包含了事件的对应动作。该方法的参数为事件对象,即监听ActionEvent类型的事件。ActionEvent是一个高层的类,Java会找到图形对象(按钮)会发生的典型事件(点击)作为事件。

ColorAction生成的对象即为监听器对象。

我们为两个按钮JButton添加了相应的监听器对象。当有事件发生时,对应动作将随之产生。

总结

ActionListener interface

ActionEvent class

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏施炯的IoT开发专栏

《101 Windows Phone 7 Apps》读书笔记-Silly Eye

课程内容 Ø Animation Ø Event Triggers Ø Named Resources Ø Settings Page Ø Color...

21170
来自专栏前端新视界

关于 CSS 反射倒影的研究思考

原文:The State of CSS Reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览。该文章篇幅较长,内容庞杂...

31490
来自专栏程序员叨叨叨

Andorid自定义控件属性值设置

今天写一个简单的自定义控件,实现宽固定,高度根据自定义宽高比例自动调整;或高固定,宽度随比例调整。其中有一个 solid属性,想要像android:layout...

10820
来自专栏别先生

JAVA学习Swing章节标签JLabel中图标的使用

package com.swing; import java.awt.Color; import java.awt.Component; import jav...

23160
来自专栏Linux驱动

24.QTableView函数使用,右击菜单实现

对于QStandardItem的setData()成员 函数的第二个参数role 是模型数据角色 

13240
来自专栏Java帮帮-微信公众号-技术文章全总结

WAI-ARIA无障碍网页应用属性完全展示

WAI-ARIA指无障碍网页应用。主要针对的是视觉缺陷,失聪,行动不便的残疾人以及假装残疾的测试人员。尤其像盲人,眼睛看不到,其浏览网页则需要借助辅助设备,如屏...

28740
来自专栏编程

类选择符和ID选择符

类选择符 ? HTML代码: CSS代码: div { width: 200px; height: 200px; border: 1px solid #000;...

22170
来自专栏swag code

双缓冲原理在Awt和Swing中实现消除闪烁方法总结

AWT是抽象窗口工具箱的缩写,它为编写图形用户界面提供了用户接口,通过这个接口就可以继承很多方法,省去了很多工作。AWT还能使应用程序更好地同用户进行交互。

18420
来自专栏向治洪

React Native之样式

样式 React Native 不实现 CSS,而是依赖于 JavaScript 来为你的应用程序设置样式。这是一个有争议的决定,你可以阅读那些幻灯片,了解...

23150
来自专栏hightopo

基于 HTML5 的电力接线图 SCADA 应用

16730

扫码关注云+社区

领取腾讯云代金券