图形用户界面编程Word下载.docx

上传人:b****6 文档编号:16987499 上传时间:2022-11-27 格式:DOCX 页数:19 大小:39.98KB
下载 相关 举报
图形用户界面编程Word下载.docx_第1页
第1页 / 共19页
图形用户界面编程Word下载.docx_第2页
第2页 / 共19页
图形用户界面编程Word下载.docx_第3页
第3页 / 共19页
图形用户界面编程Word下载.docx_第4页
第4页 / 共19页
图形用户界面编程Word下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

图形用户界面编程Word下载.docx

《图形用户界面编程Word下载.docx》由会员分享,可在线阅读,更多相关《图形用户界面编程Word下载.docx(19页珍藏版)》请在冰豆网上搜索。

图形用户界面编程Word下载.docx

画布(Canvas):

只能绘图,处理鼠标和键盘事件。

窗体(Frame):

顶级容器,关闭时触发WindowEvent;

面板(Panel):

可进行嵌套布局的容器,面板作为一个部件加入到窗体容器中,面板作为容器又可以放其他面板和部件。

对话框(Dialog):

包括模式和非模式两类,依赖其他窗体。

文件对话框(FileDialog):

用于打开和关闭文件。

菜单(Menu)、菜单条(MenuBar)和菜单项(MenuItem):

只能对Frame创建菜单,菜单条中添加菜单,菜单中可以添加菜单项或子菜单。

(3)布局

Java通过布局管理器对所有构件进行管理,以支持跨平台的动态布局效果。

常见布局管理器有5种,见表11-1所示。

表11-1常见布局管理器及特点

布局

特点

FlowLayout布局

组件按照加入的先后顺序从左到右排放,放不下再换至下一行,部件大小不变,是Applet和Panel的默认布局。

BorderLayout布局

将容器分为东(East)、南(South)、西(West)、北(North)、中(Center)五个区域,加入组件用命令:

add(方位名字符串,组件)。

是Frame、Dialog的默认布局。

GridLayout布局

将容器空间分为若干行乘若干列的网格区域,组件按从左向右,从上到下的次序被加到各单元格中,组件的大小将调整为与单元格大小相同。

CardLayout布局

将组件叠成卡片的形式,每个组件占用一块卡片,通过卡片的翻动选择要显示的组件。

GridBagLayout布局

在GridLayout的基础上发展而来,将整个容器分成若干行、列组成的单元,但各行可以有不同的高度,每栏也可以有不同的宽度,一个部件可以占用一个、也可以占用多个单元格。

2.3事件处理

(1)事件处理机制

涉及对象有事件源、事件、事件处理者(监听者)。

事件源是发生事件的对象;

事件对象是提供事件相关信息的对象;

事件处理者则是消化事件,完成特定处理的对象。

Java采用委托(授权)事件处理机制;

事件源对其可能发生的事件分别授权不同的事件处理者处理;

通过如下命令注册监听者:

addXXXListener(XXXListenera);

其中,XXX与相应事件类型相关,例如:

按钮点击动作事件对应标记为“Action”.

要注销监听者使用removeXXXListener(XXXListenera);

事件处理者必须实现某类事件相对应的接口,只有符合接口规范的对象才能作为事件处理者,通过编写相应方法实现事件的处理。

例如,ActionListener接口中定义了如下方法用来处理事件。

publicvoidactionPerformed(ActionEvente);

Java为每类事件提供了一个相应的接口。

(2)事件与事件处理

java.util.EventObject是所有事件类的父类;

java.awt.AWTEvent是所有AWT事件类的父类,其包括低级事件和基于语义的高级事件。

XXXEvent对应的事件处理接口通常为XXXListener,但鼠标事件(MouseEvent)对应的事件处理接口有两个,一个是MouseListener,另一个是MouseMotionListener,它们分别用来处理鼠标的移动(含拖动)与鼠标的点击动作。

各类接口的事件处理方法见表11-2。

表11-2AWT事件接口及处理方法

描述信息

接口名称

方法(事件)

点击按钮、点击菜单项、文本框按回车等动作

ActionListener

actionPerformed(ActionEvent)

选择了可选项的项目

ItemListener

itemStateChanged(ItemEvent)

文本部件内容改变

TextListener

textValueChanged(TextEvent)

移动了滚动条等组件

AdjustmentListener

adjustmentVlaueChanged

(AdjustmentEvent)

鼠标移动

MouseMotionListener

mouseDragged(MouseEvent)

mouseMoved(MouseEvent)

鼠标点击等

MouseListener

mousePressed(MouseEvent)

mouseReleased(MouseEvent)

mouseEntered(MouseEvent)

mouseExited(MouseEvent)

mouseClicked(MouseEvent)

键盘输入

KeyListener

keyPressed(KeyEvent)

keyReleased(KeyEvent)

keyTyped(KeyEvent)

组件收到或失去焦点

FocusListener

focusGained(FocusEvent)

focusLost(FocusEvent)

组件移动、缩放、显示/隐藏等

ComponentListener

componentMoved(ComponentEvent)

componentHidden(ComponentEvent)

componentResized(ComponentEvent)

componentShown(ComponentEvent)

窗口事件

WindowListener

windowClosing(WindowEvent)

windowOpened(WindowEvent)

windowIconified(WindowEvent)

windowDeiconified(WindowEvent)

windowClosed(WindowEvent)

windowActivated(WindowEvent)

windowDeactivated(WindowEvent)

容器增加/删除组件

ContainerListener

componentAdded(ContainerEvent)

componentRemoved(ContainerEvent)

事件适配器

Java中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter,在该类中以空方法体实现了相应接口的所有方法,程序员设计可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,从而减轻工作量。

在事件处理代码中区分事件源

在事件处理代码中可通过相应的方法得到事件源对象或与事件源相关的信息,见表11-3,通过这些信息可区分事件源。

表11-3在事件处理代码中区分事件源

事件类型

方法

作用

ActionEvent

getSource()

返回事件对象对应的事件源对象

getActionCommand()

返回动作命令字符串

WindowEvent

getWindow()

返回窗体事件对应的窗体对象

ItemEvent

getItemSelectable()

返回选择事件对应的事件源对象

KeyEvent

getKeyChar()

返回键盘事件按键对应的字符

getKeyCode()

返回键盘事件所按键的编码值

3样例程序 

样例1:

在应用程序窗体中安排1个文本框,一个标签。

在文本框输入一个数字(0-9),按回车键,在标签处显示对应的英文单词。

0---zero,1---one,....

【参考程序】

importjava.awt.*;

importjava.awt.event.*;

publicclass 

myFrame 

extendsFrameimplementsActionListener{ 

Labelres;

TextFieldmy;

Stringword[]={"

zero"

"

one"

two"

three"

four"

five"

six"

seven"

eight"

nine"

ten"

};

public 

myFrame(){ 

my=newTextField(20);

res=newLabel("

英文单词 

"

);

setLayout(newFlowLayout());

add(my);

add(res);

my.addActionListener(this);

}

publicvoidactionPerformed(ActionEvente){

Strings=my.getText();

intn=Integer.parseInt(s);

res.setText(word[n]);

publicstaticvoidmain(Stringargs[]){

Frame 

my=newmyFrame();

my.setSize(300,300);

my.setVisible(true);

【编程技巧】

(1)从数组中单词与下标位置之间的对应关系认识翻译目标。

(2)事件注册处理过程。

(3)如何读取文本框数据并转化为整数和设置标签内容。

【自己练习】以上程序执行时要求用户输入一个0到9之间的数字,但由于没有提示,用户可能输入数据错误,从而产生程序运行错误,改进应用界面,给用户输入提示。

样例2:

在应用程序窗体中安排两个文本框分别用来输入两个整数,两个按钮分别为“+”,“*”,一个结果标签。

点击按纽“+”将两文本框的数据做加法运算;

点击按钮“*”做乘法运算,将结果显示在标签中。

TextFieldf1,f2;

public 

myFrame(){ 

f1=newTextField(20);

f2=newTextField(20);

Buttonb1=newButton("

+"

Buttonb2=newButton("

*"

运算结果 

setLayout(newGridLayout(3,2));

add(f1);

add(f2);

add(b1);

 

add(b2);

add(res);

b1.addActionListener(this);

b2.addActionListener(this);

intx1=Integer.parseInt(f1.getText());

intx2=Integer.parseInt(f2.getText());

if(e.getActionCommand().equals("

)) 

//区分用户点击的是哪个按钮

res.setText("

"

+(x1+x2));

else

+(x1*x2));

my.setSize(200,200);

【说明】本例在一个事件处理程序中有来自两个事件源的事件,因此在处理时要区分处理,区分命令按钮有两种办法:

一种是通过按钮的命令名(默认是按钮上的文本),比较时通过字符串比较;

另一种是通过事件的getSource()方法得到事件源对象,但这次比较的是与对象引用变量进行比较。

(1)在同一事件处理方法中如何区分事件源;

(2)将多个实例方法内要共享访问的部件对象定义为属性变量,如上面的标签和两个文本框。

【自己练习】利用匿名内嵌类为以上问题的每个事件源单独编写一段事件处理代码,这样在事件处理时不用区分事件源。

样例3:

实现一个简单的图像浏览器,部署“上一张”、“下一张”两个按钮,点击按钮可前后翻阅图片。

importjava.applet.*;

publicclassShowAnimatorextendsAppletimplementsActionListener{

Image[]m_Images;

//保存图片序列的Image数组

inttotalImages=18;

//图片序列中的图片总数18

intcurrentImage=0;

//当前时刻应该显示图片序号

Buttonb1,b2;

publicvoidinit(){ 

m_Images=newImage[totalImages];

for(inti=0;

i<

totalImages;

i++)

m_Images[i]=getImage(getDocumentBase(),"

images\\img00"

+(i+1)+"

.gif"

//将图像对象存入数组中

上一张"

下一张"

setLayout(newBorderLayout());

Paneloperate=newPanel();

operate.add(b1);

operate.add(b2);

add("

South"

operate);

//操作控制面板放在底部

b2.addActionListener(this);

publicvoidpaint(Graphicsg) 

{

g.drawImage(m_Images[currentImage],10,10,this);

//显示当前那张图片

}

publicvoidactionPerformed(ActionEvente){

if(e.getSource()==b1)

{if(currentImage>

0)

currentImage=--currentImage;

//上一张

}

currentImage=++currentImage%totalImages;

//下一张

repaint();

}

(1)将绘制图像存入数组中,利用一个变量代表当前要绘制图像对应下标。

(2)事件处理中,前后翻动图片的实现就是控制变量值的增减。

 

(3)由repaint()方法调用paint方法实现图像重绘。

【自己练习】增加一个画布,将图片绘制到画布上,如何修改程序。

样例4:

统计一个文本域中行、单词、字符的数量。

【分析】在图形界面中除了安排文本域输入数据外,还安排一个按钮触发统计操作,另外安排3个标签显示结果。

界面采用GridLayout布局,如图11-3所示。

importjava.awt.*;

importjava.awt.event.*;

importjava.applet.*;

publicclassTextCounterextendsApplet 

implementsActionListener{ 

TextAreatextInput;

LabellineCountLabel;

LabelwordCountLabel;

LabelcharCountLabel;

publicvoidinit(){ 

textInput=newTextArea();

Panelsouth=newPanel();

south.setLayout(newGridLayout(4,1,2,2));

ButtoncountButton=newButton("

ProcesstheText"

countButton.addActionListener(this);

south.add(countButton);

lineCountLabel=newLabel("

Numberoflines:

south.add(lineCountLabel);

wordCountLabel=newLabel("

Numberofwords:

south.add(wordCountLabel);

charCountLabel=newLabel("

Numberofchars:

south.add(charCountLabel);

setLayout(newBorderLayout(2,2));

add(textInput,BorderLayout.CENTER);

add(south,BorderLayout.SOUTH);

publicvoidactionPerformed(ActionEventevt){ 

Stringtext;

//用户从文本框输入的文本. 

intcharCt,wordCt,lineCt;

//字符,单词和行的个数. 

text=textInput.getText();

charCt=text.length();

//字符数正好为文本串的长度. 

wordCt=0;

for(inti=0;

i<

charCt;

i++){

booleanstartOfWord;

//是否位置为i的字符是一个单词的开头?

if(Character.isLetter(text.charAt(i))==false)

startOfWord=false;

//否.不是字母.

elseif(i==0)

startOfWord=true;

//是.这是文本的首字母.

elseif(Character.isLetter(text.charAt(i-1)))

//否.前面有一个字母.

elseif(text.charAt(i-1)=='

\'

'

&

&

i>

1

Character.isLetter(text.charAt(i-2)))

//否. 

是一个单词的继续

//是.该字符前面为非字母.

if(startOfW

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1