`

黑马程序员Java培训和Android培训Java GUI图形用户界面

阅读更多
黑马程序员

GUI/图形用户界面
AWt的基础知识
GUI全称是Graphical User Interface即用户图形界面。

JDK中提供了AWT和Swing两个包,用于GUI程序的设计和开发。AWT不足以完全应对基于GUI的程序设计,Swing包补充完善了AWT,使得AWT更加丰富完善,可以应对基于GUI的程序设计。

GUI组件可以分为两大类:基本组件(又被称之为构件像按钮文本框之类的用户图形元素,在其上不能容纳其他组件或元素)和容器(例如对话框),分别是java.awt.Component和java.awt.Container的直接或间接子类。

程序的GUI部分由AWT线程管理。编程举例:让框架窗口显示5秒钟后关闭,查看AWT线程的状态。
AWT的事件处理
GUI组件上的图形操作
常用的AWT组件
布局管理器
Swing

AWT事件处理:
事件处理机制:
三个重要概念:
   事件:用户对组件的一个操作,称之为一个事件。
   事件源:发生事件的组件就是事件源。
   事件处理器:某个Java类中的负责处理事件的成员方法。


事件分类:
按产生事件的物理操作和GUI组件的表现效果进行分类:
MouseEvent
WindowEvent
ActionEvent 是一种语义。
按事件的性质分类:
低级事件
语义事件(又叫高级事件)

事件监听器:
一个事件监听器对象负责处理一类事件。
一类事件的每一种发生情况,分别由事件监听器对象中的一个方法来具体处理。
在事件源和事件监听器对象中进行约定的接口类,被称为事件监听器接口。
事件监听器接口类的名称与事件类的名称是相应的,例如,MouseEvent事件类的监听器接口名为MouseListener.

编程实例:实现关闭窗口的事件处理,讲解用不同层次的事件类型来表示同一个事件源对象。
其中用到的函数
public void windowClosing(Windowevent parm1)
{
  parm1.getWindow().setvisible(false);
  //parm1.getSource();   //返回事件源
// parm1.getComponent();  //返回发生事件的组件
  ((Window)parm1.getComponent()).dispose();//强制类型转换后才可以使用那个类型中的方法。
}


处理发生在某个GUI组件上的XxxEvent事件的某种情况,其事件处理的通用编写流程:
---编写一个实现 XxxListener接口的事件监听器类:
---XxxListener类中的用于处理该事件情况的方法中,编写处理代码;
---调用组件的addXxxListener方法,将类XxxListener创建的实例对象注册到GUI组件上
事件适配器:
灵活设计事件监听器类:
用匿名内部类实现事件监听器:
事件处理的多重运用
修改组件的默认事件处理方式

JDK中也提供了大多数事件监听器接口的最简单的实现类,称之为事件适配器(Adapter)类。

用事件适配器来处理事件,可以简化事件监听器编写。

编程实例:使用事件适配器时的常见问题,解决问题的思路:
---是方法没被调用,还是方法中的程序代码的执行问题?
---是方法名写错了,还是没有注册事件监听器?
事件适配器类的不足之处。

灵活设计事件监听器类
如果要在事件监听器类中访问非事件源的其他GUI组件,程序该如何编写?

事件处理的多重运用
如何知道一个GUI组件到底能够触发哪几种事件?
一个组件上的一个动作可以产生多种不同类型的事件
一个事件监听器对象可以注册到多个事件源上
在一个事件源上也可以注册对同一类事件进行处理的多个事件监听器对象

修改组件的默认事件处理方式
只有在一个组件上注册了某种事件的监听器对象后,组件才会产生相应的事件对象。
默认的processEvent方法调用相应的processXxxEvent方法。
调用enableEvents(long eventsToEnable)方法,可以在即使没有注册事件监听器的情况下,组件也能够对某些类型的事件进行响应和产生相应的事件对象。

编程实例:在一个窗口上显示一个按钮,一旦鼠标移动到这个按钮上时,按钮就移动到了其他位置,这样,鼠标就永远无法点击到这个按钮。

GUI组件上的图形操作

Graphics类与图形绘制
Component.getGraphics()方法和Graphics类
getGraphics()方法为组件创建一个图形上下文。如果组件当前是不可显示的,则此方法返回 null。 Graphics类:Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制。 Graphics 对象封装了 Java 支持的基本呈现操作所需的状态信息。此状态信息包括以下属性:


要在其上绘制的 Component 对象。
呈现和剪贴坐标的转换原点。
当前剪贴区。
当前颜色。
当前字体。
当前逻辑像素操作函数(XOR 或 Paint)。
当前 XOR 交替颜色

Graphics.drawLine(int x1,int y1,intx2,int y2)方法。
Graphics.drawString(String str,int x,int y)方法。
Graphics.drawString方法的坐标参数是相对于矩形框的左下角。

编程举例:以鼠标在窗口中按下时的位置作为起始点,鼠标释放时的位置作为终止点,在鼠标释放时将直线画出,并在每条直线的起始点和终止点位置上打印出它们的坐标值。利用Graphics.drawLine()和Graphics.drawString()方法进行绘制。



组件重绘的处理

组件重绘的原理。
paint(Graphics g)的作用。
AWT线程对组件重绘的调用过程。(有图)。
利用 public void paint()方法进行组件重绘,在方法中记录绘画的组件的各种信息。
Vector vLine=new Vector();Enumeration e=vLines.elements(); MyLine line=(MyLine)e.nextElement();  由于e.nextElement返回的类型是Object所以要强制转换。
repaint()方法可以导致窗口重绘。

编程举例:在窗口上画直线和打印文本的功能,并在窗口重绘后重绘窗口上的所有直线。

图像显示
双缓冲技术

图像显示  如何在GUI组件上显示图像

使用Graphics.drawImage(Image img,int x,int y,ImageObserver observer)方法显示图像。Image 对象只有在使用的时候才会加载。 用ImageObserver对象监视进度。(Image类)

使用Component.getTookit.getImage(String path)语句获得Image实例对象。

编程实例:在窗口上显示图像文件中的图像,并解决由于drawImage内部实现机制造成的图像不能显示问题,和实现图像的永久显示。

多次调用drawImage()方法,图像才能显示出来。
利用 public void paint(Graphics g)方法可以弥补多次调用drawImage()方法的不足。

双缓冲技术

Component.createImage方法创建内存Image对象。
在Image对象上进行绘制的结果就成了一幅图像。
在Image对象上执行与组件表面同样的绘制,Image对象中的图像时组件表面内容的复制,当组件重画时,只需要将内存中的Image对象在组件上画出。

编程实例:使用双缓冲区技术重绘组件表面的所有图形。

常用的AWT组件
java.lang.Object(Borderlayout  CardLayout CheckBoxGroup Color Event Font FlowLayout Fontmetrics Graphics GridBagLayout GridLayOut Image Insets Point Polygon Rectangle Tookit MenuComponent(MenuBar MenuItem(Menu--PopupMenu  CheckboxMenuItem)) Component(Button Canvas Checkbox Choice Container(Panel(Applet(java.applet.package)) Window(Dialog--FileDialog) ScrollPane) Label List Scrollbar TextComponent(TextArea TextField)))

java.lang.Object----java.awt.geom.Dimension2D----Dimension

Exceptions----AWTException     Errors----AWTError



Canvas
Canvas是具有最基本和最简单的GUI功能的组件。
Canvas代表屏幕上的一块空白的矩形区域,程序能够在这个部件表面绘画,也能够捕获用户的操作,产生相应的事件。
当要设计自定制的具有GUI功能的组件类时,继承Canvas将会大大简化编程难度。可以覆盖paint(Graphics g)和update(Graphics g)方法。

编程实例:设计一个自定制的计时器组件,当鼠标在计时器组件上按下时,计时器开始计时,并显示计时时间,当鼠标释放时,计时器停止计时。
drawString();
SimpleDateFormat sdf=new SimpleDateFormat(); sdf.parase();
repaint();

代码在E:\Jcreator3.5\JCreatorV3LE\MyProjects中的StopWatch.java TestStopWatch.java  TestStopWatchFrame.java中

菜单

一个完整的菜单系统由菜单条,菜单和菜单项组成,它们之间的关系如图:
Java中与菜单相关的类主要有:MennuBar(菜单条),Menu(菜单),MenuItem(菜单项)。

编程实例:实现图中的菜单和相关事件处理。
MenuBar add( Menu add (MenuItem CheckboxmenuItem))
最后用setMenubar()来将Menubar 的实例添加到窗口中。
利用继承ActionListener接口来实现监听器类,在监听器类中实现actionPerformed(ActionEvent e)方法,来实现相关的动作。将要添加动作事件的对象用方法add()。用getActionCommand()方法来获得选择的菜单项的名字。

setActionCommand()方法的作用:
设置由此XXX引发的动作事件的命令名。


Container
有些组件不能独立显现,只能放在一个容器中使用。例如Frame窗口。
Container类是所有容器类的父类,Container.add方法用于将组件添加到容器中。
Container也是Component的子类,因此也可以作为组件增加到其他容器上。
Component类下面有Container类,Container类下有Window和Panel类;Window下面有Frame和Dialog类;Panel类下面有Applet。Window,Frame,Dialog统称为 Borderlayout。 Panel和Applet被称为FlowLayout。
将窗口的显示设置在主函数中将其他组件设置以后的后面。否则会造成某些组件显示不出来。

Dialog与FileDialog类
Dialog类用于产生对话框。但是没有菜单条,也不能改变大小。一般用于临时显示的窗口。用于显示提示信息或接受客户的输入。对话框不能独立的存在,必须有个上级窗口。

模态对话框和非模态对话框。模态对话框特点是在没有关闭模态对话框时不能操作同一个程序的其他窗口。而非模态对话框则可以。
getOwner()方法。
Dialog类的两个常用的构造方法:
public Dialog(Frame owner,String title);
public Dialog(Frame owner,String title,boolean modal)

编程实例:主框架窗口通过两个按钮分别打开一个模态对话框和一个非模态对话框,并与这两个对话框进行数据交换。

内部类中的某个函数需要调用外部类的实例对象,应该使用 外部类名称.this 来调用。
访问控制是为了实现封装的特性。

FileDialog类是Dialog类的一个子类,能够产生标准的文件存取对话框。

Checkbox
Checkbox类用来建立单选按钮或多选按钮(也叫复选框)。

创建多选按钮,只需要使用构造函数:
Checkbox(String label,boolean state)

创建单选按钮,需要使用构造函数:
Checkbox(String label,boolean state,CheckboxGroup group)

单选按钮和多选按钮的语义事件为ItemEvent,对应的监听器接口为ItemListener,该接口中只有一个itemStateChanged方法。

编程实例 :创建一个多选按钮和两个属于同一组的单选按钮,并对每个按钮的选中情况进行处理。

jdk1.6中的ItemListener中没有itemStateChangded方法。
切记如果写了事件监听器方法,一定要把它添加到要监听的对象中。并且得放入构造函数中。



Choice
Choice类用来制作单选下拉列表框.

Choice类的语义事件为ItemEvent,对应的监听器接口为ItemListener,该接口中只有一个itemStateChanged方法。

编程举例:实现类表框和相关事件处理。


Panel与ScrollPanel类
Panel类是一个容器类,用于产生一种特殊的空白面板,可以容纳其他的组件,但不能独立存在。

ScrollPanel类是一种容器类,用于产生滚动窗口,通过滚动条在一个较小的容器窗口中显示较大的子部件。

编程举例: 如何使用ScrollPane
十一
布局管理器
一个容器中的各个组件之间的位置和大小关系就称之为布局。

Java语言提供了布局管理器来管理组件在容器中的布局,而不是直接使用位置坐标 来设置各个组件的位置和大小。

AWT中的布局管理器类:
  --BorderLayout(默认的)
  --FlowLayout
  --GridLayout
  --CardLayout
  --GridbagLayout  "布局管理器之王"GridBagLayout 类是一个灵活的布局管理器,它不要求组件的大小相同便可以将组件垂直、水平或沿它们的基线对齐。

编程实例:
了解BorderLayout布局管理器的作用:将窗口划分为东西南北中五部分。


FlowLayout

编程实例:了解FlowLayout布局管理器的作用。

利用setLayout(new FlowLayout())创建该布局管理器。


GridLayout

GridLayout布局管理器将容器划分成若干行列的网格,在容器上添加组件时,它们会按从左到右,从上到下的顺序在网格中排列。

在GridLayout的构造方法中,需要指定在容器上划分的网格的行,列数。




CardLayout
CardLayout布局管理器能够实现将多个组件放在同一容器区域内的交替显示,相当于多张卡片摞在一起,在任何时候都只有最上面的一个可见。

编程实例:创建两个Panel对象,每个Panel上都能拥有一个布局管理器,左边的Panel使用GridLayout布局管理器放置了3个按钮,右边的Panel上使用 CardLayout布局管路器放置卡片,最后在窗口上使用BordLayout放置这两个Panel面板。右边的Panel中带有5张卡片(用五个按钮模拟),按下左边Panel中的prev按钮,依次向前显示,按下next按钮,依次向后显示,按下three按钮,显示第三张卡片。


取消布局管理器

调用Container.setLayout(null)方法取消布局管理器设置,在这种情况下,可以调用Component.setBounds方法来用绝对坐标设置容器上的每个组件的大小和位置。

不使用布局管理器将会给程序带来一个潜在的问题,当容器大小改变时,所有组件仍保持原来的位置和大小,将导致整个程序界面比较"难看"。

编程实例:演示不使用布局管理器的效果
十二
Swing和JFC
所有的Swing组件,位于javax.swing包中,他们是构筑AWT上层的GUI组件,Swing组件时JComponent类的子类,Jcomponent又是java.awt.Container的子类。

为了保证可移植性,Swing完全用Java语言编写。

Swing提供了比AWT更多的组件库,例如, JTable,JTree,JComboBox。

Swing也增强了AWT中原有组件的功能,例如,与AWT中的Button对应的Swing组件时JButton。

JFC(java Foundation Class)是指Sun对早期的JDK进行扩展的部分,集合了Swing组件和其他能简化开发的API类,包括Swing,java 2D,accessibility,internationalization。

编程实例:从AWT过渡到Swing


JFrame

JFrame是AWT中的Frame相对应的Swing组件。

JFrame上面只你能有一个唯一的组件,这个组件为JRootPane,调用JFrame.getContentPane()方法可获得JFrame中内置的JRootPane对象

应用程序不能直接在JFrame实例对象上增加组件和设置布局管理器,而应该在JRootPane对象上增加子组件和设置布局管理器。

调用JFrame的setDefaultCloseOperation方法,可以设置单击窗口上的关闭按钮时的事件处理方式,例如,当设置值为JFrame.EXIT_ON_CLOSE时,单击JFrame窗口上的关闭按钮,将直接关闭JFrame框架窗口并结束程序运行。

编程实例:使用JFrame来创建程序的主框架窗口。




JScrollPane
JScrollPane是与AWT中的ScrollPane相对应的Swing组件。

最基本的JScrollPane由水平和垂直方向上的JScrollBar,以及一个JViewport组成。

调用JScrollPane,getViewPort方法,可以获得代表滚动窗口中的视图区域的JViewport对象。

调用JViewport.setView方法,可以将滚动窗口中要显示的内容作为子组件增加到JViewport上。

<<Java指南>>(可从SUN公司的网站上下载,英文名称为The Java Tutorial)中,有关于 JScrollPane使用的详细指导。

编程实例:使用JScrollPane创建滚动窗口。


Swing中的标准对话框
JOptionPane类提供了若干个showXxxDialog静态方法,可用来产生简单的标准对话框。

showConfirmDialog(Component parentComponent,Object message,String title,int optionType,int messageType)中的每个参数的意义。

编程举例:使用JOptionPane类,在程序开始运行时,弹出一个对话框提示用户,在主框架窗口的关闭按钮被单击时,弹出一个对话框询问用户是否真的要结束程序运行。

JFileChooser类专门用来实现文件存取对话框。

<JDK安装目录>\Demo\jfc\FilechooserDemo目录下的程序代码,演示了在JFileChooser中如何设置文件列表过滤器。
十三
计算机界面的程序实现
要求:
单击任何按钮,按钮上面的数字或符号按从左到右的顺序显示在文本框中
文本框中的文字是右对齐显示

BoxLayout布局管理器:
BoxLayout是在Swing中新增加的一种布局管理器,它允许多个组件全部垂直拜访或全部水平摆放。

使用BoxLayout实现计算机界面





学习和开发GUI程序的建议
重在掌握GUI程序的一些基本原理和开发过程,通过学习AWT组件可以更容易掌握GUI程序的基本原理和开发过程,但在GUI程序开发中,应尽量使用Swing组件。

查阅JDK文档中的Swing包,通读一下其中所包含的组件,以了解Swing提供了哪些组件,但不必去仔细阅读每个组件的具体使用帮助。

只在要用到某个GUI组件时,才有必要仔细阅读这个组件的具体使用帮助。如果要快速掌握某个新遇到的组件的用法,最好是能够找到并参阅该组件的例子程序。

在JDK的demo程序目录中,或是<<Java指南>>(可从SUN公司的网站上下载,英文名为The Java tutorial)中,都能找到某些组件的应用范例。

参考别人的成功应用,是快速学习和完成工作的有效方式。


思考与实践(1)
1什么是事件,事件源和事件处理器,并描述三者的工作关系。
2描述事件处理的编码实现过程。
3描述事件监听器类和事件适配器类的关系与区别。
4描述在窗口上画直线的编写过程和组件重绘的原理。
5为课程中所讲的自定义计时器组件增加如下功能:允许程序设置计时器的显示文本的颜色,时间显示文本的字体大小随组件大小的改变而改变。
6结合JDK文档帮助,编写一个使用FileDialog选择文件名的例子程序。单击主窗口上的"打开"按钮,打开一个文本对话框,并将选择的文件路径显示在主窗口上的"打开"按钮左边的文本框中。在文件对话框中可以对文件类型进行过滤,每次打开文件对话框时,对话框中的初始显示目录为上次选择的文件所在的目录。
7修改前面实现计算机界面的程序代码,将增加单个按钮的代码用一个函数来实现,然后在一个循环语句中调用这个函数来增加所有的按钮。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics