ch12 GUI

《Head First Java 2nd Edition》 摘录

JFrame 代表屏幕上的一个窗口,可以把 buttons, checkboxes, test fields 等等界面相关的东西置于其上。它可以有一个有菜单项的菜单条。无论在哪个平台上,都有窗口图标,最小化、最大化和关闭窗口的按钮。

JFrame 在不同平台上的外观是不一样的。

可以把 javax.swing 包下的许多部件添加到 JFrame 中,最常用的控件是:

  • JButton
  • JRadioButton
  • JCheckBox
  • JLabel
  • JList
  • JScrollPane
  • JSlider
  • JTextArea
  • JTextField
  • JTable
    大多数都易于使用,只有某些比较复杂(例如 JTable)。

创建一个GUI非常简单

第一步:新建一个JFrame

JFrame frame = new JFrame();

第二步:新建一个小部件

JButton button = new JButton("点击我呀");

第三步:把小部件添加到JFrame 中

frame.getContentPane().add(button);

第四步:显示窗体

frame.setSize(300, 300);
frame.setVisible(true);

一个最简GUI示例

package ch12;import javax.swing.*;import java.awt.event.*; // 监听事件public class SimpleGUI01 implements ActionListener{JButton button;int count = 0;public static void main(String[] args) {SimpleGUI01 gui = new SimpleGUI01();gui.go();}public void go(){JFrame frame = new JFrame("最简GUI");button= new JButton("点击我呀");// 添加事件监听器才能响应事件button.addActionListener(this);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(button); // 从这里把 JButton 添加到 JFrameframe.setSize(300, 300);frame.setVisible(true); // 这一步是必须的,不然看到GUI }@Overridepublic void actionPerformed(ActionEvent e) {count ++;button.setText("点击我了" + count);}}

响应事件

单击按钮如何让按钮响应事件?
我们需要准备两样东西:

  • 一个method,特殊事件发生时调用它,比如单击按钮
  • 一个方式,让我们知道何时会触发上面的方法

得到用户事件

想像一下,你希望单击按钮之后按钮上的文字由click me变成I've been clicked,首先我们可以写一个方法来改变按钮的文字:

public void changeIt(){button.setText("I've been clicked!");
}

但是,现在怎么办?我们怎么知道按钮何时被单击了。

在 Java 中,获取和处理用户事件的过程被称作 event-handling,在Java中有许多不同的事件类型,几乎绝大部分和GUI用户动作相关。如果用户单击按钮,这就是一个事件。这个事件表明用户期望的按钮的事件发生了。如果这是一个Slow Tempo按钮,用户期望slow tempo事件发生。如果是聊天客户端上的发送按钮,用户期望的发送我的消息的事件发生了。所以最直截了当的事件是用户单击按钮,表明他们期望一个动作发生。

对于按钮,你通常都不会考虑中间状态,例如按钮按下了或者按钮释放了。你对按钮的期望是:不管用户是怎么单击、双击按钮的,不管鼠标按住了多长时间,不管用户在释放按钮之前想法发生了什么变化,仅仅通知我用户是何时发生了动作。

1、按钮需要知道我们代码关注它的状态
2、当事件发生时按钮需要以某种方式告知我们

以上两个问题的解决办法就是 listener interface,它是一座沟通listener(你)和 event source(按钮)的桥梁。

Swing GUI 组件都是event sources (事件源),在Java语言中,事件源就是一个能把用户动作(单击鼠标,敲击按键,关闭窗口)转变成事件的对象。就像在Java语言中事实上所有的事物都可以用对象来代表。是某种event class的对象。如果你浏览API中的java.awt.event包,可以看见许许多多的事件类(显而易见,它们的名字中都有Event)。你可以看到MouseEvent, KeyEvent, WindowEvent, ActionEvent 还有许许多多的。

当用户做出某种动作的时候,source(事件源,比如按钮)就会创建一个event object(事件对象)。你的绝大部分代码都是接收事件而不是创建事件。换一句话说,你花费几乎所有的时间都在作为一个事件监听器(event listener),而不是事件源(event source)。

每一个事件类型都有与之对应的监听器接口(listener interface)。如果你期待MouseEvent,就实现MouseListener interface。期待WindowEvents,就实现 WindowListener。明白了否?另外需要谨记实现接口的规则:实现一个你要声明实现的接口,就需要实现这个接口里面所有的方法。

有的接口有不止一个方法,因为这个接口有多重作用。举例说明,如果你要实现MouseListener,你就要实现mousePressed, mouseReleased, mouseMoved 等等。尽管它们都来自 MouseEvent,但它们有不同的实现方法。如果你实现MouseListener,当用户按下鼠标的时候会调用方法mousePressed()。当用户释放鼠标的时候,会调用mouseReleased()方法。对于鼠标事件,只有一个事件对象 MouseEvent,但是对于不同的鼠标事件类型,会调用不同的方法。

监听器和事件源是如何沟通的

Listener
如果你的类想要知道按钮的 ActionEvents,就需要实现 ActionListener 接口。按钮也需要知道你对它感兴趣,你需要在按钮上注册,在按钮上调用 addActionListener(this) 并且传递 ActionListener 引用给它(在当前情况下,你是 ActionListener,所以可以通过 this 传递)。按钮需要在事件发生的时候以某个方式通知你,所以它调用监听器接口的方法。作为一个监听器,你必须要实现这个接口的唯一的一个方法 actionPerformed()

Event Source
按钮是 ActionEvents 的事件源,所以它必须知道哪一个对象是感兴趣的监听者。按钮有一个方法 addActionListener() ,可以把感兴趣的监听者作为参数传递给这个按钮。当按钮的 addActioinListener() 方法运行时,它会把参数存到一个列表中。当用户点击按钮时,按钮在列表中的每一个监听器上调用 actionPerformed() 方法发出这个事件。

3种添加事物到GUI的方法

  • 添加小部件到 JFrame 上
frame.getContentPane().add(myButton);
  • 在小部件上绘画 2D 图形
graphics.fillOval(70, 70, 100, 100);
  • 在小部件上显示图片
graphics.drawImage(myPic, 10, 10, this);

创建自己的绘图小部件

可以设置小部件,移动,动画,改变颜色等等属性。

默认情况下,一个frame有5个区域留给你添加小部件。

666431-20170811155029117-838029005.png

转载于:https://www.cnblogs.com/LinTeX9527/p/7291620.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM寄存器

ARM处理器模式 用户模式(User):ARM处理器正常的程序执行状态 快速中断模式(FIQ):用于高速数据传输或通道处理 外部中断模式(IRQ):用于通用的中断处理 管理模式(Supervisor):操作系统使用的保护模式 数据访问终止模式(Abort):当数据或指令预取终止时进入该模式,可用于虚拟存储及…

修改shape数据 小数位数_【数据管理】Excel实用精华

点击上方蓝字关注星标★不迷路来源:从Excel小白到数据分析师这是一篇关于Excel中的小技巧但是都是精华,文中附有操作视屏简单易学上手快噢!01添加数据有效性_名称管理器数据有效性是对单元格或单元格区域输入的数据从内容到数量上的限制。对于…

ICMP:Internet控制报文协议

ICMP:Internet控制报文协议。是IP层的组成部分。传递差错报文或其他信息。 ICMP报文被封装在IP数据报内部:详细格式例如以下所看到的:个字段含义例如以下:8位类型。表示该ICMP报文的含义,如目的不可达、超时、请求回显…

分离圆环图显示百分比_Tableau制作圆环图

Tableau圆环图制作 声明:本文内容来源拉勾教育数据分析训练营, 封面图片来源pexels网站圆环图制作过程如下:建立饼图2. 设置记录平均值3. 在第二个字段的下拉菜单中选择双轴4. 点击右侧坐标轴,右键选择同步轴(同步轴指…

FLEX 布局

网页布局(layout)是CSS的一个重点应用。 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3…

SpiderMonkey-让你的C++程序支持JavaScript脚本

译序 有些网友对为什么D2JSP能执行JavaScript脚本程序感到奇怪,因此我翻译了这篇文章,原文在这里。这篇教程手把手教你怎样利用SpiderMonkey创建一个能执行JavaScript脚本的C程序,并让JavaScript脚本操纵你的C程序的内部数据、操作。从这篇教…

MobX快速入门教程(重要概念讲解)

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7372119.html 一:Mobx工作流程图 二:MobX涉及到的概念 1:状态state 组件中的数据。 2:被观察observable 被observable修饰的state数据将会暴露给整个app,各观察者组件都可以…

循环结束后变回去 设置一个值_VBA掌握循环结构,包你效率提高500倍

这是系列免费教程《Excel VBA:办公自动化》,还是老规矩,看看我们走到哪里了。1.认识VBA:什么是VBA?2.这些掌握了,你才敢说自己懂VBA3.VBA变量5年踩坑吐血精华总结4.VBA中重要的强制申明,谁看谁明…

连接到kali linux服务器上的MySQL服务器错误

前言:想把数据库什么的都放在虚拟机kali Linux里,但无奈出了好多错误。 首先:可以参照上一篇文章开启kali服务器端的远程连接功能,上一篇文章 然后:使用window端的sqlyog(MySQL图形化连接工具)连…

dedecms后台怎么添加发布软件?织梦后台软件内容管理

使用织梦cms有很多的功能,其中有一个是在dedecms后台添加发布软件,然后在前台大家可以直接下载软件,在织梦cms后台怎么添加发布软件呢?下面是织梦软件内容管理的主要操作步骤。使用织梦cms有很多的功能,其中有一个是在…

301 302区别_如何正确理解301,302和canonial标签

今天我们来学习一下几个比较容易混淆的页面跳转标签,301,302,relcanonial。在谷歌SEO里面,我们比较容易常见的是第一个301,302和canonial出现的比较少,但是不代表不存在,我会尝试从以下价格方面…

为什么手机游戏手柄没有流行起来?

问答社区知乎上有人提了一个问题,“为什么手机用游戏手柄没有流行?” Ta找了不少论证:1)手机用户数量很大;2)大量用户在手机上花费最多时间的是玩游戏;3)游戏机平台(的游…

c++排序算法ppt_C/C++学习教程:C语言排序算法—插入排序算法

前言:插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。直接插入排序是插入排序算法中的一种,采用的方法是:在…

python函数参数

1.位置参数 2.默认参数 指向参数为不可变对象 3.可变参数 **args 一个列表list或是元组tuple 4.关键字参数 **kw,是一个字典dict 5.命名关键字参数 *, 转载于:https://www.cnblogs.com/aliy-pan/p/5198025.html

Python 常用函数 configparser模块

使用ConfigParser模块读写ini文件 ConfigParserPython的ConfigParser Module中定义了3个类对INI文件进行操作。分别是RawConfigParser、ConfigParser、SafeConfigParser。模块所解析的ini配置文件是由多个section构成,每个section名用中括号‘[]’包含,每…

自制Unity小游戏TankHero-2D(3)开始玩起来

自制Unity小游戏TankHero-2D(3)开始玩起来 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的。仅为学习Unity之用。图片大部分是自己画的,少数是从网上搜来的。您可以到我的github页…

VirtualBox虚拟机安装CentOS 7

新建虚拟机 因为比较简单,所以对于VirtualBox就不做过多介绍了,直接下载安装即可,安装好之后打开Oracle VM VirtualBox管理器,点击新建,选择Red Hat(根据windows主机选择 32/64 bit,通常会自动识…

从C语言到C++成长经历所得的一些技巧和感悟

我介绍几个办法,学习办法,期望你能找到爱好1。必定要和喜爱编程的,或编程凶猛的,或常常编程的人,在一同,常常探讨问题!初学编程会有许多问题呈现,你自己很 难处理 c是我们必定要学的…

java基础篇---网络编程(UDP程序设计)

UDP程序设计 在TCP的索引操作都必须建立可靠地连接,这样一来肯定会浪费大量的系统性能,为了减少这种开销,在网络中又提供了另外一种传输协议---UDP,不可靠的连接,这种协议在各个聊天工具中被广泛的应用。 咋UDP开发中使用Datagram…

c++ 静态变量赋值_Python变量及常量解释说明

变量(1)在计算机程序中,变量不仅可以是数字,还可以是任意数据类型,变量子啊程序中就是一个变量名表示的,变量名必须是大小写英文,数字,和"_"的组合,切不能以数字开头.a 1 #变量a是一个整数1b "shuai" #变量b是一个字符串1c True #变量c是一个布尔值Tru…