《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 添加到 JFrame
frame.setSize(300, 300);
frame.setVisible(true); // 这一步是必须的,不然看到GUI
} @Override
public 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个区域留给你添加小部件。

ch12 GUI的更多相关文章

  1. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  2. 如何通过Git GUI将自己本地的项目上传至Github

    最近在学习node.js和react,顺便复习了下AngluarJS相关的东西,写了些小demo想放在GitHub上,之前仅限于只申请了GitHub账号从没用过,今天花半天时间查资料认真学习Githu ...

  3. git图像化界面GUI的使用

    GIT学习笔记 一.        基础内容 1.git是一个版本控制软件,与svn类似,特点是分布式管理,不需要中间总的服务器,可以增加很多分支. 2.windows下的git叫msysgit,下载 ...

  4. egret GUI 和 egret Wing 是我看到h5 最渣的设计

    一个抄袭FlexLite抄的连自己思想都没有,别人精髓都不懂的垃圾框架.也不学学MornUI,好歹有点自己想法. 先来个最小可用集合吧: 1. egret create legogame --type ...

  5. [C#] 走进异步编程的世界 - 在 GUI 中执行异步操作

    走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5877042.html 序 这是继<开始接 ...

  6. 1.JAVA之GUI编程概述

          下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式:                             ...

  7. 2.JAVA之GUI编程布局

    布局管理器 容器中的组件排放方式,就是布局 常见的布局管理器: **************************************************** 1.FlowLayout(流式 ...

  8. 3.JAVA之GUI编程Frame窗口

    创建图形化界面思路: 1.创建frame窗体: 2.对窗体进行基本设置: 比如大小.位置.布局 3.定义组件: 4.将组件通过add方法添加到窗体中: 5.让窗体显示,通过setVisible(tur ...

  9. 4.JAVA之GUI编程事件监听机制

    事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...

随机推荐

  1. 51Nod 1443 路径和树 —— dijkstra

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1443 首先要得到一个最短路树: 注意边权和最小,因为在最短路中,每 ...

  2. 逻辑频道号---DVB NIT LCN

    先介绍NIT,NIT描述如下: 有一点要注意,NIT是对大网的描述,即NIT并不是描述当前的流,而是描述大网的某些或者全部流.如下图,TS流描述1-6共对6个频点不同的TS流进行了描述,具体对哪一个流 ...

  3. STM32: TIMER门控模式控制PWM输出长度

    搞了两天单脉冲没搞定,无意中发现,这个利用主从模式的门控方式来控制一路PWM的输出长度很有效. //TIM2 PWM输出,由TIM4来控制其输出与停止 //frequency_tim2:TIM2 PW ...

  4. PCB 2019年IT工作主题【降本增效】 词云

    降本增效是IT部门永恒的主题,从自身做起.踏踏实实把工作做好 在线词云制作软件: https://wordart.com/create

  5. redis实际项目作用

    我整理一下redis主要在项目作用,只是我接触到的 1  手机验证码存入redis中,可以限制什么时候有效 2 防止接口请求频率过高,例如一分钟只能请求5次 代码如下: <?php /** * ...

  6. $CF241D\ Numbers$

    problem 题目大意: 给你n个数和p,都小于50000要求留下若干个数字,使得剩下的数字异或为0,并且从左到右串联起来可以被p整除,求一种这样的方案. 搜索 #include <bits/ ...

  7. [C陷阱和缺陷] 第1章 词法“陷阱”

    有感自己的C语言在有些地方存在误区,所以重新仔细把"C陷阱和缺陷"翻出来看看,并写下这篇博客,用于读书总结以及日后方便自身复习. 第1章 词法"陷阱" 1.1 ...

  8. Android 性能优化(12)网络优化( 8)Monitoring the Battery Level and Charging State

    Monitoring the Battery Level and Charging State PreviousNext This lesson teaches you to Determine th ...

  9. D. Fedor and coupons 二分暴力

    http://codeforces.com/contest/754/problem/D 给出n条线段,选出k条,使得他们的公共部分长度最大. 公共部分的长度,可以二分出来,为val.那么怎么判断有k条 ...

  10. 【JAVA 学习笔记2】if使用例子

    int a =3; if (a%2==0) { System.out.println(a+" 是偶数"); System.out.println(a+" 不是奇数&quo ...