Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解

时间:2023-02-20 08:30:00

我们编写程序就是为了方便用户使用, 我觉得UI设计的核心就是简洁, 操作过于繁琐的程序让很大一部分用户敬而远之. 即使功能强大, 但是人们更愿意使用易于操作的软件. 近年流行起来的操作手势和逐渐趋于成熟的语言控制以及其他更加易于操作的方式很可能会颠覆鼠标键盘的操作方式, 我相信这一天必将到来.

Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解

电影<<普罗米修斯>>中画面

我记得我去年编写了我的第一个用户界面, 现在想起来当时非常令我困惑的有两项:

  1. 不知道该如何将自己原来的功能代码与新建的图形界面联系在一起, 对众多的监听器不知从何下手.
  2. 不论我怎样修改代码, 界面都是那么地奇丑无比. 对各式各样的布局管理器一筹莫展. 以至于在我分享代码的时候直接忽略了图形界面这块, 交由更加擅长设计UI界面的程序员完善.
我当时的困惑很可能和今后学习图形界面的朋友差不多, 所以下面我们来重点看一下学习Java GUI时容易令人混淆和疑惑的内容以及分享一下我在学习这块内容时遇到的阻碍. 笔者在此只是抛砖引玉, 非常欢迎广大编程爱好者能够发表自己对这块知识点的见解与大家一同探讨交流.
 
  • 创建操作系统风格的界面
Java默认提供的L&F(外观)在我看来简直奇丑无比, 试想一下你可以忍受这样一个落后的文件选择对话框么.
Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解
通过以下代码我们可以将界面风格设置为与当前系统风格
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 
在调用的时候需要对其可能抛出的异常进行捕获.
ClassNotFoundException - 如果无法找到LookAndFeelInstantiationException - 如果无法创建一个该类的新实例IllegalAccessException - 如果该类或初始化程序不可访问UnsupportedLookAndFeelException - 如果lnf.isSupportedLookAndFeel() 为 falseClassCastException - 如果className 没有标识扩展LookAndFeel 的类
  • 给各个组件添加合适的监听器
我们只是创建了各种漂亮炫酷的组件还不远远够, 我还需要将其与应用程序的核心功能建立联系, GUI中的事件驱动模型恰恰建立了两者联系的桥梁. 
Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解

事件源:能够接收外部事件的源体。例如窗体(Component) 面板(Panel) 文本框(TextField)等等

侦听器:能够接收事件源通知的对象。例如MouseListener  KeyListener

事件处理程序:用于处理事件的对象。Event

任何基于事件驱动模型的开发技术都包含一下三大要素, 不管是.net还是java编程语言, 甚至是很多人第一次接触的VB语言都有基于以上三大要素的事件驱动模型开发流程. 所以我们在学习可视化编程之前, 理解这个重要模型还是相当重要的. 我们先从一个具体事例中理解这个模型吧.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; class ListenerDemo {
JFrame frame;
JPanel panel;
JButton atk;
JButton fig;
JTextField text; public ListenerDemo() {
init();
addListener();
} public void init() {
frame = new JFrame("Test");
frame.setSize(200, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //这里其实是添加了一个窗体监听器WindowsListener,
// 设置用户按下窗体上CLOSE按钮发生的事件
panel = new JPanel(); atk = new JButton("ATK");
fig = new JButton("FIG");
text = new JTextField(15); frame.add(panel);
panel.add(text);
panel.add(atk);
panel.add(fig); frame.setVisible(true);
} public void addListener() {
ActionListener listener = new ActionListener() { // 定义了一个ActionListener(用于接收操作事件的侦听器)
public void actionPerformed(ActionEvent e) {
JButton button = (JButton)e.getSource();
String name = button.getText();
text.setText("你按下的按钮是 :" + name);
// button.removeActionListener(this); // 取消这段代码的注释, 那么按钮的侦听事件只会执行一次
}
}; atk.addActionListener(listener);
fig.addActionListener(listener);
} public static void main(String[] args) {
ListenerDemo demo = new ListenerDemo();
}
}

上面的事例实现了一个非常简单的事件驱动模型, 在此就以模型的结构描述一下事件从发生到结束是怎么样进行的.

事件源:两个JButton按钮 atk 和 fig
侦听器:ActionListener, 用于接收操作事件的侦听器, 是Java中最长用到的侦听器之一.
事件处理程序: 这里的事件处理程序全部封装在侦听器对象中的actionPerformed方法中. 当事件源发生了操作事件, 就调用该方法.
从以上分析看来, 程序目的清晰可见了, 当按下其中一个按钮时, 在文本框中显示所按下按钮的名称.
不仅仅是ActionListener, 监听器的种类很多, 我们在为组件添加侦听器之前, 得了解各个侦听器对应的功能, 下面列举一下几个常用的侦听器.
  • KeyListener该侦听器接收键盘事件. 主要侦听动作有按下, 释放和键入某个键
  • MouseListener用于侦听组件上的鼠标事件(按下、释放、单击、进入或离开), 需要实现发生类似事件响应功能可选择使用.
  • ComponentListener 用于接收组件事件的侦听器, 当组件的可见性, 位置和大小发生改变时就会产生响应. 调用对应的方法.
 
这里有一点需要注意一下, 我们在向一个组件添加侦听器对象时, 由于这里ComponentListener是接口不能直接new创建对象, 而我们只需要调用该接口中的一个方法时, 如果自己新建一个类实现该接口就必须要实现这个接口中的所有方法, 未免显得有点愚笨了, 为此, Java特意提供了一种叫做适配器的类(Adapter). 适配器类存在的目的就是为了方便创建侦听器对象. 我们只需要拓展创建侦听器接口对应的适配器类的对象然后重写一下我们需要的事件方法就行了. 如何创建一个简洁, 易于交互使用的图形界面程序, 我们在下一篇文章将会针对此作深入分析.

Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解的更多相关文章

  1. Java学习之Swing Gui编程

    Java学习之Swing Gui编程 0x00 前言 前面的使用的Gui是基于Awt 去进行实现,但是在现实写Gui中 AWT实际运用会比较少. 0x01 Swing 概述 AWT 和Swing 区别 ...

  2. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  3. Java学习之AWT GUI编程

    Java学习之AWT GUI编程 0x00 前言 既然前面提到了要重写冰蝎和一些反序列化工具,当然就不能随便说说而已.在编写这些工具还是要使用图形化工具来的方便一些,所以提前把GUI的框架给学习一遍. ...

  4. Java学习心得之 Linux下搭建Java环境

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 Linux下搭建Java环境 1.前言2.JDK安装3.配置环境变量4. ...

  5. Java 学习第一步-JDK安装和Java环境变量配置

    Java学习第一步——JDK安装及Java环境变量配置 [原文]  2014-05-30 9:09  Java SE  阿超  9046 views Java作为当下很主流的编程语言,学习Java的朋 ...

  6. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  7. Java学习笔记(十六)——Java RMI

    [前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...

  8. 疯狂Java学习笔记(84)----------大约 Java 对象序列化,你不知道 5 事

    几年前,.当一个软件团队一起用 Java 书面申请.我认识比一般程序猿多知道一点关于 Java 对象序列化的知识所带来的优点. 关于本系列 您认为自己懂 Java 编程?其实,大多数程序猿对于 Jav ...

  9. java学习路线之必会的java基础教程

    大数据产业已进入发展的“快车道”,急需大量优秀的大数据人才作为后盾.如果你是Java编程出身,那学习大数据自然是锦上添花:但如果你是刚刚接触大数据技术,还在Java编程基础阶段,这篇文章非常值得你看! ...

随机推荐

  1. JAVA之IO流(字符流)

    字符流InputStreamReader和OutputStreamWriter是Writer和Read的子类:是字节流通向字符流的桥梁,也就是可以把字节流转化为字符流. InputStreamRead ...

  2. 【LeetCode】Add Digits

    Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only ...

  3. postgreSQL的设置自增主键初始值

    select setval('t_custom_model_id_seq',1,false);

  4. 卸载Eclipse安装的插件

    背景:先前安装过Java Decompiler,不知道怎么弄的eclipse出问题之后不能用了,折腾了几次都没弄好,这次准备把这个插件先卸掉再装一次,结果发现,卸也卸不掉,最终是强制删除,以下为试过的 ...

  5. 【Java】XML解析之DOM

    DOM介绍 DOM(Document Object Model)解析是官方提供的XML解析方式之一,使用时无需引入第三方包,代码编写简单,方便修改树结构,但是由于DOM解析时是将整个XML文件加载到内 ...

  6. 跑Java -jar somefile&period;jar时会发生什么(一个)

    最近阅读JVM源代码.一些想法写Blog分享.于是,他开了这么一个新课题. 第一篇文章取名字的时候让我很困惑,我代码的阅读是从Launcher開始入手的,也就是Java.exe(假设是windows平 ...

  7. dom02

    事件对象:在触发DOM上的事件时dou都会产生一个对象,事件对象event DOM中的事件对象 1)type属性 用于获取事件类型 2)target属性 用于获取事件目标 3)stopPropagat ...

  8. 【Web】一个非常简单的移动web消息框

    适用:h5+jquery,移动网页最佳 最近在写个简单的公众号页面,前端验证时有些信息要提示,很简单的需求实在不想找啥现成的*,又不至于用alert这么粗暴,遂写了个非常简单的消息框,效果如图: 特 ...

  9. &lbrack;Swift&rsqb;LeetCode135&period; 分发糖果 &vert; Candy

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  10. JAVA作业三

    (一)学习总结 1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Gr ...