Java程序设计 - 试验6(学生版) 下载本文

华北电力大学

| || |

实 验 报 告

实验名称 Application及Applet程序设计 课程名称 Java程序设计 专业班级: 学生姓名: 学 号:

成 绩:

指导教师:张学斌 实验日期:

华 北 电 力 大 学 实 验 报 告

一、实验目的和要求 1掌握Java Swing 组件的使用方法; 2 理解委托代理事件处理模型掌握; 3 掌握窗口菜单和快捷菜单设计方式; 4 掌握在组件上绘图的方法; 5 掌握Applet应用程序的设计方法 二、实验环境 Windows2000/Windows XP,JDK 1.2~1.6 三、实验内容和步骤 要求按照实验内容,写出详细实验过程和步骤,必要时截图。 实验1 算术测试 1.实验要求 编写一个算术测试小软件,用来训练小学生的算术能力。程序有三个类组成,其中Teacher对象充当监视器,负责给出算术题目,并判断回答者的答案是否正确;ComputerFrame对象负责为算术题目提供视图,比如用户可以通过ComputerFrame对象提供的GUI界面看到题目,并通过GUI界面给出题目的答案;MailClass是软件的主类。 2.程序模板 MainClass.java public class MainClass { public static void main(String args[]) { ComputerFrame frame; frame=new ComputerFrame(); frame.setTitle(\算术测试\ frame.setBounds(100,100,650,180); } } ComputerFrame.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComputerFrame extends JFrame { JMenuBar menubar; JMenu choiceGrade; //选择级别的菜单 第 2 页 共 21 页

华 北 电 力 大 学 实 验 报 告

JMenuItem grade1,grade2; JTextField textOne,textTwo,textResult; JButton getProblem,giveAnwser; JLabel operatorLabel,message; Teacher teacherZhang; ComputerFrame() { teacherZhang=new Teacher(); teacherZhang.setMaxInteger(20); setLayout(new FlowLayout()); menubar = new JMenuBar(); choiceGrade = new JMenu(\选择级别\ grade1 = new JMenuItem(\幼儿级别\ grade2 = new JMenuItem(\儿童级别\ grade1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { teacherZhang.setMaxInteger(10); } }); grade2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { teacherZhang.setMaxInteger(50); } }); choiceGrade.add(grade1); choiceGrade.add(grade2); menubar.add(choiceGrade); setJMenuBar(menubar); 【代码1】 //创建textOne,其可见字符长是5 textTwo=new JTextField(5); textResult=new JTextField(5); operatorLabel=new JLabel(\ operatorLabel.setFont(new Font(\ message=new JLabel(\你还没有回答呢\ getProblem=new JButton(\获取题目\ giveAnwser=new JButton(\确认答案\ add(getProblem); add(textOne); add(operatorLabel); add(textTwo); add(new JLabel(\ add(textResult); add(giveAnwser); add(message); textResult.requestFocus(); textOne.setEditable(false); 第 3 页 共 21 页

华 北 电 力 大 学 实 验 报 告

textTwo.setEditable(false); getProblem.setActionCommand(\ textResult.setActionCommand(\ giveAnwser.setActionCommand(\ teacherZhang.setJTextField(textOne,textTwo,textResult); teacherZhang.setJLabel(operatorLabel,message); 【代码2】//将teacherZhang注册为getProblem的ActionEvent事件监视器 【代码3】//将teacherZhang注册为giveAnwser的ActionEvent事件监视器 【代码4】//将teacherZhang注册为textResult的ActionEvent事件监视器 setVisible(true); validate(); setDefaultCloseOperation(DISPOSE_ON_CLOSE); } } Techaer.java import java.util.Random; import java.awt.event.*; import javax.swing.*; public class Teacher implements ActionListener { int numberOne,numberTwo; String operator=\ boolean isRight; Random random; //用于给出随机数 int maxInteger; //题目中最大的整数 JTextField textOne,textTwo,textResult; JLabel operatorLabel,message; Teacher() { random = new Random(); } public void setMaxInteger(int n) { maxInteger=n; } public void actionPerformed(ActionEvent e) { String str = e.getActionCommand(); if(str.equals(\ numberOne = random.nextInt(maxInteger)+1;//1至maxInteger之间的随机数; numberTwo=random.nextInt(maxInteger)+1; double d=Math.random(); // 获取(0,1)之间的随机数 if(d>=0.5) operator=\ else operator=\ textOne.setText(\ textTwo.setText(\ operatorLabel.setText(operator); 第 4 页 共 21 页

华 北 电 力 大 学 实 验 报 告

message.setText(\请回答\ textResult.setText(null); } else if(str.equals(\ String answer=textResult.getText(); try{ int result=Integer.parseInt(answer); if(operator.equals(\ if(result==numberOne+numberTwo) message.setText(\你回答正确\ else message.setText(\你回答错误\ } else if(operator.equals(\ if(result==numberOne-numberTwo) message.setText(\你回答正确\ else message.setText(\你回答错误\ } } catch(NumberFormatException ex) { message.setText(\请输入数字字符\ } } } public void setJTextField(JTextField ... t) { textOne=t[0]; textTwo=t[1]; textResult=t[2]; } public void setJLabel(JLabel ...label) { operatorLabel=label[0]; message=label[1]; } } 3.实验指导 Jbutton对象可触发ActionEvent事件。为了能监视到此类事件,事件源必须使用addActionListener方法获得监视器,创建监视器的类必须实现接口ActionListener。 4.实验扩展 (1)模仿本实验代码,再增加“小学生”级别。 (2)给出上述程序增加测试乘法的功能。 第 5 页 共 21 页

华 北 电 力 大 学 实 验 报 告

实验2 布局与日历 1. 实验要求 编写一个应用程序,有一个窗口,该窗口的布局为BorderLayout布局。窗口的中心添加一个JPanel容器pCenter, pCenter的布局是7行7列的GriderLayout布局,pCenter中放置49个标签,用来显示日历。窗口的北面添加一个JPanel容器pNorth,其布局是FlowLayout布局,pNorth放置两个按钮:nextMonth和previousMonth。单击nextMonth按钮,可以显示当前月的下一月的日历;单击previousMonth按钮,可以显示当前月的上一月的日历;窗口的南面添加一个Jpanel容器pSouth,其布局是FlowLayout布局,pSouth中放置一个标签用来显示一些信息。 2.程序模板 CalendarMainClass.java public class CalendarMainClass { public static void main(String args[]) { CalendarFrame frame=new CalendarFrame(); frame.setBounds(100,100,360,300); frame.setVisible(true); frame.setYearAndMonth(2015,5); } } CalendarBean.java import java.util.Calendar; public class CalendarBean { String day[]; int year=2005,month=0; public void setYear(int year) { this.year=year; } public int getYear() { return year; } public void setMonth(int month) { this.month=month; } public int getMonth() { return month; } public String[] getCalendar() { String a[]=new String[42]; Calendar 日历=Calendar.getInstance(); 日历.set(year,month-1,1); int 星期几=日历.get(Calendar.DAY_OF_WEEK)-1; int day=0; if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) day=31; 第 6 页 共 21 页

华 北 电 力 大 学 实 验 报 告

if(month==4||month==6||month==9||month==11) day=30; if(month==2) { if(((year%4==0)&&(year0!=0))||(year@0==0)) day=29; else day=28; } for(int i=星期几,n=1;i<星期几+day;i++) { a[i]=String.valueOf(n) ; n++; } return a; } } CalendarFrame.java import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class CalendarFrame extends JFrame implements ActionListener { JLabel labelDay[]=new JLabel[42]; JButton titleName[]=new JButton[7]; String name[]={\日\一\二\三\四\五\六\ JButton nextMonth,previousMonth; CalendarBean calendar; JLabel showMessage=new JLabel(\ int year=2011,month=2; public CalendarFrame() { JPanel pCenter=new JPanel(); 【代码1】 //将pCenter的布局设置为7行7列的GridLayout 布局。 for(int i=0;i<7;i++) { titleName[i]=new JButton(name[i]); titleName[i].setBorder(new SoftBevelBorder(BevelBorder.RAISED)); pCenter.add(titleName[i]); } for(int i=0;i<42;i++) { labelDay[i]=new JLabel(\ labelDay[i].setBorder(new SoftBevelBorder(BevelBorder.LOWERED)); 【代码2】//pCenter添加组件labelDay[i]。 } calendar=new CalendarBean(); nextMonth=new JButton(\下月\ previousMonth=new JButton(\上月\第 7 页 共 21 页

华 北 电 力 大 学 实 验 报 告

nextMonth.addActionListener(this); previousMonth.addActionListener(this); JPanel pNorth=new JPanel(), pSouth=new JPanel(); pNorth.add(previousMonth); pNorth.add(nextMonth); pSouth.add(showMessage); add(pCenter,BorderLayout.CENTER); 【代码3】 // 窗口添加pNorth 在北面区域 【代码4】 // 窗口添加pSouth 在南区域。 setYearAndMonth(year,month); setDefaultCloseOperation(DISPOSE_ON_CLOSE); } public void setYearAndMonth(int y,int m) { calendar.setYear(y); calendar.setMonth(m); String day[]=calendar.getCalendar(); for(int i=0;i<42;i++) labelDay[i].setText(day[i]); showMessage.setText(\日历:\年\月\ } public void actionPerformed(ActionEvent e) { if(e.getSource()==nextMonth) { month=month+1; if(month>12) month=1; calendar.setMonth(month); String day[]=calendar.getCalendar(); for(int i=0;i<42;i++) { labelDay[i].setText(day[i]); } } else if(e.getSource()==previousMonth) { month=month-1; if(month<1) month=12; calendar.setMonth(month); String day[]=calendar.getCalendar(); for(int i=0;i<42;i++) labelDay[i].setText(day[i]); } showMessage.setText(\日历:\年\月\ } } 第 8 页 共 21 页

华 北 电 力 大 学 实 验 报 告

3.实验扩展 在CalendarFrame类中增加一个JTextField文本框,用户可以通过在文本框中输入年份来修改calendar对象的int成员year 实验3 英语单词拼写训练 1.实验要求 编写一个应用程序,要求如下: ? 窗口有一个TextField对象和一个按钮对象,将这两个对象添加到一个面板中,然后将该面板添加到窗口的上面。 ? 用户在TextField对象中输入一个英文单词,然后按Enter或单击“确定”按钮,程序将创建若干个不可编辑的文本框,每个文本框随机显示英文单词中的一个字母。要求将这些文本框按一行添加到一个面板中,然后将该面板添加到窗口的中心。 ? 用户用鼠标单击一个文本框后,通过按下键盘上的“←”和“→”键交换相邻文本框中的字母,使得这些文本框中的字母的排列顺序和英文单词中字母的顺序相同。 2.程序模板 WordMainClass.java public class WordMainClass { public static void main(String args[]) { new SpellingWordFrame(); } } ------------------------------------------------------------------------------------------------- RondomString.java public class RondomString { //负责随机排列单词中的字母 String str=\ public String getRondomString(String s) { StringBuffer strBuffer=new StringBuffer(s); int m=strBuffer.length(); for(int k=0;k

华 北 电 力 大 学 实 验 报 告

public class LetterLabel extends JTextField implements FocusListener { LetterLabel() { setEditable(false); addFocusListener(this);//【代码1】 //将当前对象注册为自身的焦点视器 setBackground(Color.white); setFont(new Font(\ } public static LetterLabel[] getLetterLabel(int n) { LetterLabel a[]=new LetterLabel[n]; for(int k=0;k

华 北 电 力 大 学 实 验 报 告

northP.add(button); centerP=new JPanel(); wordBox=Box.createHorizontalBox(); centerP.add(wordBox); add(northP,BorderLayout.NORTH); add(centerP,BorderLayout.CENTER); add(messaageLabel,BorderLayout.SOUTH); setBounds(100,100,350,180); setVisible(true); validate(); setDefaultCloseOperation(DISPOSE_ON_CLOSE); } public void actionPerformed(ActionEvent e) { word=inputWord.getText(); int n=word.length(); RondomString rondom=new RondomString(); String randomWord=rondom.getRondomString(word); wordBox.removeAll(); messaageLabel.setText(hintMessage); if(n>0) { label=LetterLabel.getLetterLabel(n); for(int k=0;k

华 北 电 力 大 学 实 验 报 告

label[index-1].requestFocus(); } } else if(【代码3】) { //判断按下的是否是→键 for(int k=0;k

华 北 电 力 大 学 实 验 报 告

实验4 字体对话框 1.实验要求 编写一个FontFamily类,该类对象可以获取当前机器可用的全部字体名称。 编写一个JDialog的子类FontDialog,该类为FontFamily对象维护的数据提供视图,要求FontDialog对象使用下拉列表显示FontFamily对象维护的全部字体的名称,当选择下拉列表中某个字体名称后,FontDialog对象用标签显示该字体的效果。要求对话框提供返回下拉列表中所选择的字体名称的方法。 编写一个窗口,该窗口中有“设置字体”按钮和一文本区对象,当单击该按钮时,弹出一个FontDialog创建的对话框,然后根据用户在对话框下拉列表中选择的字体来显示文本区中的文本。 2.程序模板 FontDialogMainClass.java public class FontDialogMainClass { public static void main(String args[]) { FrameHaveDialog win=new FrameHaveDialog(); } } -------------------------------------------------------------------------- FontFamilyNames.java import java.awt.GraphicsEnvironment; public class FontFamilyNames { String allFontNames[]; public String [] getFontName() { GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment(); allFontNames=ge.getAvailableFontFamilyNames(); return allFontNames; } } ----------------------------------------------------------------------------------- FontDialog.java import java.awt.event.*; import java.awt.*; import javax.swing.*; public class FontDialog extends JDialog implements ItemListener,ActionListener { FontFamilyNames fontFamilyNames; int fontSize=38; String fontName; JComboBox fontNameList,fontSizeList; JLabel label; Font font; JButton yes,cancel; static int YES=1,NO=0; int state=-1; FontDialog(JFrame f) { 第 13 页 共 21 页

华 北 电 力 大 学 实 验 报 告

super(f); setTitle(\字体对话框\ font=new Font(\宋体\ fontFamilyNames=new FontFamilyNames(); 【代码1】 //当前对话框调用setModal(boolean b)设置为有模式 yes=new JButton(\ cancel=new JButton(\ yes.addActionListener(this); cancel.addActionListener(this); label=new JLabel(\奥运\ fontNameList=new JComboBox(); fontSizeList=new JComboBox(); String name[]=fontFamilyNames.getFontName(); fontNameList.addItem(\字体\ for(int k=0;k

华 北 电 力 大 学 实 验 报 告

label.repaint(); validate(); } public void actionPerformed(ActionEvent e) { if(e.getSource()==yes) { state=YES; 【代码2】 //对话框设置为不可见 } else if(e.getSource()==cancel) { state=NO; 【代码3】 //对话框设置为不可见 } } public int getState() { return state; } public Font getFont() { return font; } } ------------------------------------------------------------------ FrameHaveDialog.java import java.awt.event.*; import java.awt.*; import javax.swing.*; public class FrameHaveDialog extends JFrame implements ActionListener { JTextArea text; JButton buttonFont; FrameHaveDialog() { buttonFont=new JButton(\设置字体\ text=new JTextArea(\实用教程(第四版)\ buttonFont.addActionListener(this); add(buttonFont,BorderLayout.NORTH); add(text); setBounds(60,60,300,300); setVisible(true); validate(); setDefaultCloseOperation(DISPOSE_ON_CLOSE); } public void actionPerformed(ActionEvent e) { if(e.getSource()==buttonFont) { FontDialog dialog=new FontDialog(this); dialog.setVisible(true); if(dialog.getState()==FontDialog.YES) { text.setFont(dialog.getFont()); 第 15 页 共 21 页

华 北 电 力 大 学 实 验 报 告

text.repaint(); } if(dialog.getState()==FontDialog.NO) { text.repaint(); } } } } 实验5 华容道游戏 1. 实验要求 首先,编写一个按钮的子类,该子类创建的对象代表华容道中的任务。通过焦点事件控制人物的颜色,当人物获得焦点时颜色为蓝色,当失去焦点时颜色为灰色。我们通过键盘事件和鼠标事件来实现曹操,关羽等人物的移动。当人物上发生鼠标事件或键盘事件时,如果鼠标指针的位置是在人物的下方(也就是组件的下半部分)或按键盘上的“↓”键,人物向下移动。向左,向右和向上移动原理类似。 2. 程序模板 MoveExample.java import java.awt.*; import java.applet.*; import java.awt.event.*; import javax.swing.*; public class MoveExample { public static void main(String args[]) { new Hua_Rong_Road(); } } class Person extends JButton implements FocusListener { int number; Color c; Person(int number,String s) { super(s); this.number=number; c=getBackground(); setFont(new Font(\宋体\ 【代码1】 // 当前按钮注册为本身的监视器 } public void focusGained(FocusEvent e) { setBackground(Color.cyan); } public void focusLost(FocusEvent e) { setBackground(c); } } 第 16 页 共 21 页

华 北 电 力 大 学 实 验 报 告

class Hua_Rong_Road extends JFrame implements KeyListener,MouseListener,ActionListener { Person person[]=new Person[10]; JButton left,right,above,below; JButton restart=new JButton(\重新开始\ Container con; public Hua_Rong_Road() { init(); setBounds(100,100,320,360); setVisible(true); validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void init() { con=getContentPane(); con.setLayout(null); con.add(restart); restart.setBounds(100,5,120,25); restart.addActionListener(this); String name[]={\曹操\关羽\张\刘\马\许\兵\兵\兵\兵\ for(int i=0;i

华 北 电 力 大 学 实 验 报 告

right.setBounds(254,49,5,260); above.setBounds(49,49,210,5); below.setBounds(49,304,210,5); con.validate(); } public void keyPressed(KeyEvent e) { Person man=【代码5】 // 返回事件源 if(【代码6】) { // 判断是否按了“↓”键 goDown(man); } if(【代码7】){ // 判断是否按了“↑”键 goUp(man); } if(【代码8】) { // 判断是否按了“←”键 goLeft(man); } if(【代码9】) { // 判断是否按了“→”键 goRight(man); } } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public void mousePressed(MouseEvent e) { Person man=【代码10】 // 返回事件源 int x=1,y=1; x=e.getX(); y=e.getY(); int w=man.getBounds().width; int h=man.getBounds().height; if(y>h/2) goDown(man); if(yw/2) goRight(man); } public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void goDown(Person man) { boolean move=true; Rectangle manRect=man.getBounds(); 第 18 页 共 21 页

华 北 电 力 大 学 实 验 报 告

int x=man.getBounds().x; int y=man.getBounds().y; y=y+50; manRect.setLocation(x,y); Rectangle belowRect=below.getBounds(); for(int i=0;i<10;i++) { Rectangle personRect=person[i].getBounds(); if((manRect.intersects(personRect))&&(man.number!=i)) move=false; } if(manRect.intersects(belowRect)) move=false; if(move==true) man.setLocation(x,y); } public void goUp(Person man) { boolean move=true; Rectangle manRect=man.getBounds(); int x=man.getBounds().x; int y=man.getBounds().y; y=y50; manRect.setLocation(x,y); Rectangle aboveRect=above.getBounds(); for(int i=0;i<10;i++) { Rectangle personRect=person[i].getBounds(); if((manRect.intersects(personRect))&&(man.number!=i)) move=false; } if(manRect.intersects(aboveRect)) move=false; if(move==true) man.setLocation(x,y); } public void goLeft(Person man) { boolean move=true; Rectangle manRect=man.getBounds(); int x=man.getBounds().x; int y=man.getBounds().y; x=x-50; manRect.setLocation(x,y); Rectangle leftRect=left.getBounds(); for(int i=0;i<10;i++) { Rectangle personRect=person[i].getBounds(); if((manRect.intersects(personRect))&&(man.number!=i)) move=false; 第 19 页 共 21 页

华 北 电 力 大 学 实 验 报 告

} if(manRect.intersects(leftRect)) move=false; if(move==true) man.setLocation(x,y); } public void goRight(Person man) { boolean move=true; Rectangle manRect=man.getBounds(); int x=man.getBounds().x; int y=man.getBounds().y; x=x+50; manRect.setLocation(x,y); Rectangle rightRect=right.getBounds(); for(int i=0;i<10;i++) { Rectangle personRect=person[i].getBounds(); if((manRect.intersects(personRect))&&(man.number!=i)) move=false; } if(manRect.intersects(rightRect)) move=false; if(move==true) man.setLocation(x,y); } public void actionPerformed(ActionEvent e) { con.removeAll(); init(); validate(); repaint(); } } 实验6 二十四点牌戏问题 1. 实验要求 一副扑克牌,去掉王牌,J、Q、K、A分别算作11,12,13和1点。每次从52张中随机抽出4张牌。要求将这4张牌的牌点通过加,减,乘,除运算的组合,凑成24点。规则是:所抽出的4张牌,每张牌都必须使用,且每张牌只能使用一次。 要设计出图形界面。纸牌的图案自行添加。 2. 程序结果 第 20 页 共 21 页

华 北 电 力 大 学 实 验 报 告

第 21 页 共 21 页