常用组件及事件处理_第1页
常用组件及事件处理_第2页
常用组件及事件处理_第3页
常用组件及事件处理_第4页
常用组件及事件处理_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1通过图形用户界面(GUI),用户和程序之间可以方便的进行交互。Java的抽象窗口工具包(AWT)中包含了许多类支持GUI设计。如:按钮、菜单、列表、文本框、窗口、面板等。

GUI界面中有两个概念,一个是组件,另一个是容器,容器是来用存放组件的对象。下图是java.awt包中一部分类的层次关系。2ComponentBottonScrollbarCanvasListCheckboxTextFieldLabelTextAreaContainerWindowPanelAppletFrameDialog3Component类的常用方法Component类是所组件的父类。组件都是矩形形状,组件本身有一个默认的坐标系,组件的左上角的坐标值是(0,0)。如果一个组件的宽是20,高是10,那么,该坐标系中,x坐标的最大值是20,y坐标的最大值是10。一、组件的颜色publicvoidsetBackground(Colorc);//设置组件背景色publicvoidsetForeground(Colorc);//设置组件前景色publicvoidgetBackground(Colorc);//获取组件背景色publicvoidgetForeground(Colorc);//获取组件前景色4注:Color类是java.awt包中的类,该类创建的对象称为颜色对象。

publicColor(int

red,int

green,intblue);该构造方法用来创建一个颜色对象,其中red,green,blue的取值在0到255之间。另外,Color类中还有red,blue,green,orange,cyan,yellow,pink等静态常量,都是颜色对象(也可以用大写字母表示)。5二、组件的字体publicvoidsetFont(Fontf);//设置组件上的字体publicFontgetFont(Fontf);//获取组件上的字体注:Font类是java.awt包中的类,该类创建的对象称为字体对象。

publicFont(String

name,int

style,intsize);该构造方法用来创建一个字体对象,其中name是字体的名字,如果系统不支持字体的名字,将取默认的名字创建字体对象,style决定字体的样式,取值为一个整数,size决定字体的大小,单位是磅。

style的有效取值:

Font.BOLD

Font.PLAIN

Font.ITALIC

Font.ROMAN_BASELINE

Font.CENTER_BASELINE等6三、组件的大小与位置publicvoidsetSize(int

width,intheight)//设置组件的大小,高度为height,宽度为widthpublicvoidsetLocation(int

x,inty)//设置组件在容器中的位置,x为组件距容器左边界的像素值,y为组件距容器上边界的像素值。publicDimensiongetSize()//返回一个Dimension对象的引用,该对象实体中含有名字是width和height的成员变量,方法返回的Dimension对象的width的值就是组件的宽度,height的值就是组件的高度。7publicPointgetLocation(int

x,inty)//返回一个Point对象的引用,该对象实体中含有名字是x和y的成员变量,方法返回的Point对象的x,y值是组件左上角在容器坐标系中的x坐标和y坐标。

publicvoidsetBounds(int

x,int

y,int

width,intheight)//设置组件在容器中的位置和组件的大小,相当于setSize和setLocation方法的组合。publicRectanglegetBounds()//返回一个Rectangle对象的引用,该对象实体中含有名字是x,y,width和height的成员变量,方法返回的Rectangle对象的x,y值是组件左上角在容器坐标系中的坐标,width的值就是组件的宽度,height的值就是组件的高度。8四、组件的激活与可见性publicvoidsetEnabled(booleanb)//组件调用这个方法来设置组件是否可以被激活,当参数b取true时,组件可以被激活;当参数b取false时,组件不可被激活。默认情况下组件是可以被激活的。publicvoidsetVisible(booleanb)

//设置组件在容器中的可见性,当参数b取true时,组件在容器中可见;当参数b取false时,组件在容器中不可见。除了Window型组件外,其他类型的组件默认是可见的。9importjava.awt.*;importjava.awt.event.*;classComponentDemoextendsFrame{

publicstaticvoidmain(String

args[]){Framewin=newFrame("窗口");

win.setBounds(0,0,400,200);

win.setVisible(true);

win.setBackground(Color.CYAN);

win.setForeground(Color.blue);

Labellabel=newLabel("这是标签组件");Labellabel2=newLabel("这是另一个标签组件");label.setBounds(12,12,240,80);

label.setBackground(Color.yellow);

label.setForeground(Color.RED);

label.setFont(newFont("隶书",Font.BOLD,20));

win.add(label);win.add(label2);

win.validate();

win.addWindowListener(new

WindowAdapter() {publicvoidwindowClosing(WindowEvente){System.exit(0);}});

}}10Java窗口

Frame类是Container类的间接子类。当需要一个窗口时,可使用Frame或其子类创建一个对象。窗口也是一个容器,可以向窗口添加组件。需要注意的是,窗口默认地被系统添加到显示器屏幕上,不允许将一个窗口添加到另一个容器中。一、Frame常用方法构造方法:Frame()

该方法创建一个无标题的窗口,窗口的默认布局为BorderLayoutFrame(Strings)

该方法创建一个标题为s的窗口,窗口的默认布局为BorderLayout11实例方法:publicvoidsetBounds(inta,intb,intwidth,intheight)

窗口调用该方法设置出现在屏幕上的初始位置是(a,b),窗口的宽是width,高是heightpublicvoidsetSize(intwidth,intheight)

设置窗口的大小,窗口在屏幕出现的默认位置是(0,0)publicvoidsetVisable(booleanb)

设置窗口是否可见,默认是不可见的publicvoidsetResizable(booleanb)

设置窗口是否可调整大小,默认是可调整的publicvoiddispose()

窗口调用该方法可以撤消当前窗口,并释放当前窗口所使用的资源12二、菜单条、菜单、菜单项窗口中的菜单条、菜单、菜单项是我们所熟悉的界面,菜单放在菜单条里,菜单项放在菜单里。1.MenuBar

菜单条

Java.awt包中的MenuBar类是负责创建菜单条的,即MenuBar的一个实例就是一个菜单条。

Frame类有一个将菜单放置到窗口中的方法:

setMenuBar(MenuBarbar);

该方法将菜单条添加到窗口的顶端。注:只能向窗口添加一个菜单条。132.Menu菜单

Java.awt包中的Menu类是负责创建菜单的,即Menu的一个实例就是一个菜单。Menu类的主要方法有:Menu()建立一个空标题的菜单Menu(Strings)建立一个指定标题的菜单,标题由参数s确定publicvoidadd(MenuItemitem)向菜单增加由参数item指定的菜单选项对象publicvoidadd(Strings)向菜单增加指定的选项publicMenuItem

getItem(intn)得到指定索引处的菜单选项publicint

getItemCount()得到菜单选项数目143.MenuItem

菜单项

Java.awt包中的MenuItem是Menu的父类,该类是负责创建菜单项的,即MenuItem的一个实例就是一个菜单项。菜单项放在菜单里。MenuItem类的主要方法有:

MenuItem()建立一个无标题的菜单项

MenuItem(Strings)建立一个指定标题的菜单项,标题由参数s确定publicvoidsetEnable(booleanb)

设置当前菜单项是否可被选择publicStringgetLable()得到菜单选项的名字

4.嵌入子菜单Menu是MenuItem的子类,因此菜单项本身还可以是一个菜单,称这样的菜单为子菜单。15importjava.awt.*;classFirstWindowextendsFrame{

MenuBar

menubar;Menumenu;

MenuItemitem1,item2;

FirstWindow(Strings){

super(s);setSize(160,170);setLocation(120,120);

setVisible(true);

menubar=newMenuBar();menu=newMenu("文件");item1=newMenuItem();item2=newMenuItem("保存");menu.add(item1);menu.add(item2);

menubar.add(menu);

setMenuBar(menubar);}}publicclassExample6_1{publicstaticvoid

main(String

args[]){

FirstWindowwin=newFirstWindow("一个简单的窗口");}}16布局当把组件添加到容器中时,希望控制组件在容器中的位置,这就是布局的概念。java.awt包中的布局类有:FlowLayout,BorderLayout,CardLayout,GridLayout。java.swing.border包中有布局类:BoxLayout。容器可以使用:setLayout(布局对象);来设置自己的布局一、FlowLayout布局

FlowLayout类创建的对象称做FlowLayout型布局。FlowLayout型布局是Panel型容器的默认布局。

Framecon=newFrame();//创建容器对象con

FlowLayoutflow=newFlowLayout();

//创建一个居中对齐的布局对象

con.setLayout(flow);//容器con使用布局对象flow

con.add(new

Button(“button”));

//将按钮对象button放在容器的中心17注:可以使用add方法将多个组件添加到容器中,组件按照加入的先后顺序从左向右排列,一行排满后转下一行继续从左至右排列,每一行中的组件都居中排列,组件之间的默认水平和垂直间隙是5个像素。

FlowLayout布局对象调用setAlignment(intalign)方法可以重新设置布局的对齐方式,其中align可以取值:

FlowLayout.LEFT

FlowLayout.CENTER

FlowLayout.RIGHT

FlowLayout布局对象调用setHgap(int

hgap)方法和setVgap(int

Vgap)方法可以重新设置布局的水平间隙和垂直间隙。18importjava.awt.*;classWindowFlowextendsFrame{

WindowFlow(Strings){super(s);setBounds(100,100,400,320);

setVisible(true);

FlowLayoutflow=newFlowLayout();

flow.setAlignment(FlowLayout.LEFT);flow.setHgap(2);flow.setVgap(8);

setLayout(flow);

for(inti=1;i<=10;i++){

add(newButton("iam"+i));}validate();}}19classExample{publicstaticvoidmain(String

args[]){

WindowFlowwin=newWindowFlow("FlowLayout布局窗口");}}20二、BorderLayout布局

BorderLayout类创建的对象称做BorderLayout型布局。BorderLayout型布局是Window型容器的默认布局。使用BorderLayout布局的一般步骤如下:

Framecon=newFrame();

//创建容器对象con

BorderLayoutborder=newBorderLayout();

//创建一个BorderLayout类的布局对象

con.setLayout(border);

//容器con使用布局对象border

con.add(new

button(“button”),BorderLayout.North);

//将按钮对象button放在容器的上面21注:使用BorderLayout布局的容器,简单的将容器空间划分为东、西、南、北、中五个区域,中间的区域最大。将组件加入容器中应指明把这个组件加在哪个区域中,区域由BorderLayout中的静态常量CENTERNORTHSOUTHWESTEAST表示。添加到某个区域的组件将占据整个区域。每个区域只能放置一个组件,如果向某个已放置了组件的区域再放置一个组件,那么先前的组件将被后者替换掉。使用BorderLayout布局的容器最多能添加5个组件,如果容器超过5个组件,就必须使用容器的嵌套或改用其他的布局策略。22importjava.awt.*;classExample6_3{publicstaticvoidmain(String

args[]){Framewin=newFrame("窗体");

BorderLayoutborder=newBorderLayout();

win.setLayout(border);win.setBounds(100,100,300,300);

win.setVisible(true);ButtonbSouth=newButton("我在南边"),

bNorth=newButton("我在北边"),

bEast=newButton("我在东边"),

bWest=newButton("我在西边"),

bCenter=newButton("我在中心");

win.add(bNorth,BorderLayout.NORTH);

win.add(bSouth,BorderLayout.SOUTH);

win.add(bEast,BorderLayout.EAST);

win.add(bWest,BorderLayout.WEST);

win.add(bCenter,BorderLayout.CENTER);

win.validate();}}由于BorderLayout是Window默认的布局,因此这两个语句可以省略23三、null布局可以把一个容器的布局设为null(空布局)。空布局容器可以准确地定位组件在容器中的位置和大小。

setBounds(int

a,int

b,int

width,intheight)方法是所有组件都拥有的方法,组件调用该方法可以设置本身的大小和在容器中的位置。向空布局容器添加一个组件c需要两个步骤:第一步:使用add(c)方法向容器添加组件;第二步:c再调用setBounds(int

a,int

b,int

width,intheight)方法设置该组件在容器中的位置和本身的大小。

24文本框组件

java.awt包中的TextField类是专门用来建立文本框的,即TextField创建的一个对象就是一个文本框。用户可以在文本框中输入单行文本。一、TextField类的主要方法构造方法:TextField()

//创建一个文本框对象,长度为一个字符,可以在文本框中输入若干个字符。TextField(intx)//创建一个长度为x的文本框对象,可以在文本框中输入若干个字符。TextField(Strings)//创建一个初始值为s的文本框对象,可以在文本框中输入若干字符。TextField(String

s,intx)//创建一个初始值为s,长度为x的文本框对象,可以在文本框中输入若干字符。25其它常用实例方法:publicvoidsetText(Strings)//设置文本框文本为s,先前的文本被清除publicStringgetText()//获取文本框中的文本publicvoidsetEchoChar(charc)//设置文本框的回显字符为cpublicvoidsetEditable(booleanb)//指定文本框是否可编辑,默认为可编辑publicvoidaddActionListener(ActionListener)//向文本框增加动作监视器publicvoidremoveActionListener(ActionListener)

//移去文本框上的动作监视器26importjava.awt.*;classWindowTextextendsFrame{

TextFieldtext1,text2;

WindowText(Strings){

super(s);

setLayout(new

FlowLayout());setBounds(100,100,150,150);

setVisible(true);text1=newTextField("输入密码:",10);text1.setEditable(false);text2=newTextField(10);text2.setEchoChar('*');add(text1);add(text2);validate();}}调用Frame的构造方法27classExample{publicstaticvoidmain(String

args[]){

WindowTextwin=newWindowText("窗口");}}学习组件除了了解组件的属性和功能外,一个更重要的方面是学习怎样处理组件上发生的界面事件。程序需要对组件上发生的事件做出反应,从而实现特定的任务。在学习处理事件时,必须很好地掌握事件源、监视器、处理事件的接口这三个概念,下面通过处理文本框这个具体组件上的事件,来掌握处理事件的基本原理。28二、TextField上的ActionEvent事件1.事件源能够产生事件的对象都可以成为事件源,如文本框、按钮、下拉列表等,也就是说,事件源必须是一个对象。例:TextFieldtext=newTextField();

这里的text就是一个事件源,其上可以产生ActionEvent事件。2.监视器事件源通过调用相应的方法将某个对象作为自己的监视器。当事件发生时,由监视器负责对发生的事件进行处理。例:text.addActionListener(ActionListenere)监视器293.处理事件的接口创建监视器对象的类必须声明实现相应的接口。对文本框这个接口的名字是ActionListener,这个接口中只有一个方法:

publicvoidactionPerformed(ActionEvente)

当在文本框中输入字符并回车,java.awt.event包中的ActionEvent类自动创建了一个事件对象,并将其传递给方法actionPerformed(ActiveEvente)中的参数e,监视器将自动调用actionPerformed(ActiveEvente)对发生的事件进行处理。

classMyWindowimplementsActionListener{…

publicvoidactionPerformed(ActionEvente){…}}304.ActionEvent类中的方法publicObjectgetSource()//获取发生ActionEvent事件的事件源对象的引用。文本框上的事件实例:方法一:只有一个监视器方法二:有两个监视器31classactionDemo{publicstaticvoidmain(Stringargs[]){newMyWindow("窗口");}}方法一:只有一个监视器---MyWindow,该监视器实现接口

ActionListener32importjava.awt.*;importjava.awt.event.*;classMyWindowextendsFrameimplements

ActionListener{

TextFieldtext1,text2,text3;

MyWindow(Strings){

super(s);

setLayout(new

FlowLayout());text1=newTextField(10);text2=newTextField(10);text3=newTextField(10);text2.setEditable(false);text3.setEditable(false);add(text1);add(text2);add(text3);

text1.addActionListener(this);

setBounds(100,100,150,150);

setVisible(true);

validate();

}33

publicvoidactionPerformed(ActionEvente){

intn=0;try{n=Integer.parseInt(text1.getText());text2.setText(n+"的平方是:"+n*n);text3.setText(n+"的立方是:"+n*n*n);}

catch(NumberFormatException

ee){text1.setText("请输入数字字符");}

}}34方法二:有两个监视器----Policeman_2,Policeman_3,这两个监视器均实现接口ActionListenerclassactionDemo{publicstaticvoidmain(String

args[]){newMyWindow("窗口");}}35importjava.awt.*;importjava.awt.event.*;classMyWindowextendsFrame{

TextFieldtext1,text2,text3;PoliceMan_2police_2=newPoliceMan_2(this);PoliceMan_3police_3=newPoliceMan_3(this);

MyWindow(Strings){

super(s);

setLayout(new

FlowLayout());text1=newTextField(20);text2=newTextField(20);text2.setEditable(false);text3=newTextField(20);text3.setEditable(false);add(text1);add(text2);add(text3);text1.addActionListener(police_2);text1.addActionListener(police_3);setBounds(100,100,300,150);

setVisible(true);validate();

}

}36classPoliceMan_2implementsActionListener

{

MyWindowwin;PoliceMan_2(MyWindowa){win=a;}

publicvoidactionPerformed(ActionEvente){

intn=0,m=0;try{n=Integer.parseInt(win.text1.getText());m=n*n;win.text2.setText(n+"的平方是:"+m);}

catch(Exception

ee){win.text1.setText("请输入数字字符");}

}}37classPoliceMan_3implementsActionListener

{

MyWindowwin;PoliceMan_3(MyWindowa){win=a;}

publicvoidactionPerformed(ActionEvente){

intn=0,m=0;try{n=Integer.parseInt(win.text1.getText());m=n*n*n;win.text3.setText(n+"的立方是:"+m);}

catch(Exception

ee){win.text1.setText("请输入数字字符");}

}}38按钮组件

Java.awt包中的Button类是专门用来建立按钮的。即Button类创建的一个对象就是一个按钮。一、Button类中的主要方法Button()//创建一个没有名称的按钮Button(Strings)//创建一个名称是s的按钮,即按钮上的字符串是spublicvoidsetLabel(Strings)//设置上按钮上的名称publicStringgetLabel()//获取按钮上的名称publicvoidaddActionListener(ActionListener)//向按钮添加动作监视器publicvoidremoveActionListener(ActionListener)

//移去按钮上的动作监视器39二、Button上的ActionEvent事件按钮可以发生ActionEvent事件,当按钮获得监视器之后,用鼠标单击按钮,就发生ActionEvent事件,即java.awt.event包中的ActionEvent类自动创建了一个事件对象。1.创建事件源对象

ButtonbuttonEnter=newButton();2.为事件源添加监视器

buttonEnter.addActionListener(ActionListener)3.处理事件的接口实现方法actionPerformed(ActionEvent)40importjava.awt.*;importjava.awt.event.*;classWindowButtonextendsFrameimplementsActionListener{

intnumber;

TextField

提示条,输入框;ButtonnuttonGetNumber,buttonEnter;

WindowButton(Strings)

{

super(s);

setLayout(new

FlowLayout());

nuttonGetNumber=newButton("得到一个随机数");

add(nuttonGetNumber);

提示条=newTextField("输入你的猜测:",10);

提示条.setEditable(false);

输入框=newTextField("0",10);add(提示条);add(输入框);

buttonEnter=newButton("确定");

add(buttonEnter);41

buttonEnter.addActionListener(this);

nuttonGetNumber.addActionListener(this);setBounds(100,100,150,150);

setVisible(true);validate();}

publicvoidactionPerformed(ActionEvente){

if(e.getSource()==nuttonGetNumber){number=(int)(Math.random()*100)+1;

提示条.setText("输入你的猜测:");}42elseif(e.getSource()==buttonEnter){

intguess=0;

try

{

guess=Integer.parseInt(输入框.getText());

if(guess==number){

提示条.setText("猜对了!");}elseif(guess>number){

提示条.setText("猜大了!");

输入框.setText(null);}elseif(guess<number){

提示条.setText("猜小了!");

输入框.setText(null);}

}

43

catch(NumberFormatExceptionevent)

{

提示条.setText("请输入数字字符");

}

}

}

}classExample6_7{publicstaticvoidmain(String

args[]){newWindowButton("窗口");}}输出结果:44菜单项单击某个菜单项可以发生ActionEvent事件。importjava.awt.*;importjava.awt.event.*;class

WindowExit

extendsFrameimplementsActionListener{

MenuBarmenubar;Menumenu;MenuItemitemExit;

WindowExit(Strings)

{

super(s);

menubar=newMenuBar();menu=newMenu("文件");

itemExit=newMenuItem("退出");45

menu.add(itemExit);

menubar.add(menu);

setMenuBar(menubar);

itemExit.addActionListener(this);setBounds(100,100,150,150);

setVisible(true);validate();

}

publicvoidactionPerformed(ActionEvente){

System.exit(0);}

}classExample{publicstaticvoidmain(String

args[]){

WindowExitwin=newWindowExit("窗口");

}}46文本区组件

Java.awt包中的TextArea类是专门用来建立文本区的。即TextArea

类创建的一个对象称作一个文本区。用户可以在文本区输入多行文本。一、TextArea类中的主要方法TextArea()//创建一个空的文本区对象,文本区的列数和行数取默认值。文本区有水平和垂直流动条TextArea(Strings)//创建一个初始值为s的文本区对象,文本区的列数和行数取默认值。文本区有水平和垂直流动条TextArea(int

x,inty)//创建一个空的文本区对象,文本区的行数为y,列数为x。文本区有水平和垂直流动条47publicStringgetText()//获取文本区中的文本publicvoidinsert(String

s,intx)//将字符串s插入到文本区指定位置x处,x不能大于文本区中字符的个数publicvoidreplaceRange(String

s,intstart,intend)//用字符串s替换从指定位置start开始到指定位置end结束的文本,start和end不能大于文本区中字符的个数publicvoidappend(Strings)//在文本区未尾追加字符串sint

getCaretPosition()//获取文本区中输入光标的位置48publicvoidsetCaretPosition(intposition)//设置文本区中输入光标的位置,其中position不能大于文本区中字符的个数publicvoidselectAll()//选中文本中的全部文本addTextListener(TextListener)

//向文本框添加动作监视器49二、TextArea上的TextEvent事件对于文本区事件源,可以发生TextEvent事件。1.创建事件源对象

TextEventtext=newTextEvent();2.为事件源添加监视器

text.addTextListener(TextListener)3.处理TextEvent事件的接口是TextListener,其中的方法

textValueChanged(TextEvent)对文本区上发生的事件做出处理50importjava.awt.*;importjava.awt.event.*;importjava.util.*;class

WindowTextArea

extendsFrameimplements

TextListener{

TextAreatext1,text2;

WindowTextArea(Strings){

super(s);

setLayout(new

FlowLayout());text1=newTextArea(6,15);text2=newTextArea(6,15);add(text1);add(text2);text2.setEditable(false);text1.addTextListener(this);setBounds(100,100,150,150);

setVisible(true);validate();

}51

publicvoidtextValueChanged(TextEvente){

if(e.getSource()==text1){

Strings=text1.getText();

StringTokenizer

fenxi=newStringTokenizer(s,",'\n'");

intn=fenxi.countTokens();Stringa[]=newString[n];

for(inti=0;i<=n-1;i++){Stringtemp=fenxi.nextToken();

a[i]=temp;}

Arrays.sort(a);//按字典序从小到大排序。

text2.setText(null);//刷新显示。

for(inti=0;i<n;i++){text2.append(a[i]+"\n");}

}

}

}52classExample{publicstaticvoidmain(String

args[]){

WindowTextAreawin=newWindowTextArea("窗口");}}53标签

标签的功能是只显示文本,不能动态地编辑文本。Label类的实例就是一个标签。Label类的常用方法:Label()//创建一个标签对象,标签上没有名称Label(Strings)//创建一个名称为s的标签对象,名称在标签上靠左侧对齐Label(String

s,intalignment)//创建一个名称为s的标签对象,名称在标签上的位置由alignment决定。alignment的值可以是Label.LEFT,Label.RIGHT,Label.CENTER54publicvoidsetText(Strings)//设置标签上的名称publicStringgetText()//获取标签上的名称publicvoidsetAlignment(intalignment)//设置标签上名称的对齐方式55paint方法与repaint方法Component类有一个方法:publicvoidpaint(Graphicsg),我们可以在其子类中重写这个方法。当重写这个方法时,相应的java运行环境将参数g实例化,这样我们就可以在子类中使用g调用相应的方法,进行图形的绘制。调用repaint()方法时,程序首先清除paint()方法以前所画的内容,然后再调用paint()方法,实际上当调用repaint()方法时,程序自动先调用update()方法,该方法的功能是:清除paint()方法以前所画的内容,然后再调用paint()方法。我们可以在子类中重写update()方法,根据需要选择清除哪些部分或保留哪些部分。56窗口事件Frame是Window的子类,凡是Window子类创建的对象都可以发生WindowEvent类型事件,即窗口事件。一、WindowListener接口当一个Frame窗口被激活、撤消激活、打开、关闭、图标化或撤消图标化时,就引发了窗口事件,即WindowEvent创建一个窗口事件对象。WindowEvent创建的事件对象调用getWindow()方法可以获取发生窗口事件的窗口。窗口使用addWindowListener()方法获得监视器,创建监视器对象的类必须实现WindowListener接口。该接口有7个不同的方法,分别是:57publicvoidwindowActivated(WindowEvente)//当窗口从非激活状态到激活状态时,窗口的监视器调用该方法publicvoidwindowDeactivated(WindowEvente)//当窗口从激活状态到非激活状态时,窗口的监视器调用该方法publicvoidwindowClosing(WindowEvente)//当窗口正在被关闭时,窗口的监视器调用该方法publicvoidwindowClosed(WindowEvente)//当窗口关闭时,窗口的监视器调用该方法58publicvoidwindowIconified(WindowEvente)//当窗口图标化时,窗口的监视器调用该方法publicvoidwindowDeiconified(WindowEvente)//当窗口撤消图标化时,窗口的监视器调用该方法publicvoidwindowOpened(WindowEvente)//当窗口打开时,窗口的监视器调用该方法注:当单击窗口上的关闭图标时,监视器首先调用windowClosing方法,如果在该方法中使用System.exit(0);退出程序的运行,那么监视器就没有机会再调用windowClosed方法。当单击窗口的图标化按钮时,监视器调用windowIconified后,还将调用windowDeactivated方法,当撤消窗口图标化时,监视器调用windowDeiconified方法后还会调用windowActivated方法。59importjava.awt.*;importjava.awt.event.*;classMyFrameextendsFrameimplementsWindowListener

{

TextAreatext;

MyFrame(Strings){

super(s);setBounds(100,100,200,300);

setVisible(true);text=newTextArea();

add(text,BorderLayout.CENTER);

addWindowListener(this);validate();}60

publicvoidwindowActivated(WindowEvente){

text.append("\n我被激活");validate();}

publicvoidwindowDeactivated(WindowEvente){

text.append("\n我不是激活状态了");setBounds(0,0,400,400);validate();}

publicvoidwindowClosing(WindowEvente){

System.out.println("\n窗口正在关闭呢");dispose();}

publicvoidwindowClosed(WindowEvente){

System.out.println("程序结束运行");System.exit(0);}61

publicvoidwindowIconified(WindowEvente){

text.append("\n我图标化了");}

publicvoidwindowDeiconified(WindowEvente){

text.append("\n我撤消图标化");setBounds(0,0,400,400);validate();}

publicvoidwindowOpened(WindowEvente){}}classExample6_16{publicstaticvoidmain(String

args[]){newMyFrame("窗口");}}62二、WindowAdapter适配器当一个类实现一个接口时,即使不准备处理某个方法,也必须给出接口中所有方法的实现。适配器可以代替接口来处理事件,当Java提供处理事件的接口中多于一个方法时,Java相应地就提供一个适配器类,比如WindowAdapter类。适配器已经实现了相应的接口,例如WindowAdapter实现了WindowListener接口。因此,可以使用WindowAdapter的子类创建的对象做监视器,在子类中重写所需要的接口方法即可。63importjava.awt.*;importjava.awt.event.*; classMyFrameextendsFrame{

TextAreatext;Boypolice;

MyFrame(Strings){

super(s);police=newBoy(this);setBounds(100,100,200,300);setVisible(true);text=newTextArea();add(text,BorderLayout.CENTER);

addWindowListener(police);validate();

}

}64classBoyextendsWindowAdapter

{

MyFramef;publicBoy(MyFramef){

this.f=f;}

publicvoidwindowActivated(WindowEvente)

{

f.text.append("\n我被激活");

}

publicvoidwindowClosing(WindowEvente)

{

System.exit(0);

}}65classExample6_17{publicstaticvoidmain(String

args[]){newMyFrame("窗口");}}66适配器经常这样使用:importjava.awt.*;importjava.awt.event.*;classMyFrameextendsFrame{

TextAreatext;

MyFrame(Strings){super(s);setBounds(100,100,200,300);setVisible(true);text=newTextArea();add(text,BorderLayout.CENTER);

addWindowListener(newWindowAdapter()

{publicvoidwindowActivated(WindowEvente){text.append("\n我被激活");}publicvoidwindowClosing(WindowEvente){System.exit(0);}

}

);validate();}}67鼠标事件任何组件上都可以发生鼠标事件,如:鼠标进入组件、退出组件、在组件上单击鼠标、拖动鼠标等都发生鼠标事件,也就是说,组件可以成为发生鼠标事件的事件源。一、使用MouseListener接口处理鼠标事件鼠标事件的类型是MouseEvent,即当发生鼠标事件时,MouseEvent类自动创建一个事件对象。MouseEvent类中有下列几个重要的方法:

getX()//获取鼠标事件源坐标系中的X坐标

getY()//获取鼠标事件源坐标系中的Y坐标

getModifiers()//获取鼠标的左键或右键。鼠标的左键和右键分别使用InputEvent类中的常量BUTTON1_MASK和BUTTON3_MASK来表示。

getClickCount()//获取鼠标被单击的次数

getSource()//获取发生鼠标事件的事件源68事件源获得监视器的方法是addMouseListener。MouseListener接口中有如下方法:mousePressed(MouseEvent)//负责处理鼠标按下事件mouseReleased(MouseEvent)//负责处理鼠标释放事件mouseEntered(MouseEvent)//负责处理鼠标进入事件mouseExited(MouseEvent)//负责处理鼠标离开事件mouseClicked(MouseEvent)//负责处理鼠标单击事件69importjava.awt.*;importjava.awt.event.*;classMyCanvasextendsCanvasimplementsMouseListener{

intleft=-1,right=-1;//记录左、右键用的变量

intx=-1,y=-1;//记录鼠标位置用的变量

MyCanvas(){setSize(200,200);

setBackground(Color.pink);

addMouseListener(this);//监视画布上的鼠标事件}publicvoidpaint(Graphicsg){if(left==1){g.drawString("按下了鼠标左键",x,y);}elseif(right==1){g.drawString("按下了鼠标右键",x,y);}}70

publicvoidmousePressed(MouseEvente)

{

x=e.getX();y=e.getY();if(e.getModifiers()==InputEvent.BUTTON1_MASK){left=1;right=-1;repaint();}elseif(e.getModifiers()==InputEvent.BUTTON3_MASK){right=1;left=-1;repaint();}

}

publicvoidmouseReleased(MouseEvente){}publicvoidmouseEntered(MouseEvente){}71

publicvoidmouseExited(MouseEvente){

left=-1;right=-1;repaint();

}

publicvoidmouseClicked(MouseEvente){}

publicvoidupdate(Graphicsg){

if(left==1||right==1){

paint(g);}else{

super.update(g);}

}}72publicclassExample6_18{publicstaticvoidmain(String

args[]){Framef=newFrame();f.setBounds(100,100,300,300);

f.setVisible(true);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论