第四章Java应用程序的基本框架

来源:互联网 发布:数据分散程度的统计量 编辑:程序博客网 时间:2024/06/05 06:45
学习一门新语言最好是先看几个简单的程序例子。下面我们将看到几个非常基本的程序例子。

 

4.1 Java应用程序的运行环境

Java应用程序是指可以独立运行在Java虚拟机上的程序,它是一种中间代码(byte-code)。比如你的应用程序叫my.java,程序里有一个名称为app1的类,用Javac或其它编译器,编译后将会生成app1.class,则在命令行状态下输入:java app1就可以运行此程序。注意,用java命令运行的类必须有main函数,否则不能执行。

与普通java应用程序不同的另一种Java程序叫Java Applet。我们把它译成Java小程序,这种程序后缀也是.class,但它不能直接在java虚拟机上运行,也就是输入java *.class不能运行,这种程序里可以没有main函数,它必须由某个浏览器来运行,比如Appletviewer或Netscape2.02以上等。这种程序我们将在后面章节中介绍。

4.2 最简单的Java程序解释

让我们来看一看最简单的Java应用程序例子,来理解一下它的结构:

Filename:1.java

class myfirst{

public static void main(String args[ ]) {

System.out.println ("This is my first Java Application");

}

}

这就是一个完整的Java应用程序,将它编译:

Javac 1.java

在当前目录下,它将生成myfirst.class文件,

Java myfirst

屏幕上将会输出:This is my first Java Application

让我们来一步一步分析每句话含义:

(1)class myfirst 这一行用关键词class来定义名为myfirst的新类,myfirst是新类的名称,必须是一个有效的标识符,有效标识符定义请见程序设计基础章节。

类的说明包括数据说明和成员函数说明,都放在类后面的大括号里面。一般类定义如下:

class 类名称{数据定义;函数定义;}

(2)public static void main (String args [ ] ) public是一个表示访问权限的关键字,表示此成员函数是公有的,可以被其他类直接调用,包括java解释器。

相对应的关键字有private和protected,friend。private表示只能被本类访问,protected表示只能被子类访问,friend是缺省的访问权限,表示能被本包(package)中任意类访问,对其它包中的类是不可访问的。

static 表示main成员函数在myfirst类的所有对象中是唯一的,因此如果本程序生成另一个myfirst类对象,调用的main函数将是同一个函数。

void 表示main函数没有返回值,如果有返回类型值,则可加上interger或boolean诸如此类,对于有返回值的函数,其函数实体的最后应加上return语句。

main这个函数是运行应用程序的入口点,因此编写应用程序是必须有main( )函数,且是唯一的。

(3)System.out.println 一句这一句是main函数里的功能语句,是调用Java里System包里的out类的println成员函数,是标准输入输出。

4.3 Java应用程序参数的传递

Java语言很类似C和C++语言。在C语言里,通过在命令行输入参数,C程序可由main函数读入这些参数,java程序也一样,请看下面程序:

Filename:2.java

class My2 {

public static void main (String args[ ] ) {

int arc = args.length;

if (arc>0) {

for (int i =0;i<arc;i++)

System.out.println (args[i] );

}else{

System.out.println ("Application have no args!");

}

}

}

编译:javac 2.java将在本目录下生成My2.class文件。

运行:java My2输出: Application have no args!

运行:java My2 arg1 arg2 arg3输出: arg1 arg2 arg3

这说明,java里参数的传递是这样的,命令行里类名后第一个参数放在args[0]里,第二个参数放在args[1]里,以此类推。

4.4 建立窗口Java程序基本框架

Frame介绍在Java语言里,Frame类的功能是创建图形用户界面(GUI)的基本窗口。在典型浏览器里,Frame类是显示GUI的父类。类的层次结构如下:

java.lang.Object

java.awt.Component

java.awt.Container

java.awt.Window

java.awt.Frame

Frame是从没有边框和菜单条的空白窗口扩充来的。这种窗口主要用在弹出式窗口方式下。Frame给窗口一个边框,一个布局和一个窗口条。你可以通过创建自己的多个Frame来创建图形用户界面的应用程序。我们已知道怎样建立独立的java应用程序,那么怎样将各种迷人的图形结合在一块呢?我们通过建立一个Frame来实现这个功能。

Frame让我们访问窗口,和applet工作区有许多相同的地方。下面是一个小的应用程序,它弹出一个框架并且在框架里显示信息(信息可以是命令行参数,也可以是缺省的信息)。如果你在窗口里点一下,程序退出。

基本框架程序:

import java.awt.*;

/* * Memo.java

*A simple stand-alone graphical application */

public class Memo extends Frame {

publc String motd;

public Memo(String s) {

//set our title

super("Memo Frame");

motd = s;

resize(300,300);

}

public Memo() {

this("This is a Memo");

}

public void paint(Graphics g) {

g.drawString(motd,15,15);

g.drawString("Click anywhere to Exit",15,25);

}

public void start() {

show();

}

public boolean mouseDown(Event e,int x,int y) {

//hide the window

hide();

//free up system resources

dispose();

//Quit the app

System.exit(0);

return false;

}

public static void main(String args[]) {

Memo m;

if (args.length > 1 ) {

m = new Memo(args[0]);

}else{

m = new Memo();

}

m.start();

}

}

将Frame联系起来

熟悉的函数

paint()和mouseDown(),看起来有点眼熟。这些函数与applet的函数一样。实际上,一个frame包含各种GUI组件与applet的形式一样。另一个熟悉的函数是start()。这个函数并不必要,因为我们没有覆盖任何已存在的函数。但你想继承applet编程的风格,你还是可以使用start(),stop(),init()与destroy()等函数。

新函数

我们熟悉的函数start()调用了show()。show()函数是Window类的继承,它显示Fame及其所有组件。在mouseDown()函数里我们看到两个函数:hide()和dispose()。hide()只简单地使Frame不可见。你可以在任何时候调用它来隐藏窗口。dispose()函数释放由Frame占有的系统资源。只有在你不需要Frame时才调用它。

构造函数

Memo例子还包含了一个新函数Memo()。其实这个类有两个Memo()函数!任何与类名相同的函数都是构造函数。它在创建一个新对象时被调用。你可以认为它是一个对象的init()初始化函数。为什么需要两个构造函数呢?有了两个构造函数,我们可以利用多态性的优点,有两种方法创建一个新Memo对象。我们可以简单的创建使用缺省信息的Memo对象:m = new Memo(); 或者,我们可以自己提供信息: m = new Memo("Our message"); Frame控制本程序的最后功能是在main()里建立并显示frame。它由以下两步实现:

//Step 1: m = new Memo();

//Step 2: m.start();

第一步初始化memo对象。我们象操作其它对象一样操作m。为显示frame,我们需要调用show()。这在第二步里实现。另一个要注意的是程序的健壮性。我们基本的frame里没有包含处理标准WINDOW_DESTROY消息的函数。这样你将不能在窗口的控制菜单里选中"Quit"或"Exit"。为了增加这个功能,你需要增加以下的处理程序:

public boolean handleEvent (Event e) {

if (e.id == Event.WINDOW_DESTROY) {

dispose();

System.exit(1);

return true;

}else{

//Go ahead and do what we normally would have done

return super.handleEvent(e);

}

}

菜单图形界面依靠菜单来指导用户操作。设计独立的Java应用程序时,Java提供创建和使用菜单的直接方法。象其它组件一样,new将创建一个菜单:

Menu optionMenu;

optionsMenu = new Menu("Options");

菜单项:

一旦你创建了一个菜单,你可以使用add()来组建菜单项:

optionsMenu.add(new MenuItem("Option1");

optionsMenu.add(new MenuItem("Option2");

菜单事件:

当你选中某个菜单项时,你创建此菜单项的字符串将在事件中返回。你可以象测试按钮选择一样测试菜单选择:

public boolean action (Event e, Object arg) {

...

if (e.target instanceof MenuItem) {

System.out.println((String) arg);

}

...

}

其它菜单项除了上面描述的简单菜单项外,你还可增加CheckBox菜单项,分割线,以及子菜单。下面是一些例子:

Menu m,n;

m = new Menu("Examples");

m.add(new MenuItem("Basic"));

m.add(new MenuItem("Simple"));

//add a separator

m.add(new MenuItem("-"));

//add a Checkbox item

m.add(new CheckboxMenuItem("Check"));

//add a submenu

n = new Menu("More Examples");

n.add(new MenuItem("Sub Basic"));

n.add(new MenuItem("Sub Simple"));

m.add(n);

菜单条

你创建好菜单后,你应将其放在应用程序的菜单条上:

mb = new Menubar();

mb.add(m);

mb.add(optionsMenu);

然后你可为applet设置菜单条:

setMenuBar(mb);

4.5 独立应用程序例子

为了看一个更复杂的独立的图形界面应用程序,下面有一个数字转换的例子:

import java.awt.*;

public class d2x extends Frame {

int decimalValue= 0;

String baseXValue = new String ("0");

TextField dDisplay,xDisplay;

//d2x constructor

public d2x() {

super("Decimal Converter");

//set the title of the frame

MenuBar mb = new MenuBar();

Button d2Binary = new Button("Binary");

Button d2Octal = new Button("Octal");

Button d2Hex = new Button("Hex");

Button d2Base36 = new Button("Base36");

Panel p1 = new Panel();

Panel p2 = new Panel();

Panel p3 = new Panel();

//add a simple menu

Menu m = new Menu("Application");

m.add(new CheckboxMenuItem("Base 36 Active");

m.add(new MenuItem("Exit"));

//add menu to menubar

mb.add(m);

setMenuBar(mb);

//install this menu bar in the frame

//Add buttons to their own panel

p3.setLayout(new FlowLayout());

p3.add(d2Binary);

p3.add(d2Octal);

p3.add(d2Hex);

p3.add(d2Base36);

//Add text fields

Label dLabel = new Label("Enter Deecimal: ");

Label xLabel = new Label("Converted Value: ");

dDisplay = new TextField(integer.toString(decimalValue),7);

xDisplay = new TextField(baseXValue,32);

xDisplay.setEditable(false);

p1.setLayout(new FlowLayout(FlowLayout.LEFT));

p2.setLayout(new FlowLayout(FlowLayout.LEFT));

p1.add(dLabel);

p1.add(dDisplay);

p2.add(xLabel);

p2.add(xDisplay);

//Add the panels

add("North",p1);

add("Center",p2);

add("South",p3);

}

//end d2x constructor

public void start() {

resize(400,150);

show();

}

public void updateXDisplay() {

xDisplay.setText(baseXValue);

}

public boolean handleEvent(Event evt) {

if (evt.targt intanceof MenuItem) {

if ("Exit".equals(((MenuItem)evt.target).getLabel())) {

hide();

dispose();

System.exit(0);

return false;

}

retrun true;

}else if (evt.target instanceof Button) {

String whick = ((Button)evt.target).getLabel();

if (whick.equals("Binary")) {

decimalValue = Integer.parseInt(dDisplay.getText());

baseXValue = Interger.toString(decimalValue,2);

}

if (whick.equals("Octal")) {

decimalValue = Integer.parseInt(dDisplay.getText());

baseXValue = Interger.toString(decimalValue,8);

}

if (whick.equals("Hex")) {

decimalValue = Integer.parseInt(dDisplay.getText());

baseXValue = Interger.toString(decimalValue,16);

}

if (whick.equals("36")) {

decimalValue = Integer.parseInt(dDisplay.getText());

baseXValue = Interger.toString(decimalValue,36);

}

updateXDisplay();

return true;

}

return false;

}

public static void main(String args[]) {

d2x m = new d2x();

m.start();

}

}

本章小结:

1.java有两种类型的应用程序,一种是直接运行在java虚拟机上,用java命令执行;另一种运行在浏览器里,由浏览 器调用执行,一般称它为Applet小程序。本书主要讨论第一种应用程序。

2.java应用程序是由类组成的,而且用java命令行执行的类必须有main入口函数。

3.与C语言相似,java程序也可由命令行传递给main函数参数。

4.基本窗口java程序的基本类是Frame。利用它可以很方便地建立图形用户界面程序。

原创粉丝点击