Java学习day066 图形程序设计(一)(Swing概述、创建框架)

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。

day066   图形程序设计(一)(Swing概述、创建框架)

到目前为止,我们编写的程序都是通过键盘接收输入,在控制台屏幕上显示结果。绝大多数用户并不喜欢这种交互方式。现代的程序早已不采用这种操作方法了,Web页面更是如此。下面我们一起学习如何编写使用图形用户界面(GUI)的Java程序。


1.Swing概述

在Java1.0刚刚出现的时候,包含了一个用于基本GUI程序设计的类库,Sun将它称为抽象窗口工具箱(Abstract Window Toolkit ,AWT)。基本AWT库采用将处理用户界面元素的任务委派给每个目标平台(Windows、Solaris、Macintosh等)的本地GUI工具箱的方式,由本地GUI工具箱负责用户界面元素的创建和动作。例如,如果使用最初的AWT在Java窗口中放置一个文本框,就会有一个低层的“对等体”文本框,用来真正地处理文本输人。从理论上说,结果程序可以运行在任何平台上,但观感(lookandfeel)的效果却依赖于目标平台,因此,Sun公司的口号是“一次编写,随处使用”。

对于简单的应用程序来说,基于对等体方法的效果还是不错的。但是,要想编写依赖于本地用户界面元素的高质量、可移植的图形库就会暴露出一些缺陷。例如,菜单、滚动条和文本域这些用户界面元素,在不同的平台上,操作行为存在着一些微妙的差别。因此,要想给予用户一致的、可预见性的界面操作方式是相当困难的。而且,有些图形环境(如X11/Motif)并没有像Windows或Macintosh这样丰富的用户界面组件集合。这也就将基于对等体的可移植库限制在了“最小公分母”的范围内。其结果使AWT构建的GUI应用程序看起来没有Windows或Macintosh应用程序显示的那么漂亮,也没有提供那些平台用户所认知的功能。更加糟糕的是,在不同平台上的AWT用户界面库中存在着不同的bug。研发人员必须在每一个平号上测试应用程序,因此人们嘲弄地将AWT称为“一次编写,随处调试”。

在1996年,Netscape创建了一种称为IFC(Internet Foundation Class)的GUI库,它采用了与AWT完全不同的工作方式。它将按钮、菜单这样的用户界面元素绘制在空白窗口上,而对等体只需要创建和绘制窗口。因此,Netscape的IFC组件在程序运行的所有平台上的外观和动作都一样。Sun与Netscape合作完善了这种方式,创建了一个名为Swing的用户界面库。Swing可作为Java1.1的扩展部分使用,现已成为JavaSE1.2标准库的一部分。

就像Duke Ellington所说的那样:“如果没有Swing,Java图形界面就没有任何意义”。现在,Swing是不对等基于GUI工具箱的正式名字。它已是Java基础类库(JavaFoundationClass,JFC)的一部分。完整的JFC十分庞大,其中包含的内容远远大于SwingGUI工具箱。JFC特性不仅仅包含了Swing组件,而且还包含了一个可访问性API、一2DAPI和一个可拖放API。

Swing没有完全替代AWT,而是基于AWT架构之上。Swing仅仅提供了能力更加强大的用户界面组件。尤其在采用Swing编写的程序中,还需要使用基本的AWT处理事件。从现在开始,Swing是指“被绘制的”用户界面类;AWT是指像事件处理这样的窗口工具箱的底层机制。

当然,在用户屏幕上显示基于Swing用户界面的元素要比显示AWT的基于对等体组件的速度慢一些。鉴于以往的经验,对于任何一台现代的计算机来说,微小的速度差别无妨大碍。另外,由于下列几点无法抗拒的原因,人们选择Swing:

•Swing拥有一个丰富、便捷的用户界面元素集合。

•Swing对底层平台依赖的很少,因此与平台相关的bug很少。

•Swing给予不同平台的用户一致的感觉。

不过,上面第三点存在着一个潜在的问题:如果在所有平台上用户界面元素看起来都一样,那么它们就有可能与本地控件不一样,而这些平台的用户对此可能并不熟悉。Swing采用了一种很巧妙的方式来解决这个问题。在程序员编写Swing程序时,可以为程序指定专门的“观感”。例如,下面1.2图展示了同一个程序在Windows和GTK平台下运行的观感。此外,Sun开发了一种称为Metal的独立于平台的观感。现在,市场上人们将它称为“Java观感”。

有些人批评Metal有点笨重,而在JavaSE5.0中看起来却焕然一新(图3)。现在,Metal外观支持多种主题,每一种主题的颜色和字体都有微小的变化。默认的主题叫做Oceano在JavaSE6中,Sun改进了对Windows和GTK本地观感的支持。Swing应用程序将会支持色彩主题的个性化设置,逼真地表现着动态按钮和变得十分时尚的滚动条。

                   

Java7提供了一个新观感,称为Nimbus(图4),不过默认情况下不可用。Nimbus使用了矢量绘图而不是位图绘图,所以它不依赖于屏幕分辨率。

                

有些用户希望Java应用使用其平台的本地观感,但另外一些用户可能更喜欢Metal或某种第三方观感。


2.创建框架

在Java中,顶层窗口(就是没有包含在其他窗口中的窗口)被称为框架(frame)。在AWT库中有一个称为Frame的类,用于描述顶层窗口。这个类的Swing版本名为JFrame,它扩展于Frame类。JFrame是极少数几个不绘制在画布上的Swing组件之一。因此,它的修饰部件(按钮、标题栏、图标等)由用户的窗口系统绘制,而不是由Swing绘制。

下面给出了一个在屏幕中显示一个空框架的简单程序:

/**
 *@author  zzehao
 */
import java.awt.*;
import javax.swing.*;

public class SimpleFrameTest
{
	public static void main(String[] agrs)
	{
		EventQueue.invokeLater(() ->
		{
			SimpleFrame frame = new SimpleFrame();
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setVisible(true);
		});
	}
}

class SimpleFrame extends JFrame
{
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;

	public SimpleFrame()
	{
		setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
	}
}

运行的结果:

                  

下面逐行地讲解一下这个程序。

Swing类位于javax.swing包中。包名javax表示这是一个Java扩展包,而不是核心包。出于历史原因Swing类被认为是一个扩展。不过从1.2版本开始,在每个JavaSE实现中都包含它。

在默认情况下,框架的大小为0x0像素,这种框架没有什么实际意义。这里定义了一个子类SimpleFmme,它的构造器将框架大小设置为300x200像素。这是SimpleFrame和JFrame之间唯一的差别。

在SimpleFrameTest类的main方法中,我们构造了一个SimpleFrame对象使它可见。

在每个Swing程序中,有两个技术问题需要强调。

首先,所有的Swing组件必须由事件分派线程(event dispatch thread)进行配置,线程将鼠标点击和按键控制转移到用户接口组件。下面的代码片断是事件分派线程中的执行代码:

EventQueue.invokeLater(() ->
{
    statements
});

接下来,定义一个用户关闭这个框架时的响应动作。对于这个程序而言,只让程序简单地退出即可。选择这个响应动作的语句是

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

在包含多个框架的程序中,不能在用户关闭其中的一个框架时就让程序退出。在默认情况下,用户关闭窗口时只是将框架隐藏起来,而程序并没有终止(在最后一个框架不可见之后,程序再终止,这样处理比较合适,而Swing却不是这样工作的)。

简单地构造框架是不会自动地显示出来的,框架起初是不可见的。这就给程序员了一个机会,可以在框架第一次显示之前往其中添加组件。为了显示框架,main方法需要调用框架的setVisible方法。

在初始化语句结束后,main方法退出。需要注意,退出main并没有终止程序,终止的只是主线程。事件分派线程保持程序处于激活状态,直到关闭框架或调用SyStem.exit方法终止程序。

这个程序的结果它只是一个很枯燥的顶层窗口。在这个图中看到的标题栏和外框装饰(比如,重置窗口大小的拐角)都是由操作系统绘制的,而不是Swing库。在Windows、GTK或Mac下运行同样的程序,将会得到不同的框架装饰。Swing库负责绘制框架内的所有内容。在这个程序中,只用默认的背景色填充了框架。


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值