到目前为止我们接触的都是Java的命令行,但是为了让用户使用,必须有图形化界面,所以这章主要讲的是怎么使用GUI(图形用户接口)
 
创建一个GUI:javax.swing.*
本章讲的布局相关内容都是javax.swing包下的内容,常用的组件有JFrame,JButton,JRadioButton,JCheckBox,JLabel,JList,JScrollPane,JSlider,JTextArea,JTextField,JTable等
 
创建GUI第一步:创建window(JFrame)
JFrame:GUI从创建window开始,JFrame代表屏幕上的window的对象,可以把button和text等放到window上,所以
必须先用Frame对象后,才可以用过该对象的getContentPane().add()等方法将组件添加到窗口中
JFrame frame = new JFrame();
 
创建GUI第二步:创建组件(例如一个button)
JButton:定义一个按钮,按钮可以有名字,同时需要有功能。
JButton button=new JButton("click me");
 
创建GUI第三步:把组件加到frame上
在window上可以这样加入一个按钮:
frame.getContentPane().add(button);
frame框架不能直接添加组件,必须通过面板去添加组件
 
创建GUI第四步:将frame显示出来
想要显示JFrame,必须定义frame的大小和是是否可见为true
rame.setSize(300,300);
frame.setVisible(true);
 
wiget:按钮、窗体、radio button等都是一个widget
 
有些widget上可以绘制图形,比如graphics对象。所有绘图程序的代码都在JPanel的paintComponent(Graphics g)里,这个方法在加载panel所在的frame或更改window窗口时会去调用绘制图像,除非使用reaping()重新绘制,否则不会进行调用绘制
paintComponent的参数Graphics实际是个Graphics2D类型
 
布局
一个frame默认有5个区域(就是我们下面介绍到的BorderLayout布局管理器),如果没有指明区域,就将widget添加到中间区域
下面的例子是在中间位置添加一个button:
frame.getContentPane().add(BorderLayout.CENTER,button);
 
frame的五个布局如下:
 
Swing
组件(component,或称元件):是放在GUI上面的东西,是用户可以看到和交互的,例如button、Text Field等,所有组件都继承自java.swing.JComponent
 
布局管理器
布局管理器用来控制所关联组件的显示,有多个类型的布局管理器,每个都可以自定义布局管理规则
内层的面板或组件会受外层的面板控制
 
应用比较广的三个布局管理器
BorderLayout:框架默认的布局管理器。默认5个区域,每个区域只能放一个组件(上文布局中举得例子就是这个布局管理器),当然如果是面板组件,面板上还可以放组件
有东区BorderLayout.EAST、西区BorderLayout.WEST、南区BorderLayout.SOUTH、北区BorderLayout.NORTH、中央区BorderLayout.CENTER五个区域。
南区和北区:高度可以自己决定、但是宽度不能自己决定;
东区和西区:宽度可以自己决定,但是高度不能自己决定;
中央区:只能捡剩下的地方
 
FlowLayout:面板默认的布局管理器。从左至右显示组件(按照加入时间排序),显示不下自动换行
 
BoxLayout:默认以垂直的方向来排列,一行展示一个组件(按照加入顺序排列)。也可以按行展示,但是不会自动换行,需要通过换行机制强制换行。
 
操作Swing的步骤就不写了,去根据想要的组件去查API吧,比如操作Text Field等
 
监听按钮执行动作:java.awt.event.*
在java.awt.event这个包中,有一组事件类(名称中都带有event),例如MouseEvent、KeyEvent、WindowEvent、ActionEvent等。同时事件类会有对应的监听接口,例如MouseListener
 
按钮执行某一个功能需要实现三点:
1.按钮绑定。2.监听按钮被按下的事件。3.实现监听接口的方法(定义事件处理的方法),会传递事件对象的参数
 
下图是一个事件源和监听接口使用的方法。在操作事件源时会产生Event事件(例如按下鼠标)而每个事件类(鼠标操作等)都会对应一个监听接口(MouseListener等)。我们需要实现这个监听接口,定义鼠标事件类可能对应的所有方法,并将一个事件传递给监听器。事件源需要绑定注册这个监听器,例如addActionListener(监听器),这样当发生了监听器所对应的事件时,会执行对应事件的方法。
注意:
每个组件可以触发的事件不是完全相同的,每个事件源组件有自己的事件。
所有事件源绑定监听事件的方法都是addXXXListener结构的
实现监听接口的方法时会传入一个event事件参数,可以通过event.getSource()方法获得事件源(事件源对象名称)
 
下面是一个button注册实现ActionListener接口的监听器,监听button的ActionEvent事件,并执行对应actionPerformed方法的例子
 
 
内部类
当多个按钮需要监听同样的事件,但是想要针对不同的按钮执行不同的方法时怎么办?如果用getSource()去区分是哪个按钮事件源,可以实现,但是不是很很好,如果用外部的class类又没办法对其他类上的frame进行操作。而内部类可以解决这个问题(在外部类中定义多个内部类实现监听接口,不同的按钮绑定不同的监听器的类)
 
内部类:一个类嵌套在另一个类中,内部类可以使用外部所有的方法和变量(私有的也可以)
class MyouterClass{
     class MyinnerClass{ //内部类
          void go(){}
     }
}
 
内部类只能通过外部类的实例去创建内部类的实例,且每个内部类实例都是和当前外部类实例一一对应的
通过外部类实例创建内部类实例的两种方法:
1.在外部类的代码中实例化了内部类
2.先实例化外部类,然后内部类实例的引用类型为【外部类.内部类】,通过【外部类实例.new 内部类()】来创建一个实例
MyOuter outerObj=new Myouter();
MyOuter.MyInner innerObj=outerObj.new MyInner();
 
 
 

java基础七 [图形用户接口](阅读Head First Java记录)的更多相关文章

  1. Java基础七-正则表达式

    Java基础七-正则表达式 一.定义: 特定的符号的组合 二.作用: 用于操作字符串数据 三.优缺点 简化代码,但是阅读性差 四.引入 4.1 问题 判断一个号码是否是QQ号? 不是零开头 6-15位 ...

  2. Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP

    Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 上次我分享过Spring传统的A ...

  3. java基础十[包、Jar存档文件和部署](阅读Head First Java记录)

    将Java的class文件生成为可执行的Java应用程序.Java应用程序有三种:完全在本机执行的Jar(例如本机的GUI可执行程序):完全在服务器端远程执行的(例如浏览器来进行存取):介于两者之间的 ...

  4. Java基础教程1:环境配置及第一个HelloWorld.java

    本文主要介绍JDK环境配置.Sublime Text3配置及第一个HelloWorld.Java程序.运行环境为Win10系统,使用JDK1.8版本. 1. JDK下载及环境配置 1.1 JDK下载 ...

  5. Java基础学习总结(27)——7 款开源 Java 反编译工具

    今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...

  6. java基础三 [深入多态,接口和多态](阅读Head First Java记录)

    抽象类和抽象方法 1.抽象类的声明方法,在前面加上抽象类的关键词abstract abstract class canine extends animal{      public void roam ...

  7. java基础十一[远程部署的RMI](阅读Head First Java记录)

    方法的调用都是发生在相同堆上的两个对象之间(同一台机器的Java虚拟机),如果想要调用另一台机器上的对象,可以通过Socket进行输入/输出. 远程过程调用需要创建出4种东西:服务器.客户端.服务器辅 ...

  8. java基础九[网络与线程](阅读Head First Java记录)

    网络socket连接 Java API的网络功能包(java.net)已经将底层的TCP连接等都封装好了,我们只需要通过Socket对象来建立客户端和服务器的连接,然后客户端能向服务器发送请求,并接收 ...

  9. java基础八 [序列化和文件的输入/输出](阅读Head First Java记录)

    对象具有状态和行为两种属性.行为存在类中的方法中,想要保存状态有多种方法,这里介绍两种: 一是保存整个当前对象本身(通过序列化):一是将对象中各个状态值保存到文件中(这种方式可以给其他非JAVA程序用 ...

随机推荐

  1. 排序算法总结(三)选择排序【Select Sort】

    一.原理 选择排序的原理非常简单,就是选出最小(大)的数放在第一位,在剩下的数中,选出最小(大)的数,放在第二位......重复上述步骤,直到最后一个数. 二.过程 原始数据 第一次排序,选出最小的数 ...

  2. 转 https://www.zhihu.com/question/27606493/answer/37447829

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:梁川链接:https://www.zhihu.com/question/27606493/answer/37447829来源: ...

  3. AHS日志收集的三种方法

    硬件环境:(描述实验机器初始环境) 型号 DL380 G8 序列号   配置扩展   备注   软件环境: □  操作系统:无 连接方式: □  无 实验步骤: 1在ILO里点information点 ...

  4. smarty中如何统计数组的个数?

    在做web前端中,很多人会遇到在smarty中如何统计数组的个数,其实很简单 比如数组$array 你只需要用{$array|@count}就可以获取.

  5. 【AT91SAM3S】英倍特串口示例工程05-UART中,串口是怎样初始化的

    在这个示例工程的main.c文件中,进入main之后,没有发现串口功能的任何配置.直接使用了printf这个东西进行输出.将软件下载到开发板上之后,在电脑端使用串口软件,可以看板子有数据发来.说明这个 ...

  6. oracle直通车第二周习题

    1.教材第二章课后作业 1,2,3,4题. 答:1. 创建一查询,显示与Blake在同一部门工作的雇员的项目和受雇日期,但是Blake不包含在内. 2. 显示位置在Dallas的部门内的雇员姓名.变化 ...

  7. 有关项目上潜在需要的移动端GIS系统源码整理,待后续更新

    GPS Tools For Android 前言: GPS数据在做GIS开发时的一份宝贵的数据,在不侵犯他人隐私的情况下通过互联网的模式收集GPS是成本最为低廉的一种模式. 背景: 现在公司在做一个项 ...

  8. 【转】Cordova文件传输插件fileTransfer

    任务要求: 访问手机的目录,选择一个文件,并使用该插件将指定文件传输到远程主机的某个指定目录中. HTML <!DOCTYPE html> <!-- Licensed to the ...

  9. [ActionScript 3.0] AS3.0 涂鸦及擦除功能,撤销重做步骤记录实例

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMo ...

  10. Sybase alter 用法

    原文地址:http://lujinan858.iteye.com/blog/437019 --示例 1 为表添加列.Adaptive Server 为表中每个现有行分配一个 NULL --列值: al ...