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,一经查实,立即删除!

相关文章

两物体的相对速度公式_《百答相对论》连载(二十一)质疑狭义相对论速度的叠加公式...

狭义相对论部分:(21)质疑狭义相对论速度的叠加公式参考《相对论百问》第28页 21相对论的速度叠加公式怎么写?可以用速度叠加达到和超过光速吗?在经典力学中,物体在力的作用下改变原有的速度遵守牛顿第二定律,物体失去了…

对于大规模机器学习的理解和认识

这篇文章,9分转载转述;很少有自己的见解; 首先先露怯:自己真正是去年开始接触机器学习当中的深度学习当中的卷积神经网络当中的前向预测部分; 不过,刚才看完了这里的讨论,(知乎&…

ARM寄存器

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

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

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

删除win10自带的软件

第一步:开始→所有程序→WindowsPowershell→然后右键以管理员方式运行 全部应用: Get-AppxPackage | Remove-AppxPackage 计算器: Get-AppxPackage calculator | Remove-AppxPackage 地图: Get-AppxPackage map | Remove-A…

ubuntu解压zip文件乱码问题

我的zip文件里的内容是有中文名,也有密码,在网上找到几种解决办法只有一种可以,所以在这里记录一下: 首先是安装7zip来解压,7zip的解决办法在这里,但是无法解决我的问题,仍然有乱码问题 最后是在…

ICMP:Internet控制报文协议

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

贝叶斯优化python包_贝叶斯全局优化(LightGBM调参)

这里结合Kaggle比赛的一个数据集,记录一下使用贝叶斯全局优化和高斯过程来寻找最佳参数的方法步骤。1.安装贝叶斯全局优化库从pip安装最新版本pip install bayesian-optimization2.加载数据集import pandas as pdimport numpy as npfrom sklearn.model_selection im…

PL/SQL 语言 一

Declarea Varchar2(20);b Number(10);c Number(10);m Number(5);sname Varchar2(20);nozero Exception;Begina : 小明;Dbms_Output.Put_Line(a);b : 3;c : 0;/* 循环 */ /* m :50;Loop Exit When m<0;dbms_output.put_line(m);m : m-1;End Loop; *//* While m>0Loop…

OpenCV人脸检测

由于光照、遮挡和倾斜等原因&#xff0c;部分人脸和眼睛并不能正确检测。。 // 简单的人脸检测#include <iostream> #include <vector> #include <opencv2\opencv.hpp> #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgu…

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

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

FLEX 布局

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

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

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

Android 虚拟机学习总结Dalvik虚拟机介绍

1、Dalvik虚拟机与Java虚拟机的最显著差别是它们分别具有不同的类文件格式以及指令集。Dalvik虚拟机使用的是dex&#xff08;Dalvik Executable&#xff09;格式的类文件&#xff0c;而Java虚拟机使用的是class格式的类文件。一个dex文件能够包括若干个类。而一个class文件仅仅…

des vue 加密解密_vue DES 加密

ECB模式import cryptoJs from crypto-js// DES加密export const encryptDes (message, key) > {var keyHex cryptoJs.enc.Utf8.parse(key)var option { mode: cryptoJs.mode.ECB, padding: cryptoJs.pad.Pkcs7 }var encrypted cryptoJs.DES.encrypt(message, keyHex, op…

使用jQuery清空表单

$(#theform)[0].reset(); reset()这个函数的作用是将表单的值重置&#xff0c;变为默认值&#xff0c; 例&#xff1a; <input type"text" value"姓名"> 这个标签的默认值就是”姓名“&#xff0c;如果使用上面的方法&#xff0c;就会重置为“姓名”…

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

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

CentOS工作内容(七)禁用IPV6

CentOS工作内容&#xff08;七&#xff09;禁用IPV6 用到的快捷键 tab 自动补齐(有不知道的吗) ctrla 移动到当前行的开头(a ahead) ctrle 移动到当前行的开头(e end) ctrlu 删除(剪切)此处至开始所有内容 复制进来&#xff1a;按一下鼠标右键粘贴到SercureCRT 复制出去&#x…

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

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

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

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