实验四Java事件处理汽院含答案汇总.docx
《实验四Java事件处理汽院含答案汇总.docx》由会员分享,可在线阅读,更多相关《实验四Java事件处理汽院含答案汇总.docx(29页珍藏版)》请在冰豆网上搜索。
实验四Java事件处理汽院含答案汇总
实验四Java事件处理
实验目的
1.掌握Java语言中的事件处理方法
2.掌握Java语言中事件源、监视器和处理事件的接口的概念
实验导读
1.Java事件处理简介
学习组件除了了解组件的属性和功能外,学习组件除了了解组件的属性和功能外,一个更重要的方面是学习怎样处理组件上发生的界面事件。
当用户在文本框中输入文本后按Enter键、单击按钮、在一个下拉列表框中选择一个条目等操作时,都发生界面事件。
在学习处理事件时,必须很好地掌握事件源、监视器、处理事件的接口这三个概念。
●事件源:
能够产生事件的对象都可以成为事件源,如文本框、按钮、下拉式列表等。
也就是说,事件源必须是一个对象,而且这个对象必须是Java认为能够发生事件的对象。
●监视器:
需要一个对象对事件源进行监视,以便对发生的事件作出处理。
事件源通过调用相应的方法将某个对象作为自己的监视器。
例如,对于文本框,这个方法是:
addActionListener(监视器);
对于获取了监视器的文本框,当文本框获得输入焦点之后,如果用户按Enter键,Java运行系统就自动用ActionEvent类创建一个对象,即发生了ActionEvent事件。
也就是说,事件源获得监视器后,相应的操作就会导致事件的发生,并通知监视器,监视器就会做出相应的处理。
●处理事件的接口:
监视器负责处理事件源发生的事件。
监视器是一个对象,为了让监视器这个对象能对事件源发生的事件进行处理,创建该监视器对象的类必须声明实现相应的接口,即必须在类体中给出该接口中所有方法的方法体,那么当事件源发生事件时,监视器就自动调用类实现的某个接口中的方法。
2.文本框上的ActionEvent事件
java.awt.event包中提供了许多事件类和处理各种事件的接口。
对于文本框,这个接口的名字是ActionListener,这个接口中只有一个方法:
publicvoidactionPerformed(ActionEvente)
当在文本框中输入字符并按Enter键时,java.awt.event包中的ActionEvent类自动创建一个事件对象,并将它传递给actionPerformed(ActionEvente)方法中的参数e,监视器自动调用这个方法对发生的事件做出处理。
所以,称文本框这个事件源可以发生ActionEvent类型事件。
为了能监视到这种类型的事件,事件源必须使用addActionListener方法获得监视器;创建监视器的类必须实现接口ActionListener。
只要学会了处理文本框这个组件上的事件,其他事件源上的事件的处理也就很容易学会,所不同的是事件源能发生的事件类型不同,所使用的接口不同而已。
ActionEvent类有如下常用的方法:
⏹publicObjectgetSource()ActionEvent对象调用该方法可以获取发生ActionEvent事件的事件源对象的引用,即getSource()方法将事件源上转型为Object对象,并返回这个上转型对象的引用。
⏹publicStringgetActionCommand()ActionEvent对象调用该方法可以获取发生ActionEvent事件时,和该事件相关的一个命令字符串,对于文本框,当发生ActionEvent事件时,文本框中的文本字符串就是和该事件相关的一个命令字符串。
3.选择框和下拉列表上的ItemEvent事件
选择框从未选中状态变成选中状态或从选中状态变成未选中状态时、下拉列表选项列表中选中某个选项时就发生ItemEvent事件,即ItemEvent类自动创建一个事件对象。
发生ItemEvent事件的事件源获得监视器的方法是addItemListener(监视器)。
处理ItemEvent事件的接口是ItemListener,创建监视器的类必须实现ItemListener接口,该接口中只有一个方法。
当选择框发生ItemEvent事件时,监视器将自动调用接口方法:
itemStateChanged(ItemEvente)
对发生的事件进行处理。
4.鼠标事件
任何组件上都可以发生鼠标事件,如:
鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发组件发生鼠标事件,也就是说,组件可以成为发生鼠标事件的事件源。
使用MouseListener接口可以处理5种操作触发的鼠标事件:
(1)在事件源上按下鼠标键。
(2)在事件源上释放鼠标键。
(3)在事件源上击鼠标键。
(4)鼠标进入事件源。
(5)鼠标退出事件源。
鼠标事件的类型是MouseEvent,即当发生鼠标事件时,MouseEvent类自动创建一个事件对象。
MouseListener接口中的方法:
(1)mousePressed(MouseEvent)负责处理在组件上按下鼠标触发的鼠标事件,当在组件上按下鼠标时,监视器将自动调用接口中的这个方法对事件作出处理。
(2)mouseReleased(MouseEvent)负责处理在组件上释放鼠标触发的鼠标事件,当在组件上释放鼠标时,监视器将自动调用接口中的这个方法对事件作出处理。
(3)mouseEntered(MouseEvent)负责处理鼠进入组件触发的鼠标事件,当鼠标进入组件上方时,监视器将自动调用接口中的这个方法对事件作出处理。
(4)mouseExited(MouseEvent)负责处理鼠标离开组件触发的鼠标事件,当鼠标离开组件时,监视器自动调用接口中的这个方法对事件作出处理。
(5)mouseClicked(MouseEvent)负责处理在组件上单击或连击鼠标触发的鼠标事件,当单击或连击鼠标时,监视器自动调用接口中的这个方法对事件作出处理。
MouseMotionListener接口:
使用MouseMotionListener接口可以处理以下两种操作触发的鼠标事件:
(1)在事件源上拖动鼠标。
(2)在事件源上移动鼠标。
MouseMotionListener接口中有如下方法:
(1)mouseDragged(MouseEvent)负责处理在组件上拖动鼠标触发的鼠标事件,当在组件上拖动鼠标时,监视器调用接口中的这个方法对事件作出处理。
(2)mouseMoved(MouseEvent)负责处理在组件上运动鼠标触发的鼠标事件,当在组件上运动鼠标时,监视器调用接口中的这个方法对事件作出处理
5.焦点事件
组件可以触发焦点事件。
组件可以使用
publicvoidaddFocusListener(FocusListenerlistener)
增加焦点事件监视器。
当组件获得焦点监视器后,如果组件从无输入焦点变成有输入焦点或从有输入焦点变成无输入焦点都会触发FocusEvent事件。
创建监视器的类必须要实现FocusListener接口,该接口有两个方法:
publicvoidfocusGained(FocusEvente)
publicvoidfocusLost(FocusEvente)
当组件从无输入焦点变成有输入焦点触发FocusEvent事件时,监视器调用类实现的接口方法:
focusGained(FocusEvente);当组件从有输入焦点变成无输入焦点触发FocusEvent事件时,监视器调用类实现的接口方法:
focusLost(FocusEvente)。
用户通过单击组件可以使得该组件有输入焦点,同时也使得其他组件变成无输入焦点。
一个组件也可以调用
publicbooleanrequestFocusInWindow()
方法获得输入焦点。
6.键盘事件
当按下、释放或敲击键盘上一个键时就发生了键盘事件,在Java1.2事件模式中,必须要有发生事件的事件源。
当一个组件处于激活状态时,敲击键盘上一个键就导致这个组件上发生了键盘事件。
事件源使用addKeyListener方法获得监视器。
使用KeyListener接口处理键盘事件.接口KeyListener中有3个方法:
publicvoidkeyPressed(KeyEvente),
publicvoidkeyTyped(KeyEvente),
publicvoidKeyReleased(KeyEvente)。
当按下键盘上某个键时,监视器就会发现,然后keyPressed方法会自动执行,并且KeyEvent类自动创建一个对象传递给keyPressed方法中的参数e。
keyTyped方法是keyPressed和KeyReleased方法的组合,当键被按下又释放时,keyTyped方法被调用。
用KeyEvent类的publicintgetKeyCode()方法,可以判断哪个键被按下、敲击或释放,getKeyCode方法返回一个键码值。
也可以用KeyEvent类的publicchargetKeyChar()判断哪个键被按下、敲击或释放,getKeyChar方法返回键上的字符。
键盘事件KeyEvent对象调用getModifiers()方法,可以返回整数值ALT_MASK、CTRL_MASK、SHIFT_MASK,它们分别是InputEvent类的类常量。
程序可以通过getModifiers()方法返回的值处理组合键事件。
例如,对于KeyEvent对象e,当按下CTRL+X组合键时,下面的逻辑表达式为true:
e.getModifiers()==InputEvent.CTRL_MASK&&e.getKeyCode()==keyEvent.VK_X
Java事件处理就是基于这种授权模式,即发生相应事件的事件源对象,比如sourceObject,通过调用相应的方法:
sourceObject.addXXXListener(监视器);
将某个对象作为自己的监视器。
创建监视器对象的类必须声明实现相应的事件接口:
classAimplementsXXXListener
当事件源发生事件时,监视器将调用接口中相应的方法做出处理。
Java使用了接口回调技术设计了它的处理事件模式,注意到
addXXXListener(XXXListenerlistener)
方法中的参数是一个接口类型,listener可以引用任何实现了XXXListener接口的类所创建的对象,当事件源发生事件时,接口listener立刻回调类实现的接口中的某个方法。
事件的处理过程如下图所示:
图事件处理示意图
内部类实例做监视器:
Java支持在一个类中声明另一个类,这样的类成为内部类,而包含内部类的类成为内部类的外嵌类,外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。
匿名类是内部类的特殊情形,即省略类声明,可以直接用类体创建对象,因此,可以使用匿名内部类的对象做监视器。
例如:
xxx.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
}
});
实验内容
1.图形用户界面设计程序(ArtFont.java)
在实验三第1题的基础上,添加事件处理机制,并逐步完善程序功能。
分别用ArtFont类的对象做监视器和匿名内部类的对象做监视器实现。
要求实现如下功能:
●当在文本框中输入文字后回车,在文本域中显示输入的文字。
●当分别选择粗体和斜体复选框时,文本域中的文字分别显示粗体和斜体样式。
●当点击颜色按钮时,出现颜色选择对话框,选择需要的颜色,按确定按钮后,按钮的前景色和文本域的前景色设置为选定的颜色。
●当选择字体样式下拉框中的某一字体样式时,文本域中的文字设置为指定的字体样式。
●当选择字体大小下拉框中的某一字体大小时,文本域中的文字设置为指定的字体大小。
●当选择窗体样式下拉框中的某一窗体效果时,窗体外观改变为指定的窗体外观。
代码提示:
1)用ArtFont类的对象做监视器
publicclassCopyOfArtFontextendsJFrameimplementsActionListener,ItemListener{
JComboBoxwindowStyle;//窗体样式下拉框
JCheckBoxboldBx;//粗体按钮
JButtoncolorBtn;//颜色按钮
JTextFieldinputText;//文字输入框
privateJPanelgetNorthPanel(){
JPanelpanel=newJPanel();
inputText.addActionListener(this);
colorBtn.addActionListener(this);
returnpanel;
}
privateJPanelgetCenterPanel(){
JPanelpanel=newJPanel();
boldBx.addItemListener(this);
returnpanel;
}
privateJPanelgetSouthPanel(){
JPanelpanel=newJPanel();
windowStyle.addItemListener(this);
returnpanel;
}
@Override
publicvoiditemStateChanged(ItemEvente){
if(e.getSource()==windowStyle){
Strings=(String)e.getItem();
StringclassName="";
if(s.equals("Windows显示效果"))
className="com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
elseif(s.equals("Unix显示效果"))
className="com.sun.java.swing.plaf.motif.MotifLookAndFeel";
elseif(s.equals("默认显示效果"))
className=UIManager.getCrossPlatformLookAndFeelClassName();
try{
UIManager.setLookAndFeel(className);
SwingUtilities.updateComponentTreeUI(this);
}catch(Exceptionde){
System.out.println("Exceptionhappened!
");
}
}
}
@Override
publicvoidactionPerformed(ActionEvente){
}
}
2)用匿名内部类的对象做监视器
publicclassCopyOfArtFontextendsJFrame{
JComboBoxfontType;//字体样式下拉框,
JCheckBoxboldBx;//粗体按钮
JButtoncolorBtn;//颜色按钮;
JTextFieldinputText;//文字输入框;
privateJPanelgetNorthPanel(){
JPanelpanel=newJPanel();
inputText.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
}
});
returnpanel;
}
privateJPanelgetCenterPanel(){
JPanelpanel=newJPanel();
boldBx.addItemListener(newItemListener(){
@Override
publicvoiditemStateChanged(ItemEvente){
}
});
returnpanel;
}
privateJPanelgetSouthPanel(){
JPanelpanel=newJPanel();
fontType.addItemListener(newItemListener(){
@Override
publicvoiditemStateChanged(ItemEvente){
}
});
returnpanel;
}
}
答案代码:
importjavax.swing.*;
importjava.awt.*;
importjavax.swing.event.*;
importjava.awt.event.*;
publicclassArtFontextendsJFrameimplementsKeyListener,
ChangeListener,ItemListener,ActionListener{
JComboBoxfontType;//字体样式下拉框,
JComboBoxfontSize;//字体大小下拉框
JComboBoxwindowStyle;//窗体样式下拉框
JCheckBoxboldBx;//粗体按钮
JCheckBoxitalicBx;//斜体按钮
JButtoncolorBtn;//颜色按钮;
String[]fontNames;//字体名称;
String[]fontSizes;//字体大小;
JLabellabel;//输入提示标签;
JTextFieldinputText;//文字输入框;
JTextAreatxtArea;//文字显示区;
JPanelnorthPanel;//字体设置;
JPanelcenterPanel;//显示效果区
JPanelsouthPanel;//样式设置
Fontfont;
intboldStyle,italicStyle,underlineStyle;
intfontSizeStyle;
StringfontNameStyle;
ColorcolorStyle=Color.black;//设置字体的默认颜色为黑色;
String[]style={"默认显示效果","Windows显示效果","Unix显示效果"};
publicArtFont(){
super("字体设置");
//设置默认字体
boldStyle=0;
italicStyle=0;
underlineStyle=0;
fontSizeStyle=10;
fontNameStyle="宋体";
font=newFont(fontNameStyle,boldStyle+italicStyle,fontSizeStyle);
northPanel=getNorthPanel();
centerPanel=getCenterPanel();
southPanel=getSouthPanel();
//设置容器;
Containercontainer=getContentPane();
container.setLayout(newBorderLayout());
container.add(northPanel,BorderLayout.NORTH);//【补充代码】//将northPanel添加到窗体的北部
container.add(centerPanel,BorderLayout.CENTER);//【补充代码】//将centerPanel添加到窗体的北部
container.add(southPanel,BorderLayout.SOUTH);//【补充代码】//将southPanel添加到窗体的北部
setSize(500,300);
//【补充代码】//将窗体位于屏幕的中央
setLocationRelativeTo(null);
setVisible(true);}
privateJPanelgetNorthPanel(){
JPanelpanel=newJPanel();
label=newJLabel("输入",JLabel.LEFT);
//设置输入提示标签
panel.add(label);
//设置文本输入框;
inputText=newJTextField(10);
panel.add(inputText);
//inputText.addActionListener(this);
boldBx=newJCheckBox("粗体");
panel.add(boldBx);
italicBx=newJCheckBox("斜体");
panel.add(italicBx);
colorBtn=newJButton("颜色");
panel.add(colorBtn);
returnpanel;
}
privateJPanelgetCenterPanel(){
JPanelpanel=newJPanel();
panel.setLayout(newBorderLayout());
txtArea=newJTextArea();
panel.add(txtArea,BorderLayout.CENTER);
returnpanel;
}
privateJPanelgetSouthPanel(){
JPanelpanel=newJPanel();
GraphicsEnvironmentge=GraphicsEnvironment.getLocalGraphicsEnvironment();
fontNames=ge.getAvailableFontFamilyNames();//获得系统中所有字体的名字;
fontType=newJComboBox(fontNames);
fontType.setEditable(false);
fontType.setMaximumRowCount(10);
panel.add(fontType);
fontSizes=newString[63];
for(inti=0;i<63