java习题及答案第8章 习题参考答案.docx
《java习题及答案第8章 习题参考答案.docx》由会员分享,可在线阅读,更多相关《java习题及答案第8章 习题参考答案.docx(16页珍藏版)》请在冰豆网上搜索。
java习题及答案第8章习题参考答案
第8章图形用户界面编程
8.1什么是组件?
什么是容器?
并说明各自的作用。
答:
从实现角度来看,组件(Component)是构成GUI的基本要素,作用是通过对不同事件的响应来完成和用户的交互或组件之间的交互;容器是能容纳和排列组件的对象,如Applet、Panel(面板)、Frame(窗口)等,作用就是放置组件并控制组件位置。
8.2叙述AWT和Swing组件的关系,指出Swing组件的优点。
答:
Swing是在AWT基础上扩展而来的,提供了非常丰富的组件,远远多于AWT,并且引入了新的概念和性能,这使得基于Swing开发GUI应用程序比直接使用AWT开发更为灵活、方便、效率高,而且能设计出更优美的、感受更好的GUI。
Swing是由javax.swing包提供的,主要包括两种类型的组件:
顶层容器和轻量级组件。
它们都以“J”开头。
8.3总结JFrame的使用要点,并说明如何实现窗体的正常退出。
答:
JFrame类包含很多设置窗体的方法,可以用setTitle(Stringtitle)方法设置窗体标题,用setBounds(intx,inty,intwidth,intheight)方法设置窗体显示的位置及大小,用setVisable(Booleanb)方法设置可见与否(默认不可见)。
此外,向JFrame添加组件有两种方式:
调用getContentPane()方法获得内容面板,而后向其中添加组件,或者创建一个中间容器并将组件添加其中,而后用setContentPane()方法把该中间容器设置为JFrame的内容面板。
由于JFrame对象的关闭按钮的默认动作只是将窗体隐藏,所以为了正确关闭窗体,应通过setDefaultCloseOperation(intoperation)方法设置关闭按钮的动作。
8.4总结常用Swing组件使用特点。
答:
常用Swing组件使用时,首先要创建对应组件的对象,并放置在容器中,一般来说可用setText(Stringt)设置其的文本信息,setFont(Fontfont):
设置文本的字体及大小,对于列表类组件还可以用AddItem()等方法加入选项,用getSelectedIndices()以int[]形式获得被选中的所有选项的索引值,具体使用方法可参照例8.6。
8.5查阅资料,简述三个菜单类组件之间的关系,并编写一个带有文件菜单的GUI程序。
答:
菜单相关的类主要有菜单栏类JMenuBar、菜单类JMenu和菜单项类MenuItem,此外,还有单选菜单项类JRadioButtonMenuItem和复选菜单项类JCheckBoxMenuItem以及弹出式菜单类JPopupMenu等。
前三者的关系是菜单放置在菜单栏上,菜单由若干个菜单项组成。
提示:
带有文件菜单的GUI程序核心代码如下:
…
finalJFramefrm=newJFrame("文件菜单");
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setLayout(null);//设置为不使用布局管理器
//创建提示标签用于显示点击菜单的标题
finalJLabellbl=newJLabel("文件菜单示例");
lbl.setBounds(150,100,300,30);
frm.add(lbl);
//创建菜单栏并添加到窗体顶部
JMenuBarmbar=newJMenuBar();
frm.setJMenuBar(mbar);
//创建文件下拉式菜单,并添加到菜单栏
JMenufilemenu=newJMenu("文件");
mbar.add(filemenu);
//创建菜单项,并添加到文件菜单下
JMenuItemopenfileItem=newJMenuItem("打开文件");
JMenuItemclosefileItem=newJMenuItem("关闭文件");
//JMenuItemexitItem=newJMenuItem("系统退出");
filemenu.add(openfileItem);
filemenu.add(closefileItem);
filemenu.add("系统退出");//直接添加菜单项
//获取到直接添加的菜单项,并注册鼠标动作,输出菜单项标题
finalJMenuItemexitItem=filemenu.getItem
(2);//2表示第三个菜单项
exitItem.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
lbl.setText(exitItem.getText());
exitItem.setText("退出");
}
});
…
8.6简述使用面板的原因,编写一个继承自JPanel的面板类MyPanel。
答:
用面板可以实现对所有组件进行分层管理,即对不同关系的组件采用不同的布局管理方式,使组件的布局更加合理和程序的界面更加美观。
编程提示:
编写继承自JPanel的面板类MyPanel时,可在MyPanel类中直接放置上面板要放置的组件,在使用该面板时就可以直接放置在窗体上了,例如可创建一个LoginPanel,上面放上用户名和密码输入框及其文本标签,并添加登录和退出按钮和相关代码。
8.7对比各种布局管理方式,指出各自的应用场合。
答:
常见的布局管理器有边界布局(BorderLayout)、顺序布局(FlowLayout)、网格布局(GridLayout)和卡片布局(CardLayout)等,还有空布局管理的支持(指不用布局管理器)。
其中,各种布局管理方式与适合应用的场合如下:
Ø空布局管理是直接定位的方式排列容器中的组件,适合只在某一平台运行的程序采用;
Ø边界布局管理器将容器划分为5个部分:
顶部(NORTH)、容器底部(SOUTH)、容器左侧(WEST)、容器右侧(EAST)和容器中心(CENTER),该方式适合需要将组件控制在一定相对位置的应用;
Ø流布局管理器是在一行上排列组件,而当该行没足够的空间时则回行显示,容器大小改变时,组件将自动重排,该方式适合窗体变化时仍需显示各组件的应用;
Ø网格布局管理器是将容器按照用户的设置平均划分成若干个网格,每个网格放置一个组件或容器,该方式适合组件需要规则排列的应用;
Ø卡片布局则将容器分为若干层,将各组件按层放入,就像重叠起来的扑克牌,每次只能看到第一张,即最上面的一张,该方式适合需要呈现多组界面的应用。
8.8什么是事件源?
什么是监听器?
使用Java语言编写GUI程序时,两者分别是什么?
答:
事件源是事件发生的场所,通常是各个组件,如被按下的按钮;监听器即事件处理者,是对收到的事件进行处理的程序;而事件是用户对界面的操作,如操作键盘时触发的键盘事件。
8.9简述常用组件可以处理的事件。
答:
常用组件可以处理的事件如下表。
AWT事件源
Swing事件源
产生事件的类型
Buttion
JButtion
ActionEvent
CheckBox
JCheckBox
ActionEvent、ItemEvent
MenuItem
JMenuItem
ActionEvent
ScrollBar
JScrollBar
AdjustmentEvent
TextField
JTextField
ActionEvent
TextArea
JTextArea
ActionEvent
Window
JWindow
WindowEvent
Component
JComponent
ComponentEvent、FocusEvent、KeyEvent、MouseEvent
8.10何谓事件适配器类?
使用这种类有何好处?
答:
事件适配器类(MouuseMotionAdapter、MouseAdapter和WindowAdapter)实际上是一些实现了事件监听器接口(事件类对应的接口)类,程序员可以直接使用,而不用实现这些接口,这样做的好处是可以简化代码,即只需要扩展该类并重载所需的方法,而不象实现接口时,需要将大量不需要的方法也一一实现。
8.11简述GUI编程的注意事项,给出事件处理的基本步骤。
答:
编写GUI程序时应注意如下事项:
Ø选择合适的顶层容器,即窗体(JWindow)、对话框(JDialog)和结构(JFrame);
Ø指定或设计所需的布局管理器,获得容器面板;
Ø在容器面板上放入界面元素并为按钮等组件注册事件处理程序,编写相关类。
事件处理的基本步骤是
Ø创建某组件对象,并考虑该组件对象相关哪个或哪些事件,如创建按钮对象,相关的事件是动作事件,即ActionEvent;
Ø编写该组件对象的事件处理者类,即实现要处理事件对应的监听器接口,如编写事件处理者ButtonHandler类,实现ActionEvent对应的ActionListenter接口,具体来说实现了该接口中的voidactionPerformed(ActionEvente)方法,在该方法中加入处理该事件的代码;
Ø创建事件处理者类的实例,并调用组件对象的对应该类事件的添加方法来注册监听器,如调用按钮的addActionListener(ActionListenerl)方法添加ButtonHandler类的实例。
8.12使用Swing组件编写一个学生基本信息录入GUI程序。
答:
参考代码如下:
importjava.awtponent;
importjava.awt.Font;
importjava.awt.event.*;
importjavax.swing.*;
publicclassStudentScore{
publicstaticvoidmain(String[]args){
LoginDialogdlg=newLoginDialog();
dlg.setVisible(true);
}
}
classMainWindowextendsJFrame{//主窗体类
staticJLabelsubmit;//回显录入成绩标签
MainWindow(){
setTitle("学生成绩录入系统");
setBounds(400,200,200,120);
//setExtendedState(JFrame.MAXIMIZED_BOTH);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setLayout(null);//设置为不使用布局管理器
createMenu();
submit=newJLabel();
submit.setBounds(5,5,400,20);
add(submit);
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
exitSystem();
}
});
}
voidexitSystem()//处理退出系统事件
{
intret=JOptionPane.showConfirmDialog(this,"退出系统吗?
","退出系统吗?
",JOptionPane.YES_NO_OPTION);
if(ret==JOptionPane.YES_OPTION){
//dispose();//不能退出登录对话框,需修改登录对话框中的login()方法。
System.exit(0);
}
}
voidcreateMenu(){
//创建菜单栏并添加到窗体顶部
JMenuBarmbar=newJMenuBar();
setJMenuBar(mbar);
//创建2个下拉式菜单,并添加到菜单栏
JMenum1=newJMenu("系统管理");
JMenum2=newJMenu("成绩管理");
mbar.add(m1);
mbar.add(m2);
//创建菜单项,并添加到相应的菜单下
JMenuItemmi11=newJMenuItem("基本信息管理");
JMenuItemmi12=newJMenuItem("修改密码");
JMenuItemmi13=newJMenuItem("退出系统");
mi11.setEnabled(false);
mi12.setEnabled(false);
m1.add(mi11);
m1.add(mi12);
m1.add(mi13);
//为退出系统菜单项添加事件
mi13.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
exitSystem();
}
});
JMenuItemmi21=newJMenuItem("成绩录入");
JMenuItemmi22=newJMenuItem("成绩查询");
mi22.setEnabled(false);
m2.add(mi21);
m2.add(mi22);
//为成绩录入菜单项添加事件
mi21.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
inputScores();
}
});
}
voidinputScores(){//录入成绩方法
InputScoresDialogisd=newInputScoresDialog();
isd.setVisible(true);
}
staticvoidsetSubmit(Stringstr){
submit.setText(str);
}
}//classMainWindow
classInputScoresDialogextendsJDialog{//录入成绩对话框类
JComboBoxname;
JTextFieldmaths;
JComboBoxenglish;
InputScoresDialog(){
setTitle("成绩录入");
setBounds(500,250,240,180);
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
setLayout(null);
setModal(true);
createGUIElements();
}
voidcreateGUIElements(){
JLabelnamelbl=newJLabel("姓名:
");
namelbl.setBounds(10,20,60,25);
add(namelbl);
JLabelmathslbl=newJLabel("数学:
");
mathslbl.setBounds(10,50,60,25);
add(mathslbl);
JLabelenglishlbl=newJLabel("英语:
");
englishlbl.setBounds(10,80,80,25);
add(englishlbl);
name=newJComboBox();
name.setBounds(100,20,120,25);
name.addItem("孙文轩");
name.addItem("孙文迪");
add(name);
maths=newJTextField();
maths.setBounds(100,50,120,25);
maths.setText("100");
add(maths);
String[]ranks={"优秀","良好","中等","及格","不及格"};
english=newJComboBox(ranks);
english.setBounds(100,80,120,25);
add(english);
JButtonsubmitBtn=newJButton("提交");
submitBtn.setBounds(20,120,80,25);
add(submitBtn);
JButtoncancelBtn=newJButton("放弃");
cancelBtn.setBounds(130,120,80,25);
add(cancelBtn);
//遍历容器中的所有组件,设置字体
for(inti=0;iComponentcomp=this.getContentPane().getComponent(i);
comp.setFont(newFont("宋体",Font.BOLD,20));
}
//添加提交成绩事件
submitBtn.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
Stringstr="姓名:
"+name.getSelectedItem().toString()+";数学:
"
+maths.getText()+";英语:
"
+english.getSelectedItem().toString();
MainWindow.setSubmit(str);//调用主窗体的静态方法显示,此处可改为存入数据库中
}
});
cancelBtn.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
dispose();//撤销成绩录入对话框,返回主窗体
}
});
}
}
classLoginDialogextendsJDialog{//登录对话框类
JLabelusernamelbl;
JLabelpasswordlbl;
JComboBoxusername;
JPasswordFieldpassword;
JButtonloginBtn;
JButtoncancelBtn;
LoginDialog(){
createGUIElements();
}//
voidcreateGUIElements(){
//设置登录对话框,并设置位置及大小、模态等
setTitle("登录系统");
setBounds(500,250,200,120);
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
setLayout(null);
setModal(true);
//创建用户名与密码标签
usernamelbl=newJLabel("用户名:
");
usernamelbl.setBounds(20,10,50,20);
this.add(usernamelbl);
passwordlbl=newJLabel("密码:
");
passwordlbl.setBounds(20,32,50,20);
this.add(passwordlbl);
//创建用户名与密码输入组件,并赋处值
username=newJComboBox();
username.addItem("administrator");
username.addItem("whitesun");
username.setBounds(75,10,105,20);
this.add(username);
password=newJPasswordField("123456");
password.setBounds(75,33,105,20);
password.setEchoChar('*');
this.add(password);
//创建登录与退出按钮,并添加事件
loginBtn=newJButton("登录");
loginBtn.setBounds(25,60,60,20);
add(loginBtn);
loginBtn.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
login();
}//方法结束
});
cancelBtn=newJButton("退出");
cancelBtn.setBounds(110,60,60,20);
add(cancelBtn);
cancelBtn.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
logout();
}
});
}
voidlogin()//处理登录按钮事件
{
Stringaccout=username.getSelectedItem().toString();
Stringpwd=newString(password.getPassword(