分享
 
 
 

Java入门(9) JAVA与GUI

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

摘要

通过本章的学习,读者应能知道GUI(图形用户界面)的概念,并且能够使用Java语言来构建一个令人心旷神怡的GUI界面,使你的程序更具有感召力。把握标签、按钮、文本框、选择框、滚动条……等等各种GUI部件的使用方法。

--------------------------------------------------------------------------------

本章目标:

通过本章的学习,读者应能知道GUI(图形用户界面)的概念,并且能够使用Java语言来构建一个令人心旷神怡的GUI界面,使你的程序更具有感召力。把握标签、按钮、文本框、选择框、滚动条……等等各种GUI部件的使用方法。

9.1 用什么构建GUI

传授新知

早期,电脑向用户提供的是单调、枯燥、纯字符状态的“命令行界面(CLI)”。就是到现在,我们还可以依稀看到它们的身影:在Windows中开个DOS窗口,就可看到历史的足迹。

后来,Apple公司率先在电脑的操作系统中实现了图形化的用户界面(Graphical User Interface,简称GUI),但由于Apple公司封闭的市场策略,自己完成电脑硬件、操作系统、应用软件一条龙的产品,与其它PC不兼容。这使得Apple公司错过了一次一统全球PC的好机会。

后来,闻名的Microsoft公司推出了风靡全球的Windows操作系统,它凭借着优秀的图形化用户界面,一举奠定了操作系统标准的地位。这也造就了世界首富---比尔.盖茨和IT业的泰山北斗微软公司。

在这图形用户界面风行于世的今天,一个应用软件没有良好的GUI是无法让用户接受的。而Java语言也深知这一点的重要性,它提供了一套可以轻松构建GUI的工具。在本章和下一章中,我们将向你充分证实这一点。

在Java语言提供的GUI构建工具中,可以分为“部件”(component)和“容器”(container)两种。

在Java语言中,提供了以下部件:

§ 按钮

§ 标签

§ 复选框

§ 单选按钮

§ 选择框

§ 列表框

§ 文本框

§ 滚动条

§ 画布

§ 菜单

这些部件,我们在使用Windows操作系统时都碰到过,你通过操作它们来实现与程序的交互。

而光有“部件”就组不成程序,我们必须使用“容器”将这些“部件”装配起来,使其成为一个整体。Java语言还提供了以下“容器”:

§ 程序的启动封面

§ 窗体(form)

§ 对话框(Dialog)

Java语言是通过AWT(抽象窗口化工具包)和Java基础类(JFC或更常用的Swing)来提供这些GUI部件的。

其中Java.awt是最原始的GUI工具包,存放在java.awt包中。现在有许多功能被已被Swing取代并得到了很大的增加与提高,因此一般我们很少再使用Java.awt,但是AWT中还是包含了最核心的功能,通常,一个Java的GUI程序至少还要使用下面几个类:

§ java.awt.Color:基本颜色定义

§ java.awt.Font:基本字体定义

§ java.awt.Cursor:光标操作定义

而Swing则存放在javax.swing包中。

我们可以在Java的GUI程序的最前面加上以下两句就可以了:

import java.awt.*;

import javax.swing.*;

这样就可以一劳永逸了。

用Java开发一个GUI程序,通常需要以下几步:

1) 构建一个顶层容器;

2) 构建一个部件;

3) 用容器的add方法将部件加入到这个容器中;

我们马上就开始!

自测练习

1) 在Java语言中,用来构建GUI的工具可以分为________和__________。

a.控件 b.部件 c.窗体 d.容器

2) 下面不属于“部件”的是__________。

a.选择框 b.窗体 c.菜单

3) 下面不属于“容器”的是__________。

a.文本框 b.对话框 c.窗体

4) 容器可以被添加到其它容器中去。________

a.正确 b.不正确

5) 部件可以被添加到容器中去。_______

a.正确 b.不正确

6) 容器可以被添加到部件中去。_______

a.正确 b.不正确

7) 部件可以被添加到其它部件中去。_______

a.正确 b.不正确

练习答案

1)b、d 在Java语言中,GUI构建工具可以分为部件与容器。

2)b 窗体是一种容器,不是部件。

3)a 文本框是一种部件,不是容器。

4)a 有些容器可以被包含到其它容器中去。

5)a 容器就是用来放置各种部件的。

6)b 将部件装到容器去,就象“把桶装到水中”一样可笑。

7)b “把水装到水中”也是可笑的呀。

9.2 使用Button(按钮)

实例说明

1.首先,我们使用文字编辑软件输入下源程序。

源程序:useButton.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class useButton extends JApplet

{

JButton button1;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

button1=new JButton(“Beep!”);

panel1.add(button1);

button1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

Toolkit.getDefaultToolkit().beep();

}

});

}

}

2.执行以下命令,编译这个程序:

c:javastudy> javac useButton.java

由于,这是一个Java Applet(小应用程序),需要在网页上显示,所以我们需要编辑一个包含这个小应用程序的Html文件。形如:

源程序:useButton.html

<html><body>

<applet code="useButton.class" WIDTH=150 HEIGHT=100>

</applet>

</body></html>

3.然后使用appletviewer来运行这个程序:

c:javastudy> appletviewer useButton.html

程序输出如下图所示:

图9-1 程序useButton的运行结果

你试着按一下“Beep!”这个按钮,每按一下就会响一声。

传授新知

我们一起来看一下这个冗长而且令人费解的程序段。

1)

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

这一段程序是用来将构建GUI程序所需的包包含进来。

2)

public class useButton extends JApplet

这一句用来声明类useButton,说明它是从JApplet中继续而来的子类。JApplet是Applet类的一种增强类。因此,从这里可以看出这个程序是Java小应用程序,而不是Java应用程序。

3)

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

这一段程序创建了一个Jpanel(面板)容器:panel1,然后调用setLayout方法显示它。

4)

button1=new JButton(“Beep!”);

panel1.add(button1);

这一段程序创建了一个新的部件:button1按钮,并将按钮上显示标签“Beep!”。然后调用容器panel1的add方法将这个按钮添加到这个面板上。

5)

button1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

Toolkit.getDefaultToolkit().beep();

}

});

这是一个非凡的事件,它为按钮buuton1添加上一个ActionListener(action:行动、事件;Listener:监听者),也就是事件监视器。这个监视器做什么呢?

当actionPerformed(action:行动、事件;Performed:执行,表演),就是当这个事件执行时(什么事件呢?ActionEvent evt,按下按钮时),将执行:Toolkit.getDefaultToolkit().beep()

也就是响铃。

自测练习

1)按钮类中提供了一个方法,可以修改按钮文本的颜色。以下就是一个应用实例:

button1.setForeground(Color.green);

其中button1是按钮名,setForeground则方法名,set就是设置,Foreground就是前景,也就是设置前景色。参数是Color.green,绿色。相对应的,红色就是Color.red,蓝色就是Color.blue。

请编写一个程序,在面板上显示三个按钮,按钮上的标签分别是:set red,set green,set blue(颜色为黑色)。当按下set red按钮,则三个按钮的标签都变成红色;而按下set green则变成绿色;按下set blue则变成蓝色。

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

2)按钮类中还提供了一个方法,可以修改按钮标签。以下就是一个应用实例:

button1.setText(“OK”);

其中button1是按钮名,setText是方法名,set就是设置,Text就是文本,也就是设置按钮上的文本色。参数是”OK”。这样就会将button1的标签改为”OK”。

请使用这个方法修改程序useButton,使得按钮上显示按过的次数,假如没有按下,则仍显示“Beep!”。只需写出修改的部分。

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

练习答案

1) 以下就是一个实现实例:

源程序:lianxi901.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class lianxi901 extends JApplet

{

JButton buttonRed;

JButton buttonGreen;

JButton buttonBlue;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

buttonRed=new JButton(“set red”);

buttonGreen=new JButton(“set green”);

buttonBlue=new JButton(“set blue”);

panel1.add(buttonRed);

panel1.add(buttonGreen);

panel1.add(buttonBlue);

buttonRed.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

buttonRed.setForeground(Color.red);

buttonGreen.setForeground(Color.red);

buttonBlue.setForeground(Color.red);

}

});

buttonGreen.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

buttonRed.setForeground(Color.green);

buttonGreen.setForeground(Color.green);

buttonBlue.setForeground(Color.green);

}

});

buttonBlue.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

buttonRed.setForeground(Color.blue);

buttonGreen.setForeground(Color.blue);

buttonBlue.setForeground(Color.blue);

}

});

}

}

通过构建一个HTML文件,使其包含这个Applet后,以下就是一个运行效果之一:

图9-2 练习的输出

2) 要实现这个功能很简单,只需做两个修改:

a. 在变量定义处加入一个新的变量定义:

int counter=0;

b.在button1的addActionListener方法中的actionPerformed中加入一行:

Button1.setText(String.valueOf(++counter));

9.3 使用Label(标签)

实例说明

1.首先,我们使用文字编辑软件输入下源程序。

源程序:useLabel.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class useLabel extends JApplet

{

JLabel label1;

public void init()

{

label1=new JLabel(“This is a java label!”);

label1.setHorizontalAlignment(SwingConstants.CENTER);

label1.setVerticalAlignment(SwingConstants.TOP);

label1.setBackground(Color.red);

label1.setOpaque(true);

label1.setForeground(Color.white);

label1.setToolTipText(“Hello,I am a Java Label!”);

panel1.add(label1);

}

}

2.使用javac编译这个程序。

3.编辑一个显示这个Java Applet的页面:

源程序:useLabel.html

<html><body>

<applet code="useLabel.class" WIDTH=150 HEIGHT=100>

</applet>

</body></html>

4.最后使用appletviewer来运行这个程序:

c:javastudy> appletviewer useLabel.html

程序输出如下图所示:

图9-3 程序useLabel的运行结果

传授新知

我们可以看到这一段程序,与useButton.java十分类似,在类的前面,包含了编写GUI程序要使用的包:javax.swing.*、java.awt.*和java.awt.event.*。

接着,通过使用“extends JApplet”说明useLabel类也是一个小应用程序(Applet)。在init方法中,首先创建了一个容器---Panel,用来放置后面创建的“标签”。我们下面就认真地看一下关于Label的语句:

1)

label1=new JLabel(“This is a java label!”);

类似的,我们使用new来创建一个Label实例,参数“This is a java label!”就是标签要显示的内容。假如省略这个标签,将创建一个空标签,什么也不会显示。

一些提示:

在Java语言中,标签提供了一个setText方法,可以用来设置它显示的内容。

2)

label1.setHorizontalAlignment(SwingConstants.CENTER);

label1.setVerticalAlignment(SwingConstants.TOP);

Label类提供两个设置其对齐方式的方法:

§ setHorizontalAlignment:设置水平对齐方式;

它的有效参数是:

¨ SwingConstants.LEFT:左对齐;(默认值,也就是不设置时则左对齐)

¨ SwingConstants.CENTER:居中对齐;

¨ SwingConstants.RIGHT:右对齐;

§ setVerticalAlignment:设置垂直对齐方式;

它的有效参数是:

¨ SwingConstants.TOP:向上对齐;

¨ SwingConstants.CENTER:居中对齐;(默认值,也就是不设置时居中对齐)

¨ SwingConstants.BOTTOM:向下对齐;

3) label1.setBackground(Color.red);

label1.setOpaque(true);

setBackground方法用来设置标签的背景色。但是Java的Swing部件默认状态下是不透明的,在这种状态下是无法显示背景色的。因此,我们还需使用setOpaque(true)方法使该部件变为透明的。

4)

label1.setForeground(Color.white);

与按钮一样,我们可以使用setForeground方法来设置字符颜色。

5)

label1.setToolTipText(“Hello,I am a Java Label!”);

在Windows的界面中,许多工具按钮都提供了一个这样的功能:当你将鼠标放在这个按钮上面一会儿,就会出现一个帮助性的提示。在Java语言中,我们可以很简单地使用:

部件.setToolTipText(“提示信息”)

来实现这个功能。

一些提示:

其实“按钮”部件也可以使用这个方法来显示提示信息。

6)

panel1.add(label1);

最后,我们使用容器panel的add方法,将这个标签放置到容器中。

自测练习

1) 标签Label上显示的文本信息一经定后,就不能在程序中动态修改。________

a. 错 b.对

2) 对于一个Label来说,默认的水平对齐方式是:________。

a.SwingConstants.CENTER b.SwingConstants.RIGHT

c.SwingConstants.LEFT

3) 对于一个Label来说,默认的垂直对齐方式是:________。

a.SwingConstants.CENTER b.SwingConstants.BOTTOM

c.SwingConstants.TOP

4) 要获得一个Label上显示的文本信息,应使用_________方法。

a.setText b.getText c.getContent

5)标签类中提供了一个方法,可以修改标签上显示的文本。以下就是一个 应用实例:

label1.setText(“new text!”);

请编写一个程序,在面板左边显示一个标签,右边显示一个按钮,按钮上显示“Plus one”,标签显示为“0”。每按一次按钮,标签上显示的数字就加1.

一些提示:

在Java中,我们还可以使用getText来获得标签上显示的文本信息。

程序显示如下图所示:

图9-4 练习输出

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

练习答案

1)a 在程序中可以使用setText方法动态修改Label显示的文本信息。

2)c 默认是水平左对齐。

3)a 默认是垂直居中对齐。

4)b setText方法是设置文本,getText是获取文本,并没有getContent方法。

5)以下就是一个实现该功能的程序实例:

源程序:lianxi902.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class lianxi902 extends JApplet

{

JButton button1;

JLabel label1;

int counter=0;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

label1=new JLabel(String.valueOf(counter));

label1.setIcon("winupd.ico");

button1=new JButton("Plus one");

panel1.add(label1);

panel1.add(button1);

button1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

label1.setText(String.valueOf(++counter));

}

});

}

}

9.4 复选框与单选按钮

实例说明

1.首先,我们使用文字编辑软件输入下源程序。

源程序:useCheckbox.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class useCheckbox extends JApplet

{

JButton button1;

int counter=0;

Checkbox setbeep,setcounter,red,green,blue;

CheckboxGroup colorSel;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

setbeep=new Checkbox("Beep when press button");

setcounter=new Checkbox("Counter press time");

panel1.add(setbeep);

panel1.add(setcounter);

colorSel=new CheckboxGroup();

red=new Checkbox("Set red",colorSel,true);

green=new Checkbox("Set green",colorSel,false);

blue=new Checkbox("Set blue",colorSel,false);

panel1.add(red);

panel1.add(green);

panel1.add(blue);

red.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent evt)

{

if(evt.getStateChange()==ItemEvent.SELECTED)

button1.setForeground(Color.red);

}

});

green.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent evt)

{

if(evt.getStateChange()==ItemEvent.SELECTED)

button1.setForeground(Color.green);

}

});

blue.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent evt)

{

if(evt.getStateChange()==ItemEvent.SELECTED)

button1.setForeground(Color.blue);

}

});

button1=new JButton("Press me");

panel1.add(button1);

button1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

doButton1Action();

}

});

}

public void doButton1Action()

{

if (setbeep.getState())

Toolkit.getDefaultToolkit().beep();

if (setcounter.getState())

button1.setText("press: "+String.valueOf(++counter));

else

button1.setText("Press me");

}

}

2.使用javac编译这个程序,然后编辑一个显示这个Java Applet的页面:

源程序:useCheckbox.html

<html><body>

<applet code="useCheckbox.class" width=320 height=150>

</applet>

</body></html>

4.最后使用appletviewer来运行这个程序,这个程序的输出如下图所示:

图9-5 程序useCheckbox的运行结果

传授新知

从我们学习Java开始,这个示例程序是大家碰到的最长的一个。大家不要被它吓退,这个程序阅读起来一样并不困难。下面,我们就对程序做一些点评。

1)

setbeep=new Checkbox("Beep when press button");

setcounter=new Checkbox("Counter press time");

panel1.add(setbeep);

panel1.add(setcounter);

在这一段程序中,我们定义了两个Checkbox:setbeep和setcounter。什么是Checkbox呢?如下图所示:

图9-6 复选框

在Java语言中,Checkbox类定义了复选框。复选框用来让用户做出某种选择,正如上图所示,答应选中多个复选框。

在前两句中,我们使用new创建了这两个复选框;而在后两句中,我们使用容器Panel的add方法将它们装入Panel。

2)

colorSel=new CheckboxGroup();

red=new Checkbox("Set red",colorSel,true);

green=new Checkbox("Set green",colorSel,false);

blue=new Checkbox("Set blue",colorSel,false);

panel1.add(red);

panel1.add(green);

panel1.add(blue);

而这一段程序则是用来定义red、green和blue三个单选按钮。在Java语言中,单选按钮被看作是一组非凡的复选框。我们使用一个CheckboxGroup将它们组成一个组,这样就只答应这个组里的“复选框”只能有一定被选中,这就形成了单选按钮。

单选按钮与复选框在外观上也不同:复选框是一个正方形的小框,而单选按钮则是一个小小的圆,如下图所示:

图9-7 单选按钮

在上面的程序中,我们首先定义了一个组:colorSel。接下来的三条语句使用new操作符创建了三个Checkbox,并在参数列表中指定了它所在的组,其语法格式为:

单选按钮名=new Checkbox(“提示文本”,所在组名,初值);

其中初值是布尔型的:true表示选中,false表示未选中。

注重:

一组单选按钮中仅能有一个按钮的初值是true,因为是“单选”嘛。

最后,我们再次调用了panel的add方法,将它们装入容器panel中。

3)

red.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent evt)

{

if(evt.getStateChange()==ItemEvent.SELECTED)

button1.setForeground(Color.red);

}

});

这段程序用到了许多我们没有碰到过的东西!不过不要紧,做为初学者还是要学会“黑盒子”学习方法,也就是在学习的初级阶段要将某些东西当作一个整体来接受,而不是每一个都要剖析清楚,那样就会影响学习效果的。正如这段程序,大家只要会用,会理解就行了,不一定要搞懂为什么这么写。

第一行中red.addItemListener用来为单选按钮red增加一个监测器。监测什么呢?第3行说明监测itemStateChanged(状态改变时)。第5行说明当监测到状态改变时,就判定改变后的状态是不是“选中”的。假如是,就执行第6行,将按钮button1的前景色设置为红色。

在后面的两段中,我们采用相同的方法为单选按钮green和blue分别创建了一个监测器,使得当其被“选中”时,就将按钮button1的前景色设置为相应的颜色(绿色和蓝色)。

4)

button1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

doButton1Action();

}

});

这一段程序,我们在9.2小节中就碰到过。它是用来为按钮button1创建一个监测器。不同的是,当时我们是直接说明了当按钮按下时所要执行的语句。而在此,我们则是让其去执行一个doButton1Action方法。这个方法,是在我们后面的程序中定义的。

5)

public void doButton1Action()

{

if (setbeep.getState())

Toolkit.getDefaultToolkit().beep();

if (setcounter.getState())

button1.setText("press: "+String.valueOf(++counter));

else

button1.setText("Press me");

}

这就是当按下按钮button1时,执行的方法doButton1Action。整个方法可以分为两个部分的工作:

其一是:

if (setbeep.getState())

Toolkit.getDefaultToolkit().beep();

即,首先判定复选框setbeep否被选中(使用复选框的getState方法获得其状态,假如被选中,返回true;假如未被选中,返回false)。假如被选中,就响铃。

把整个程序逻辑串起来讲就是:当按钮button1按下时,将检查复选框setbeep是否被选中,假如被先中,就响铃,否则无任何反应。

其二是:

if (setcounter.getState())

button1.setText("press: "+String.valueOf(++counter));

else

button1.setText("Press me");

即,首先判定复选框setcounter是否被选中。假如被选中,则改变按钮button1的显示文本,将其改为press:按下总次数;否则,让其显示最初的“Press me”。

自测练习

1) 在Java语言中,复选框类名是____________。

a.Button b.Checkbox c.checkBox d.Label

2) 在Java语言中,单选框类名是____________。

a.Label b.checkBox c.Button d.Checkbox

3) 假设有cb1、cb2、cb3三个对象,属于同一个CheckboxGroup,则它们是________。

a.单选按钮 b.复选框

4) 复选框的外观是________。

a.一个小正方形 b.一个小圆形 c.一个小三角形

5) 单选框的外观是________。

a.一个小正方形 b.一个小圆形 c.一个小三角形

6) 编写一段程序,使其运行结果如下图所示:

图9-8 练习903题图

并且,当选中了NO.1,则按钮显示为NO.1;选中了NO.2,则按钮显示为NO.2。

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

练习答案

1)b 复选框类名为Checkbox,第一个字母“C”是大写字母。

2)d 单选按钮也是Checkbox,与复选框的不同是,单选按钮是属于一个CheckboxGroup的。

3)a 加入了同一个CheckboxGroup,就成为一组,一组中仅有一个能够被选中,称为单选按钮。

4)a 请参看图9-6。

5)b 请参看图9-7。

6)以下是一个实现实例:

源程序:lianxi903.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class lianxi903 extends JApplet

{

JButton button1;

Checkbox theOne,theTwo;

CheckboxGroup cbg1;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

cbg1=new CheckboxGroup();

theOne=new Checkbox("NO.1",cbg1,true);

theTwo=new Checkbox("NO.2",cbg1,false);

button1=new JButton("Button");

panel1.add(theOne);

panel1.add(theTwo);

panel1.add(button1);

theOne.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent evt)

{

if(evt.getStateChange()==ItemEvent.SELECTED)

button1.setText("NO.1");

}

});

theTwo.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent evt)

{

if(evt.getStateChange()==ItemEvent.SELECTED)

button1.setText("NO.2");

}

});

}

}

9.5 使用列表框

实例说明

1.首先,我们使用文字编辑软件输入下源程序。

源程序:useList.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class useList extends JApplet

{

Label label1;

List colorList;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

colorList=new List();

colorList.add("red");

colorList.add("green");

colorList.add("blue");

colorList.select(0);

panel1.add(colorList);

label1=new Label("You selected red");

label1.setForeground(Color.red);

panel1.add(label1);

colorList.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent evt)

{

String selString;

String sel;

int selNum;

if(evt.getStateChange()==ItemEvent.SELECTED)

{

selNum=colorList.getSelectedIndex();

sel=colorList.getItem(selNum);

selString="You selected "+sel;

label1.setText(selString);

switch(selNum)

{

case 0:

label1.setForeground(Color.red);

break;

case 1:

label1.setForeground(Color.green);

break;

case 2:

label1.setForeground(Color.blue);

break;

}

}

}

});

}

}

2.使用javac编译这个程序,然后编辑一个显示这个Java Applet的页面:

3.最后使用appletviewer来运行这个程序,这个程序的输出如下图所示:

图9-9 程序useList的运行结果

当你选择green后,标签将以绿色显示You selected green;而若你选择blue后,标签将以蓝色显示You selected blue。

传授新知

这一节中,我们将碰到一个新的部件---列表框。下面,就对刚才这个程序做一些点评。

1)

colorList=new List();

colorList.add("red");

colorList.add("green");

colorList.add("blue");

colorList.select(0);

panel1.add(colorList);

在这一段程序中,我们定义了一个列表框List:colorList。列表框用来将多个表项列出来,以供用户选择,如下图所示:

图9-10 列表框

首先,我们使用new操作符创建一个colorList,然后调用列表框的add方法,增加可供选择的表项(red、green和blue)。最后,使用select方法,使得缺省选择是red(第0项)。

最后使用容器Panel的add方法将它们装入Panel。

一些提示:

假如要让缺省选择的是blue,则应该使用colorList.select(2)。

为列表框的指定位置上增加项目,可以使用方法:

public synchronized void add(String item,int index)

其中,item是一个字符串,用来存放要显示的标签文本。而index则是添加的位置。列表框的位置是一个从0开始的数,所以,假如用户在位置0处增加项目,那么该项目将增加在列表框的顶部。假如用户试图在-1处或大于列表框中项目数(甚至象例子中,不给出index参数)的位置上增加项目,那么将增加到列表框的末尾。

假如你想删除某一项,则可以使用方法:

public synchronized void remove(int position)

其中position就是你要删除项目的位置。假如你想删除掉所有的项,则可调用方法:

public synchronized void removeAll()

2)

colorList.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent evt)

{

……

}

});

与其它部件一样,可以使用addItemListener方法为其设置一个监测器,当列表框选择项改变时就会激活这个监测器。

3)

if(evt.getStateChange()==ItemEvent.SELECTED)

{

selNum=colorList.getSelectedIndex();

sel=colorList.getItem(selNum);

selString="You selected "+sel;

label1.setText(selString);

在这一段程序中,我们首先调用了列表框的getSelectedIndex ()方法取得你所选择项目的编号。这个项目返回的是一个整型的索引号。

接着,我们再使用这个索引号调用列表框的getItem方法获取该项目的标签文本。

为了让标签中显示的文本更加清楚、易懂,我们在标签文本的前面加上了“You Selected”,然后调用标签label1的setText方法改变标签所显示的文本。

4)

switch(selNum)

{

case 0:

label1.setForeground(Color.red);

break;

case 1:

label1.setForeground(Color.green);

break;

case 2:

label1.setForeground(Color.blue);

break;

}

这是一个多分支结构,它根据所选择的项目编号(前面,我们已经调用getSelectedIndex ()方法取得了项目编号,存放在变量selNum中)来做相应的操作。

<1> case 0:假设selNum=0,那么就执行

label1.setForeground(Color.red);

break;

也就是,将标签label1的前景色(字的颜色)设置为红色,然后退出switch-case语句。

<2> case 1:假设selNum=1,那么就执行

label1.setForeground(Color.green);

break;

将标签label1的前景色设置为绿色,然后退出switch-case语句。

<3> case 2:假设selNum=2,那么就执行

label1.setForeground(Color.blue);

break;

将标签label1的前景色设置为蓝色,然后退出switch-case语句。

文本,将其改为press:按下总次数;否则,让其显示最初的“Press me”。

自测练习

1) 在程序中要构建一个列表框,要使用_________类。

a.Checkbox b.Listbox c.List d.Label

2) 列表框中第一项的项目编号(也称索引)是________。

a.0 b.1 c.-1 d.10

3) 假设有一个列表框listbox1,要在其最后添加一项,应使用________________语句。

a.listbox.add(“The end item”,0) b. listbox.add(“The end item”,10)

c. listbox.add(“The end item”,-1) d. listbox.add(“The end item”, 1)

4) 我们可以使用__________________方法,取得当前选择的项目的索引值。

a. getSelectedIndex() b. getItem() c. getNumber()

5) 编写一段程序,使其运行结果如下图所示:

图9-11 练习903题图

当按下Add按钮,就在列表框上增加一项:No.x(x是顺序号),当按下Remove按钮,就删除最后一项。

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

练习答案

1)c 在Java中,类List实现了列表框。

2)a 从0开始,而不是1。

3)c 要在这后一项添加有三种方法。其一:以-1为位置参数;其二:以大于最大项目索引数的数为位置参数;其三:不带位置参数。因此在此,只有c。

4)a getItem是获得显示的内容。

5)下面,我们给出一个实现的实例。

源程序:lianxi904.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class lianxi904 extends JApplet

{

List listbox1;

JButton buttonAdd,buttonRemove;

int counter=0;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

listbox1=new List();

buttonAdd=new JButton("Add");

buttonRemove=new JButton("Remove");

panel1.add(listbox1);

panel1.add(buttonAdd);

panel1.add(buttonRemove);

buttonAdd.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

listbox1.add("NO."+String.valueOf(counter++));

}

});

buttonRemove.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

listbox1.remove(counter-1);

counter-=1;

}

});

}

}

9.6 使用文本部件

9.6.1 普通文本框

实例说明

1.编辑以下源程序,生成useText.java文件。

源程序:useTextfield.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class useTextfield extends JApplet

{

JButton buttonOK;

JTextField text1;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

buttonOK=new JButton("OK");

text1=new JTextField(20);

panel1.add(text1);

panel1.add(buttonOK);

buttonOK.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

showStatus(text1.getText());

}

});

}

}

2.使用javac编译这个程序,然后编辑一个显示这个Java Applet的页面:

3.最后使用appletviewer来运行这个程序,这个程序的输出如下图所示:

图9-12 程序useTextfield.java的运行结果(1)

正如上图所示,屏幕上出现了一个宽度为20的文本框和一个OK按钮。我们可以在这个文本框内写入字符。我们输入“Haha,I’m writing to Java’s TextField!!”,然后单击OK按钮,这时屏幕变为:

图9-13 程序useTextfield.java的运行结果(2)

也就是,我们按下OK按钮后,在状态栏上出现了我们输入的文本信息。

传授新知

多次阅读Java语言源程序,应该为大家积累了不少经验,我想大家在阅读这个程序的时候,因为不再觉得那么费劲了吧。假如你还是觉得读程序是一件痛苦的事的话,我希望你还是好好反省一下,看前面的章节时是不是走马观花了。

好了,言归正传,我们一起来看一下上面的这个程序。这个程序中的大部分语句,大家应该都耳熟能详了,生疏的只有关于本小节的主人公---文本框TextField的语句了:

1)

JTextField text1;

……

text1=new JTextField(20);

首先,我们定义了一个JTextField类的对象text1,然后使用new操作符来创建这个对象text1(也就是一个文本框)

大家还记得new后面的这个与类名相同的方法称为什么吗?对,构造器。这个类有三种带不同参数的构造器。

A. JTextField(int columns)

第一种构造器,就是我们在本例中调用的那个,它带了一个整型参数columns,这个单词的中文意思是列,也就是说,这个参数指定了我们要创建的TextField的列宽。这里的列宽指长度,而不是可包含的字符数。

那么20,到底是多少宽呢?Java是这样定义的:

能够显示20个小写“m”(当前选择的字体)的宽度。

注重:

得再次强调一下,这里的列宽是一种长度,而不是字符数。你可以试一试,在我们这个程序执行后,再这个文本框中输入小写字母“m”,看一看能够输入多少个。但大家也应该注重到,我们在例子中输入的字符数远不止20个。

B. JTextField(String text)

第二种构造器则带的是一个字符串型参数text,这个字符串将会在程序一执行时就显示在文本框中。

C.JTextField(String text,int columns)

而假如你既想设置默认的字符串,又想设置它的宽度,就可以调用第三种构造器。

注重:

调用JTextField的构造器时,一定要带上参数,否则将会出错。

2)

buttonOK.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

showStatus(text1.getText());

}

});

大家看到这个语句,应该不会感到生疏吧!它为按钮buttonOK增加一个监测器,监测是否按下按钮。假如按下按钮,就执行:showStatus(text1.getText())语句。

这个语句中,有两个新的知识。

其一是:showStatus(String test)方法,它用来在状态栏上显示字符串。

其二是:getText()方法,它是JTextField类的一个成员方法,用来获取文本框内的文本。例如本例中text1.getText()就将获得文本框text1中的文本。也就是我们输入的那些东西。

整个串起来,得到:

当我们按下OK按钮时,程序将获取文本框text1中的文本,然后将它们显示到状态栏上。

用getText()方法可以获取文本框中的文本,相应的,我们可以使用setText()方法设置文本框中的文本。其语法是:

文本框对象.setText(String text)

这样,就将文本框中的文本改成了字符串text。

除此之外,我们还可以使用setHorizontalAlignment方法来设置字符串中文本的对齐方式,具体来说:

setHorizontalAlignment(Swing constants.CENTER) 居中对齐

setHorizontalAlignment(Swing constants.LEFT) 左对齐

setHorizontalAlignment(Swing constants.RIGHT) 右对齐

9.6.2 口令文本框

传授新知

口令文本框(JPassWordField)是一种非凡的文本框,在口令文本框中输入任何字符串都将显示成为“*”,这样就可以不让别人知道你输入的是什么,这种文本框比较适合与密码、口令的输入,所以称之为口令文本框。

为了安全起见,获取口令文本框中的密码(口令)使用的方法与普通文本框不同。它使用方法:getPassword()。

“越麻烦越安全”,所以,Java语言中为你获取口令再添加了一层麻烦(我看来是一种不必要的麻烦),getPassword()方法将返回一个char数组,我们还得将其转换成为字符串。以下就是一个转换的实例:

String passwd=new String(passwdTextField.getPassword())

9.6.3 文本区

实例说明

正如我们看到的一样,普通文本框TextField只能输入一行,假如要提供一个多行的输入界面,那怎么办呢?下面我们就看一下下面这个程序:

源程序:useTextArea.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class useTextarea extends JApplet

{

JButton buttonClear;

JTextArea textarea1;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

buttonClear=new JButton("Clear all");

textarea1=new JTextArea("Enter new text",5,15);

panel1.add(textarea1);

panel1.add(buttonClear);

buttonClear.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

textarea1.setText("");

}

});

}

}

2.使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面,建议高度为100,宽度为300。

3.最后我们再使用appletviewer来运行这个程序,这个程序的输出如下图所示:

图9-14 程序useTextarea.java的运行结果

接着,我们就可以在这个文本区内写多行文本了。大家在按下“Clear all”按钮之前,想一下,会发现什么结果?

传授新知

这个程序中,主要需要说明的只有关于TextArea部件(文本区)的一些语句:

1)

JTextArea textarea1;

……

textarea1=new JTextArea("Enter new text",5,15);

首先,我们定义了一个JTextArea类的对象textarea1,然后使用new操作符来创建这个对象textarea1(也就是一个文本区)。与文本框类似,文本区的构造器也有三种:

A. JTextField(int rows,int columns)

在这个构造器中,有两个整型参数rows(这个单词的中文意思是行)和columns(这个单词的中文意思是列),也就是说,这两参数用来指令文本区的行数,与列宽。

这里的列宽与文本框一样,是一种长度,用能够显示多少个个小写“m”(当前选择的字体)来衡量的宽度。而行数,就很好理解了,就是能够输入的行数。

要注重的是,这里的行数、列数都是只显示出来的框的大小。假如一行中超过了列宽,将会使文本区变得越来越宽,如下图所示:

图9-15 超过了列宽

由于输入的文本超过了文本区原来的宽度,使得文本区变得越来越宽,把按钮都挤到下一行中去了。

注重:

假如把多出来的文本删除掉后,文本区将变成原来的大小。

同样的,假如输入太多行,将引起如下图所示的情况:

图9-16 超过了行数

B. JTextArea(String text)

也可以只带一个字符串型参数text调用构造器方法,这个字符串将会在程序一执行时就显示在文本区中。

C. JTextField(String text ,int rows,int columns)

而假如你既想设置默认的字符串,又想设置它的宽度,就可以调用第三种构造器。在本例中,我们就是调用这个构造器,构建了一个5行,15个“m”宽的文本区,让其一启动就显示一段文本:“Enter new text”。

注重:

同样的,调用JTextArea的构造器时,一定要带上参数,否则将会出错。

2)

buttonClear.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

textarea1.setText("");

}

});

在这一段程序中,我们为按钮buttonClear增加了一个监测器,使得当这个按钮按下时就执行:textarea1.setText(“”)。与文本框TextField一样,文本区TextArea也提供了设置显示文本的方法:setText(String text)。

大家想想,将显示文本设置为“”,意味着什么,对!就是让其什么也不显示,这也就是前面那个问题(大家在按下“Clear all”按钮之前,想一下,会发现什么结果?)的答案。

到现在,我们已经读懂了这个程序,但通过执行程序时,我们发现了一个十分不好的问题,那就是在文本区内不会自动换行。我们并不希望文本区变得越来越宽!

怎么办呢?Java为文本区TextArea提供了一个方法,使得自动换行成为可能:

textarea1.setLineWrap(true)

只需将这条语句加入程序,就会使得我们编辑到右边时会自动换行。假如我们要恢复成不自动换行,就调用:

textarea1.setLineWrap(false)

自测练习

1) 部件____________适合于提供密码输入界面。

a. JTextArea b.JTextField c.JPasswordField

2) 在文本区中________输入超过程序中定义的行数。

a.能 b.不能

3) 我们可以使用______________来清除文本框text1中的文本。

a.text1.clearText() b.text1.setText(“”)

c.text1.deleteText() d.以上都可以

4) 假如我们调用____________来获得口令文本框passwd1中的文本。

a.passwd1.getText() b.passwd1.getPassword()

5) 在程序中_______________,就能够防止因为在一行中输入过多的文本,而使文本区textarea1变宽。

a.不需要做任何考虑 b.textarea1.setLineWrap(true)

c.textarea1.setLineWrap(false) d.textarea1.noWrap()

6) 假如我们使用textfield1=new JTextField(“TEST”)来创建一个文本框,那么这个文本框的宽度有多大?

____________________________________________________________________

7) 请在程序useTextarea.java中加入textarea1.setLineWrap(true),然后再执行这个程序,发现一下,还存在什么样的问题。

____________________________________________________________________

____________________________________________________________________

8) 根据以下要求,编写程序

设置两个文本框,一个用来输入UserName,另一个用来输入Password;再设置一个按钮OK和一个文本区。

假如我们按下OK按钮,则右边的文本区中就会显示:

UserName:用户名

Password:密码

其中用户名、密码就是用户输入的内容,假如没有输入则不显示。程序输出如下图所示:

图9-17 程序lianxi905.java的输出

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

练习答案

1)c 由于输入密码的地方,应该不能明文显示,否则轻易被边上的人从偷看到,我们可以借助Java中提供的口令文本框PasswordField来实现。这样,你输入的内容就变成了星号,不怕被人偷看到了。

2)a 能,而且会使得文本区的行数增加。

3)b 一个文本框并不存在cleatText()方法,也没有提供delete()方法,但我们可以通过调用setText(“”)来实现,这是因为,我们让它显示的文本变成了“”。也就空文本,这难道不是清除所有文本吗?

4)b 口令文本框要使用非凡的方法getPassword()来获得口令文本。

5)b 通过使文本区自动换行,就可以有效地避免这个问题。

6)这个文本框的宽度就是字符串“TEST”的大小。如下图所示:

图9-18 练习答案参考图(1)

7)还存在一个问题,那就是这个程序十分愚笨,它虽然会自动换行,但是却常把一个单词分在两行里,如下图所示:

图9-19 练习答案参考图(2)

一些提示:

其实文本区部件还提供了一个方法来解决这个问题,那就是:

public void setWrapStyleWord(boolean word)

假如在程序中,加入textarea1.setWrapStyleWord(true),那么程序输入则是:

图9-20 练习答案参考图(3)

怎么样,效果是不是更好了!

8) 请参考以下实现实例:

源程序:lianxi905.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class lianxi905 extends JApplet

{

Label label1,label2;

JTextField username;

JPasswordField passwd;

JButton buttonOK;

JTextArea showResult;

String out;

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

label1=new Label("Please input your name:");

username=new JTextField(15);

label2=new Label("Please input your password:");

passwd=new JPasswordField(15);

buttonOK=new JButton("OK");

showResult=new JTextArea(2,15);

panel1.add(label1);

panel1.add(username);

panel1.add(label2);

panel1.add(passwd);

panel1.add(buttonOK);

panel1.add(showResult);

buttonOK.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent evt)

{

out="Username: "+username.getText()+" ";

out=out+"Password: "+new String(passwd.getPassword());

showResult.setText(out);

}

});

}

}

请大家注重到,我们是如何生成在文本区showResult显示的文本信息(存放在字符串变量out中)的:

out="Username: "+username.getText()+" ";

out=out+"Password: "+new String(passwd.getPassword());

先让out等于“Username:”+username.getText(),这就使其包含了提示字符“Username:”,而后面的内容是另一部分的,所以我们在这个后面加上了“ ”,这是一个转义符,代表回车(也就是另起一行)。

然后再将其加上提示字符“Password:”,最后是调用了getPassword()方法,然后将其转换为字符串型。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有