java基础七 [图形用户接口](阅读Head First Java记录)

到目前为止我们接触的都是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();

时间: 2024-10-19 00:01:37

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

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

将Java的class文件生成为可执行的Java应用程序.Java应用程序有三种:完全在本机执行的Jar(例如本机的GUI可执行程序):完全在服务器端远程执行的(例如浏览器来进行存取):介于两者之间的组合(例如客户端在本地,与远程服务器交互) 将class文件生成JAR   指定编译时class类文件的存储目录 打JAR(JavaArchiveFile)包仅需要编译后的class类文件,不需要源代码.java文件.可以通过-d指定编译结果输出的class存放目录 例如:java -d ../cl

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

抽象类和抽象方法 1.抽象类的声明方法,在前面加上抽象类的关键词abstract abstract class canine extends animal{ public void roam(){} } 抽象类除了被继承过之外,是没有用途,没有值,没有目的.类中的方法可以当做子类的合约内容,合约是对其他程序的承诺协议 抽象类中可以带有抽象和非抽象的方法 如果类中有抽象方法,则类必定标识为抽象的. 2.抽象的方法没有实体 (因为方法中的程序代码没有意义.抽象类需要被extend过有意义,抽象方法一

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

方法的调用都是发生在相同堆上的两个对象之间(同一台机器的Java虚拟机),如果想要调用另一台机器上的对象,可以通过Socket进行输入/输出. 远程过程调用需要创建出4种东西:服务器.客户端.服务器辅助设施.客户端辅助设施 RMI Java的JMI提供客户端和服务器端的辅助设施对象(stub和skeleton,现在实际只用stub文件,客户端和服务端用一个) 辅助设施是实际执行通信的对象,他会让客户端感觉在调用本机,实际上辅助设施类似于代理,将客户端传送的信息通过Socket连接发送给服务端辅助

java基础五 [数字与静态](阅读Head First Java记录)

本章主要讲了静态变量.静态方法,final关键词.以及介绍了怎么对数字和日期进行格式化输出.这里对这些内容进行了整理.本章还介绍了java.util.Date和java.util.Calendar来操作日期,但是这个直接看API就比较清楚,这里就不写了. static static标记过的,与类的实例对象无关 静态方法: 使用static关键词来标记静态方法.有些方法不需要用到类的实例变量,静态变量的代表“一种不依靠实例变量也就不需要对象的行为”.Math就是一个静态方法 调用静态方法:类名.方

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

网络socket连接 Java API的网络功能包(java.net)已经将底层的TCP连接等都封装好了,我们只需要通过Socket对象来建立客户端和服务器的连接,然后客户端能向服务器发送请求,并接收服务端发来的数据即可 服务端和客户端大概的交互如下所示: 编写客户端程序 第一步:建立socket连接 需要客户端和服务器端都建立以下连接 Socket chatSocket=new Socket(“对方IP地址”,TCP端口号); IP类似门牌号,做寻址,找到服务器.端口号是找到这台服务器上的某个

java基础四 [构造器和垃圾回收](阅读Head First Java记录)

本章讲解了对象的创建到被回收的过程,讲述了对象的生命周期 堆(heap)与栈(stack) 实例变量:实例变量是只声明在类下,方法外的变量(实例变量默认值为0/0.0/false,引用的默认值为null) 局部变量:声明在方法中的变量,或方法中的参数.又被成为栈变量 例如: public class test{ int size; public void foof(int a){ int b; barf() } public void barf(){ Duck d =new Duck(24);

java基础六 [异常处理](阅读Head First Java记录)

在程序运行时,我们不能保证所有服务和方法都是正确的,如果发生问题报错会导致程序崩溃,所以需要对一些可以预见的错误进行异常处理,通过throw去抛出一个异常,然后用try..catch..将要执行的该方法括起来,通过它去捕获该方法可能throw的异常并进行处理 throw:抛出异常(只有方法抛出了异常,才能被try...catch...捕获) throw new FileIsTooSmallExcepton(); 捕获异常: try{ 要执行的方法 }catch(xxException e){ 接

java基础(七)之子类实例化

知识点;1.生成子类的过程2.使用super调用父类构造函数的方法 首先编写3个文件. Person.java class Person{ String name; int age; Person(){ System.out.println("None"); } Person(String name,int age){ this.name = name; this.age = age; System.out.println("Name: " + this.name

重学JAVA基础(七):线程的wait、notify、notifyAll、sleep

/** * 测试thread的wait notify notifyAll sleep Interrupted * @author tomsnail * @date 2015年4月20日 下午3:20:44 */ public class Test1 { /** * 对象锁 * @author tomsnail * @date 2015年4月20日 下午3:14:13 */ private static final Object lockObject = new Object(); /** * 等