摘要:
Linux系统在近几年发展神速,但是由于其GUI应用程序开发方法及其标准不统一导致开发效率低,界面不友好。而Java语言是一种极具潜力的多平台应用软件开发工具,在Linux平台上用Java开发GUI应用的技术目前国内仍极少使用。本文将对该方法的细节、特点及其意义作详细论述。
关键词:
Linux、开放源代码、GUI、Java、组件、容器、布局管理器
1、为什么要用Java开发LinuxGUI应用
1.1LinuxGUI应用开发现状
目前Linux操作系统在市场上呈现一种"叫好不叫座"的局面,在一定的程度上与在其上运行的好用的应用程序数量太少有着的密切的关系。尽管能在Linux上运行的应用程序已经很多,但大多数都较难安装与使用,而且很多不是很稳定。
要改善Linux应用程序的易用性,大量采用GUI(图形用户界面)是一个必然的趋势。但是目前Linux平台GUI应用程序的开发仍然不太容易。尽管有不少的开放源码开发工具在极力增强其GUI应用程序开发能力,但是由于标准不统一、资料太少等原因很难推广。Kylix等商业开发工具尽管具有大公司的技术实力支撑,但由于价格等因素也难以很快推广。这种局面不尽快打破,Linux的应用就不可能得到很快的普及。
综上所述,目前Linux应用软件开发领域急需一种容易学习、成本低、效率高的GUI应用程序开发方法。
1.2Java的特点
自1995年SunMicrosystem推出Java语言以来,Java语言与Java技术均得到了飞速的发展。因其强大的网络功能、良好的跨平台特性、较高的开发效率成为国内外软件开发领域的一种强大工具。
目前Java程序已经能运行在从Windows系列、Unix系列、MacOS系列到Linux等几乎所有操作系统平台上,而且特别重要的是它已经能做到"一次编写,到处运行";另一方面,与C 等传统程序设计语言相比,用Java来开发GUI应用程序的难度已经大大降低;加上Java语言所具有的纯面向对象、网络功能强大等特性,使得Java非常适于用来编制应用软件。
1.3用Java开发LinuxGUI应用的优点
正由于Java语言的特点以及Linux操作系统的发展现状,使得用Java语言来开发Linux平台GUI应用程序成为了一种很好的方法。
一方面,用Java语言在Linux平台上开发GUI应用程序对于习惯了在Windows平台上用Java编程的程序员来说无须改变编程习惯。因为Java有良好的跨平台特性,在Linux下编程与在Windows下编程没什么两样,如果用纯Java编程,则程序中使用的类、属性、方法等等都不用改变,甚至还可以在Windows下编辑、编译好Java程序再直接移植到Linux下执行。
另一方面,由于在Linux平台上存在大量的优秀的开放源代码软件开发工具,包括用于Java程序开发的如NetBeans等工具,这样如果在Linux平台上用这些开放源代码软件开发工具进行Java软件开发,其所需的成本可以比在Windows下进行开发低得多。当然在Linux下也存在像BorlandJbuilder、IBMVisualAge等商业Java软件开发工具,它们都具有强大的功能、完备的文档,更有利于在Linux上进行Java软件开发。
2、用Java开发LinuxGUI应用的基本方法
2.1开发环境的安装与配置
*JDK的安装
要Linux平台上开发Java应用,最基本的方式需要下载一个JDK,这是由Sun公司免费提供的一个Java软件开发包。下载得到的文件一般形如j2sdk1.3-linux.rpm.bin,首先将其拷贝到合适的目录(如/usr/src或/usr/local等)下,执行./j2sdk1.3-linux.rpm.bin,会产生一个j2sdk1.3-linux.rpm文件,这是一个典型的RPM软件包,再用RPM软件包管理工具就可直接安装JDK,在安装过程中会提示许可信息,同意其协议就可很顺利地安装了。
*路径的配置
为了做到在任意路径下均可直接执行Java编程相关命令,需要修改/etc/profile文件,在其中设置路径。具体方法是在其中加入这样一行:
PATH="$PATH/usr/jdk1.3"
这里/usr/jdk1.3是JDK的安装路径。
2.2基本开发过程
①编辑源程序
在Linux下有很多优秀的程序编辑器软件,例如在控制台下有著名的Emacs、vi、jed等,在Xwindow下有Xemacs、gedit、kedit等,这些软件通常都有语法着色、自动缩进等非常适合于程序编辑的功能。要在Linux系统下开发Java程序,首先需要用这些编辑器编辑Java源程序。至于具体用哪种编辑器要依个人的喜好而定,反正可用的软件很多。
②编译源程序
正确的编辑好Java源程序后,需要对其进行编译,以生成字节码文件。假定源程序文件名为Test.java,则可用如下形式:
javacTest.java
③调试运行程序
执行守编译命令后,对于源程序中的每一个类,系统将产生一个字节码文件,文件名为对应的类名,而其扩展名为class。一般地,每一个Java程序中应该有一个主类,该类是整个程序的入口。开发Java程序的下一步就是调试运行,仍以上面提到的情况为例,运行该Java程序的方法为:
javaTest
事实上解释器将解释执行Test.class文件并按其中的调用解释执行其它字节码文件。
2.3基本开发方法
其实无论在什么平台下,GUI应用程序的基本开发方法都是相似的。一般都包括下面这样四个步骤:
①创建容器
首先要创建一个GUI应用程序,需要创建一个用于容纳所有其它GUI组件元素的载体,Java中称为容器。典型的包括窗口(Window)、框架(Frame/JFrame)、对话框(Dialog/JDialog)、面板(Panel/JPanel)等。只有先创建了这些容器,其它界面元素如按钮(Button/JButton)、标签(Label/JLabel)、文本框(TextField/JTextField)等才有地方放。
②添加组件
为了实现GUI应用程序的功能,为了与用户交换,需要在容器上添加各种组件/控件。这需要根据具体的功能要求来决定用什么组件。例如,如果需要提示信息,可用标签(Label/JLabel);如果需要输入少量文本,可用文本框(TextField/JTextField);如果需要输入较多文本,可用文本区域(TextArea/JTextArea);如果需要输入密码,可用密码域(JPasswordField)等等。
③安排组件
与传统的Windows环境下的GUI软件开发工具不同,为了更好地实现跨平台,Java程序中各组件的位置、大小一般不是以绝对量来衡量,而是以相对量来衡量。例如有时候,程序的组件的位置是按"东/East"、"西/West"、"南/South"、"北/North"、"中/Center"这种方位来标识的。因此,在组织界面时,除了要考虑所需的组件种类外,还需要考虑如何安排这些组件的位置与大小。这一般是通过设置布局管理器(LayoutManager)及其相关属性来实现的。事实上上述按方位来安排组件就是采用了Java中多种布局管理器里的BorderLayout布局管理器。
④处理事件
为了完成一个GUI应用程序所应具备的功能,除了适当地安排各种组件产生美观的界面外,还需要处理各种界面元素事件,以便真正实现与用户的交换,完成程序的功能。在Java程序中这一般是通过实现适当的事件监听者接口来完成的。比如如果需要响应按钮事件,就需要实现ActionListener监听者接口;如果需要响应窗口事件,就需要实现WindowListener监听者接口。
3、开发实例
下面是一个在Linux下用Java开发GUI应用程序的实例。该程序的主要功能是提供一个用于输入用户名与密码以登录到某一系统的界面,如果用户输入相关信息后单击"登录"按钮,系统将在窗口的下半部分显示所输入的用户名与密码信息,如果单击"退出"按钮,程序将停止运行。如下图1所示:
本程序没有提供很强的功能,目的只在于介绍在Linux上用Java编写GUI应用程序的基本方法。以下是程序的源代码,其中的注释说明了GUI应用具体的创建步骤:
//以下三行用于引入添加组件、设置布局管理器及处理事件所需的软件包
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
//下行说明主类派生自JFrame/框架类,要实现ActionListener接口以处理动作事件
classLoginFrameextendsJFrameimplementsActionListener{
//以下四行用于声明要加到框架窗口中的所有组件
JLabelUserLabel,PasswordLabel,UserResult,PasswordResult;
JTextFieldUser;
JPasswordFieldPassword;
JButtonLoginButton,ExitButton;
publicLoginFrame(){
super("登录");//调用父类构造方法,设置窗口标题
setSize(300,200);//设置窗口大小
getContentPane().setLayout(newGridLayout(5,2,10,10));//设置布局管理器,将窗口分成5行2列,行、列间保留10个像素的空白
//以下8行具体创建组件实例
UserLabel=newJLabel("用户名称:");
PasswordLabel=newJLabel("用户密码:");
UserResult=newJLabel("");
PasswordResult=newJLabel("");
User=newJTextField(10);
Password=newJPasswordField(10);
LoginButton=newJButton("登录");
ExitButton=newJButton("退出");
//以下两行设置用于保存结果的标签的前景色属性
UserResult.setForeground(Color.blue);
PasswordResult.setForeground(Color.blue);
//以下两行为"登录"按钮与"退出"按钮注册监听者
LoginButton.addActionListener(this);
ExitButton.addActionListener(this);
//以下八行将所有组件加入到框架窗口中
getContentPane().add(UserLabel);
getContentPane().add(User);
getContentPane().add(PasswordLabel);
getContentPane().add(Password);
getContentPane().add(LoginButton);
getContentPane().add(ExitButton);
getContentPane().add(UserResult);
getContentPane().add(PasswordResult);
//以下一行用于窗口事件监听者注册
addWindowListener(newWindowManager());
setVisible(true);//使框架窗口变为可见
}
//以下函数用于处理按钮动作事件
publicvoidactionPerformed(ActionEventevt)
{
if(evt.getSource()==LoginButton)//表明按下了"登录"按钮
{
UserResult.setText("用户名称:" User.getText());
PasswordResult.setText("用户密码:" Password.getPassword());
}
else
if(evt.getSource()==ExitButton)//表明按下了"退出"按钮
{
dispose();
System.exit(0);
}
}
//以下为系统主函数,是程序的入口
publicstaticvoidmain(Stringargs[]){
LoginFramemainFrame=newLoginFrame();//创建框架窗口实例
}
}
classWindowManagerextendsWindowAdapter//窗口事件监听者类
{
publicvoidwindowClosing(WindowEventevt)//本方法用于窗口关闭事件
{
JFrameframe=(JFrame)(evt.getSource());
frame.dispose();
System.exit(0);
}
}
4、总结
用Java语言来开发Linux平台的图形用户界面应用程序,容易理解、容易学习、环境要求低、开发效率高,而且开发出来的应用程序可移植性好,可以直接移植到其它平台上运行而不会发生多大变化。这对于快速开发LinuxGUI应用软件,丰富Linux平台应用软件的种类,增强Linux应用软件功能,从而更好地普及Linux系统的应用都有巨大的推动作用。
[参考文献]
《21天学通Java2》LauraLemay、RogersCadenhead著,潇湘工作室译,人民邮电出版社2001年5月出版