ja swing

前言

到目前为止,我们编写的所有程序都通过键盘接收输入,并在控制台屏幕上显示结果。大多数用户不喜欢这种交互方式。现代程序长期不用这种方法,尤其是网络程序。

从本章开始,我们将介绍如何使用图形用户界面(GUI)编写Ja程序。其中,主要讲述了如何编写一个定义窗口在屏幕上的大小和位置的程序;如何在窗口中以多种字体显示文本;如何显示图像等等。这些都是需要掌握的编程技巧,在后面的章节中,会用到这些技术来编写一些有趣的程序。

Swing概述

Ja 1.0刚出现的时候,包含了基本GUI编程的类库,Sun称之为抽象窗口。

口腔工具箱(AWT)。基本AWT库将处理用户界面元素的任务委托给每个目标平台(Windows、Solaris、Macintosh等)的本地GUI工具箱。),而本地GUI工具箱负责用户界面元素的创建和动作。例如,如果您使用原始的AWT在Ja窗口中放置一个文本框,将会有一个低级别的“对等”文本框来实际处理文本输入。理论上,生成的程序可以在任何平台上运行,但是外观和感觉的效果取决于目标平台。所以,孙公司的口号是“写一次,用遍”。

对于简单的应用,基于对等的方法效果不错,但是如果要编写一个依赖于本地用户界面元素的高质量可移植的图形库,就会有缺陷。例如,不同平台上的菜单、滚动条和文本字段等用户界面元素的操作行为存在一些微妙的差异。因此,要给用户一个一致的、可预测的界面操作方式是相当困难的。而且有些图形环境(如X11/Motif)的用户界面模块集合不如Windows或Macintosh丰富。这也把基于对等体的可移植库限制在了“最小公分母”的范围内。因此,AWT构建的GUI应用程序看起来没有Windows或Macintosh应用程序漂亮,也没有提供那些平台用户认可的功能。更糟糕的是,不同平台的AWT用户界面库中存在不同的bug。R&D人员必须在每个平台上测试他们的应用程序,所以人们戏称AWT为“编写一次,到处调试”。

1996年,网景创建了一个名为IFC(Internet Foundation Class)的GUI库,采用了与AWT完全不同的工作模式。它在空白色窗口上绘制按钮、菜单等用户界面元素,而对等方只需要创建并绘制窗口。因此,Netscape的IFC组件在程序运行的所有平台上看起来和行为都是一样的。Sun与Netscape合作完善了这种方法,并创建了一个名为Swing(有时称为Swing Set)的用户界面库。Swing可以作为Ja 1.1的扩展,现在它已经成为JDK 1.2标准库的一部分。

正如艾灵顿公爵所说,“没有Swing,Ja图形界面将毫无意义”。现在,Swing是不平等的基于GUI的工具箱的正式名称。它已经是Ja基础类(JFC)的一部分。完整的JFC是巨大的,它包含了比Swing GUI工具箱更多的内容。JFC的特性不仅包括Swing组件,还包括可访问的API、2D API和可拖动API。

注意:Swing并没有完全取代AWT,而是基于AWT架构。Swing只提供了更强大的用户界面模块。尤其是在Swing写的程序中,需要使用基本的AWT来处理事件。从现在开始,“Swing”指的是“drawn”非对等用户界面类;“AWT”是指事件处理等窗口工具箱的底层机制。

当然,在用户屏幕上显示基于Swing的用户界面的元素比基于AWT的对等组件要慢。鉴于以往的经验,对于任何现代计算机来说,微小的速度差异都是无害的。此外,由于以下不可抗拒的原因,人们选择摇摆:

Swing拥有丰富而方便的用户界面元素集合。

Swing对底层平台的依赖很小,所以平台相关的bug很少。

Swing给不同平台的用户带来一致的感官效果。

这一切都意味着,Swing有能力兑现孙“写一次,到处跑”的承诺。

但是,上面的第三点有一个潜在的问题:如果用户界面元素在所有平台上看起来都一样,那么它们可能与本地控件不同,这些平台的用户可能不熟悉这一点。

Swing采用了一种巧妙的方式来解决这个问题。当程序员编写Swing程序时,他们可以为程序指定一个特殊的“外观和感觉”。

例如,图7-1和图7-2显示了在Windows和Motif平台上运行的相同程序的效果。

java swing

注意:虽然这本书并不打算介绍如何设置“观感”,但是Ja程序员可以扩展现有的观感,甚至设计新的观感。设计Swing组件的绘图方法是一个繁琐的过程。一些程序员已经做了一些这样的工作,特别是将Ja移植到kiosk终端和手持设备等非传统平台上。参见http://www.jooto.com,它包含了一系列有趣的外观和感觉实现。

JDK 5.0引入了一种新的外观和感觉方法,叫做Synth,它很容易操作。在Synth中,您可以通过指定图像文件和XML描述符来定义新的外观,而无需编写任何代码。

此外,Sun还开发了一种独立于平台的外观,称为“Metal”。现在,市场上的人称之为“Ja观感”。但是,绝大多数程序员继续使用“金属”这个术语,在本书中也会用到。

有些人批评金属有点笨重,但在5.0版本中它看起来是全新的(见图7-3)。

现在,金属外观支持多种主题,每个主题的颜色和字体都有细微的变化。

默认主题名为“海洋”。在本文中,所有图形程序都将采用Swing的金属外观和感觉以及海洋主题。

注意:Swing用于大多数Ja用户界面编程,但是有一个特殊的例外。Eclipse集成开发环境使用了一个类似于AWT的图形工具箱,名为SWT,可以映射到不同平台的本地组件。

关于SWT的描述可以在http://www.eclipse.org/文章网站上找到。

最后,我想给你一个建议。如果你使用过Visual Baisc或者C#编写过微软Windows应用,你应该明白这些产品提供的图形布局工具和资源编辑器所带来的便利。这些工具可以用来设计应用程序的外观,然后生成大多数(有时是全部)GUI代码。虽然有一些针对Ja编程的GUI构造器,但是相对于相应的Windows工具来说还是不成熟的。无论如何,如果你想完全掌握图形用户界面程序(甚至有效地使用这些工具),你需要知道如何手动创建用户界面。当然,你通常需要写很多代码。

创建框架

在Ja中,顶级窗口(即不包含在其他窗口中的窗口)称为框架。AWT库中有一个类叫Frame,用来描述顶层窗口。这个类的Swing版本称为JFrame,它扩展到了Frame类。JFrame是少数不在画布上绘制的Swing组件之一。因此,它的装饰部分(按钮、标题栏、图标等。)都是用户的窗口系统画的,不是Swing画的。

警告:大部分Swing组件类都是以“j”开头的,例如utton、JFrame等。Ja里有Button和Frame这样的类,但都属于AWT组件。如果不小心忘记写“j”,程序仍然可以编译运行,但是混合使用Swing和AWT组件会导致视觉和行为上的不一致。

在本节中,我们将介绍有关Swing的JFrame的常用方法。例7-1给出了一个在屏幕上显示空帧的简单程序。如图7-4所示。

实施例7-1 SimpleFrameTest.ja

让我们一行一行地讨论这个程序。

Swing类位于jax.swing包中。包名jax表明这是一个Ja扩展包,而不是核心包。Swing类实际上是Ja 1.1的扩展。由于Swing类不是核心层次结构的一部分,所以尽可能将Swing类加载到ja 1.1兼容的浏览器中(浏览器的安全管理器不允许添加任何以“ja”开头的包。).在Ja 2平台上,Swing包不再是扩展部分,而是核心层的一部分。任何与Ja 2兼容的Ja实现都必须提供Swing类。但是,为了与Ja 1.1代码兼容,保留了jax名称。(其实Swing包本来是com.sun.ja.swing,后来在ja 2的测试版中简化为ja.awt.swing,最后在Ja 2的测试版中又变回com.ja.swing,最后在Ja程序员的抗议下改成了jax.swing。)

默认情况下,帧的大小为0×0像素,没有实际意义。我们定义了一个子类SimpleFrame,其构造函数将帧大小设置为300×200像素。在SimpleFrameTest类的main方法中,程序将通过创建pleFrame对象开始运行。

接下来,我们定义当用户关闭框架时的响应动作。对于这个程序,我们只是让程序退出。选择这个响应动作的语句是:

frame . setdefaultcloseoperation(JFrame。EXIT _ ON _ CLOSE);

在一个有多个框架的程序中,你不能因为用户关闭了其中一个框架就让程序退出。默认情况下,用户只在关闭窗口时隐藏框架,但程序不会终止。

简单构造一个框架是不会自动显示的,框架一开始是不可见的。这给了程序员一个机会,在框架第一次显示之前向框架添加组件。为了显示框架,main方法需要调用框架的setVisible方法。

然后,主方法退出。需要注意的是,退出main并不会终止程序,只是终止了主线程。当前显示的框架激活用户界面线程以保持程序活动。

注意:在JDK 5.0之前,可以使用JFrame类从超类窗口继承show方法。Window类的超类是Component,它也有一个show方法。在JDK 1.2中不推荐使用Component.show。如果要显示组件,建议调用setVisible(true)。然而,在JDK 1.4之前,没有人反对使用Window.show方法。其实这个方法很实用。它可以使窗口可见,并把它放在其他窗口的前面。可惜因为不提倡,也失去了这个好处,JDK 5.0也不赞成使用show显示窗口。

图7-4显示了运行例7-1中程序的结果,这只是一个非常无聊的顶层窗口。这个图中看到的标题栏和轮廓装饰(比如调整窗口大小的角)都是操作系统画的,而不是Swing库。如果在X Windows下运行同样的程序,框架的装饰就不一样了。Swing库负责绘制框架中的所有内容。在这个程序中,只有默认的背景色被用来填充框架。

注意:在JDK 1.4中,可以调用frame.setUndecorated(true)关闭所有框架装饰。

注意:在前面的例子中,编写了两个类,一个用于定义frame类,另一个包含创建和显示frame对象的主要方法。在很多程序中,经常会发现main方法被打包成一个非常简单的类,如下所示:

从某种意义上说,在框架类中调用main方法的代码启动器是比较简单的。这消除了引入其他辅助类的需要。但是,相当多的程序员觉得这种程序风格有点混乱。

所以更愿意把启动程序的类和定义用户界面的类分开。

觉得文章不错的话,可以转发关注小编一波,每天持续更新好文!!!

明天我会讲框架定位和在面板中显示信息~ ~

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论