一、实验目的及要求
1. 安装并配置Java运行开发环境;
2. 掌握开发Java应用程序的3个步骤:编写源文件、编译源文件和运行应用程序; 3. 学习同时编译多个Java源文件;
4. 掌握char型数据和int型数据之间的相互转换,同时了解unicode字符表; 5. 掌握使用if…else分支和while循环语句解决问题。 二、实验学时
6学时 三、实验任务
1.安装JDK,设置环境变量PATH和CLASSPATH。
1)下载JDK
为了建立基于SDK的java运行环境,需要先下载sun的免费SDK软件包。在浏览器中输入http://java.sun.com进入sun公司官方网站页面。在页面右边“Popular Downloads”栏中可看到最新版的JDK软件包(JDK1.6),并下载。
2)安装JDK
运行下载的“jdk-6u1-windows-i586-p.exe”软件包,在安装过程中可以设置安装路径及选择组件,默认的组件选择是全部安装,安装成功后,其中bin文件夹中包含编译器(javac.exe)、解释器(java.exe)、Applet查看器(appletviewer.exe)等可执行文件,lib文件夹中包含了所有的类库以便开发Java程序使用,demo文件夹中包含开源代码程序实例。
3)JDK中主要文件夹和文件
安装成功后,d:\\java\\jdk1.6中bin文件夹中包含编译器(javac.exe)、解释器(java.exe)、Applet查看器(appletviewer.exe)等可执行文件,lib文件夹中包含了所有的类库以便开发Java程序使用,sample文件夹包含开源代码程序实例,src压缩文件中包含类库开源代码。
设置环境变量
JDK中的工具都是命令行工具,需要从命令行即MS-DOS提示符下运行它们。以Windows XP为例说明设置过程。
右击桌面“我的电脑”图标,选择“属性”菜单
在“高级”选项卡中单击“环境变量”按钮,将出现“环境变量”设置界面
在“系统变量”框中点击“新建”按钮,在出现的“编辑系统变量”对话框中,在“变量名”栏的文本框内输入“JavaHome”,在变量值栏的文本框内输入“d:\\java\\jdk1.6”(即jdk安装的主目录)
在“系统变量”框中选择“path”,然后单击“编辑”按钮,在出现的“编辑系统变量”对话框中,在“变量值”栏的命令后添加“;%JavaHome%\\bin”。
在“系统变量”框中,单击“新建”按钮,在出现的“新建系统变量”的对话框中,在“变量名”栏中输入“classpath”,在变量值栏输入“.;%JavaHome%\\lib”。其中“.”表示当前目录。
设置完成后,单击“开始”->“所有程序”->“附件”->“命令提示符”打开DOS窗口,在命令行提示符输入“java”或“javac”回车后,如果出现其用法参数提示信息,则安装正确。 2.安装Eclipse,并熟悉如何使用。
将下载的ZIP包解压缩到D盘,双击D:\\eclipse\\eclipse.exe来启动Eclipse。第一次启动时会弹出一个选择工作空间的对话框,输入“D:\\workspace”,单击“OK”,开始运行Eclipse。 3. 一个简单的应用程序
实验要求:
编写一个简单的Java应用程序,该程序在命令行窗口输出两行文字:“你好,很高兴学习Java”和“We are students”。 程序模板:
Hello.java
public class Hello {
public static void main (String args[ ]) {
【代码1】 //命令行窗口输出\"你好,很高兴学习Java\" A a=new A(); a.fA(); } }
class A {
void fA() {
【代码2】 //命令行窗口输出\"We are students\" } }
实验后的练习: 1. 编译器怎样提示丢失大括号的错误? 2. 编译器怎样提示语句丢失分号的错误? 3. 编译器怎样提示将System写成system这一错误? 4. 编译器怎样提示将String写成string这一错误?
4.联合编译
实验要求:
编写4个源文件:MainClass.java、A.java、B.java和C.java,每个源文件只有一个类,MainClass.java是一个应用程序(含有main方法),使用了A、B和C类。将4个源文件保存到同一目录中,例如:C:\\100,然后编译MainClass.java。 程序模板:
模板1:MainClass.java
public class MainClass {
public static void main (String args[ ]) {
【代码1】 //命令行窗口输出\"你好,只需编译我\" A a=new A(); a.fA();
B b=new B(); b.fB(); } } 模板2 :A.java
public class A {
void fA() {
【代码2】 //命令行窗口输出\"I am A\"
} } 模板3 :B.java
public class B {
void fB() {
【代码3】 //命令行窗口输出\"I am B\" } } 模板4 :C.java
public class C {
void fC() {
【代码4】 //命令行窗口输出\"I am C\" } }
实验后的练习: 1. 将Hello.java编译通过后,修改A.java源文件中的代码,在命令行窗口输出“我是A类”。要求每次修改A.java源文件后,单独编译A.java,然后直接运行应用程序MainClass。
5.输出希腊字母表。
实验要求:
编写一个Java应用程序,该程序在命令行窗口输出希腊字母表。 程序模板:
GreekAlphabet.java
public class GreekAlphabet {
public static void main (String args[ ]) {
int startPosition=0,endPosition=0; char cStart='α',cEnd='ω';
【代码1】 //cStart做int型转换据运算,并将结果赋值给startPosition 【代码2】 //cEnd做int型转换运算,并将结果赋值给endPosition System.out.println(\"希腊字母\\'α\\'在unicode表中的顺序位置:\"+(int)cStart); System.out.println(\"希腊字母表:\"); for(int i=startPosition;i<=endPosition;i++) {
char c='\\0';
【代码3】 //i做char型转换运算,并将结果赋值给c System.out.print(\" \"+c);
if((i-startPosition+1)%10==0)
System.out.println(\"\");
} } }
实验后的练习:
1. 将一个double型数据直接赋值给float型变量,程序编译时提示怎样的错误? 2. 在应用程序的main方法中增加语句:
float x=0.618;
程序能编译通过么?
3. 在应用程序的main方法中增加语句:
byte y=128;
程序能编译通过么?
4. 在应用程序的main方法中增加语句:
int z=(byte)128;
程序输出变量z的值是多少?
6.猜数字游戏。
实验要求:
编写一个Java应用程序,实现下列功能:
1) 程序随机分配给客户一个1—100之间的整数; 2) 用户在输入对话框中输入自己的猜测;
3) 程序返回提示信息,提示信息分别是:“猜大了”、“猜小了”和“猜对了”; 4) 用户可根据提示信息再次输入猜测,直到提示信息是“猜对了”。 程序模板:
GuessNumber.java
import javax.swing.JOptionPane; public class GuessNumber {
public static void main (String args[ ]) {
System.out.println(\"给你一个1至100之间的整数,请猜测这个数\"); int realNumber=(int)(Math.random()*100)+1; int yourGuess=0;
String str=JOptionPane.showInputDialog(\"输入您的猜测:\"); yourGuess=Integer.parseInt(str); while(【代码1】) //循环条件 {
if(【代码2】) //条件代码 {
str=JOptionPane.showInputDialog(\"猜大了,再输入你的猜测:\"); yourGuess=Integer.parseInt(str); }
else if(【代码3】) //条件代码 {
str=JOptionPane.showInputDialog(\"猜小了,再输入你的猜测:\"); yourGuess=Integer.parseInt(str); } }
System.out.println(\"猜对了!\"); } }
实验后的练习:
1. 用“yourGuess>realNumber”替换【代码1】,可以么?
2. 语句:“System.out.println(“猜对了!”);”为何要放在while循环语句之后?放在while
语句的循环体中合理吗?
【结果】
将本次上机实验结果按照以上内容依次填写实验目标、过程、结果。
【注意事项】
实验报告要求每人提交一份,使用专门的报告纸,内容写全,包括实验名称、班级、姓名、试验日期。
7.编写一个java程序,用穷举法找出2-50之间的素数。 8.编写一个java程序,计算1!+2!+…+10!。
实验二 类与对象
一、实验目的及要求
1. 使用类来封装对象的属性和功能;
2. 掌握类变量与实例变量,以及类方法与实例方法的区别; 3. 掌握使用package和import语句;
4. 巩固以下概念:子类的继承性,子类对象的创建过程,成员变量的继承与隐藏,方法的继承与重写。 二、实验学时
4学时 三、实验任务
1.三角形、梯形和圆形的类封装
实验要求:
编写一个Java应用程序,该程序中有3个类:Trangle、Leder和Circle,分别用来刻画“三角形”、“梯形”和“圆形”。具体要求如下:
a) Trangle类具有类型为double的三个边,以及周长、面积属性,Trangle类具有返回周长、面积以及修改三个边的功能。另外,Trangle类还具有一个boolean型的属性,该属性用来判断三个属能否构成一个三角形。
b) Lader类具有类型double的上底、下底、高、面积属性,具有返回面积的功能。
c) Circle类具有类型为double的半径、周长和面积属性,具有返回周长、面积的功能。
程序模板:
AreaAndLength.java
class Trangle {
double sideA,sideB,sideC,area,length; boolean boo;
public Trangle(double a,double b,double c) {
【代码1】 //参数a,b,c分别赋值给sideA,sideB,sideC if(【代码2】) //a,b,c构成三角形的条件表达式
{
【代码3】 //给boo赋值。 } else {
【代码4】 //给boo赋值。 } }
double getLength() {
【代码5】 //方法体,要求计算出length的值并返回 }
public double getArea() {
if(boo) {
double p=(sideA+sideB+sideC)/2.0;
area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC)) ; return area; } else {
System.out.println(\"不是一个三角形,不能计算面积\"); return 0; } }
public void setABC(double a,double b,double c) {
【代码6】 //参数a,b,c分别赋值给sideA,sideB,sideC if(【代码7】) //a,b,c构成三角形的条件表达式 {
【代码8】 //给boo赋值。 } else {
【代码9】 //给boo赋值。 } } }
class Lader {
double above,bottom,height,area; Lader(double a,double b,double h) {
【代码10】 //方法体,将参数a,b,c分别赋值给above,bottom,height }
double getArea() {
【代码11】 //方法体,,要求计算出area返回 } }
class Circle {
double radius,area; Circle(double r) {
【代码12】 //方法体 }
double getArea() {
【代码13】 //方法体,要求计算出area返回 }
double getLength() {
【代码14】 //getArea方法体的代码,要求计算出length返回 }
void setRadius(double newRadius) {
radius=newRadius; }
double getRadius() {
return radius; } }
public class AreaAndLength {
public static void main(String args[]) {
double length,area; Circle circle=null; Trangle trangle; Lader lader;
【代码15】 //创建对象circle 【代码16】 //创建对象trangle。 【代码17】 //创建对象lader
【代码18】 // circle调用方法返回周长并赋值给length System.out.println(\"圆的周长:\"+length);
【代码19】 // circle调用方法返回面积并赋值给area System.out.println(\"圆的面积:\"+area);
【代码20】 // trangle调用方法返回周长并赋值给length
System.out.println(\"三角形的周长:\"+length);
【代码21】 // trangle调用方法返回面积并赋值给area System.out.println(\"三角形的面积:\"+area);
【代码22】 // lader调用方法返回面积并赋值给area System.out.println(\"梯形的面积:\"+area);
【代码23】 // trangle调用方法设置三个边,要求将三个边修改为12,34,1。 【代码24】 // trangle调用方法返回面积并赋值给area System.out.println(\"三角形的面积:\"+area);
【代码25】 // trangle调用方法返回周长并赋值给length System.out.println(\"三角形的周长:\"+length); } }
实验后的练习:
1. 程序中仅仅省略【代码15】,编译能通过吗? 2. 程序中仅仅省略【代码16】,编译能通过吗?
3. 程序中仅仅省略【代码15】,运行时出现怎样的异常提示?
4. 给Trangle类增加3个方法,分别用来返回3个边:sideA、sideB和sideC。 5. 让AreaAndLength类中的circle对象调用方法修改半径,然后输出修改后的半径以及修改半径后的圆的面积和周长。
2.实例成员与类成员。
实验要求:
按程序模板的要求编写源文件,要特别注意程序的输出结果,并能正确解释输出的结果。 程序模板:
Example.java
class A {
【代码1】 //声明一个float型实例变量a
【代码2】 //声明一个float型类变量b,即static变量b void setA(float a) {
【代码3】 //将参数a的值赋值给成员变量a }
void setB(float b) {
【代码4】 //将参数b的值赋值给成员变量b }
float getA() {
return a; }
float getB() {
return b; }
void inputA() {
System.out.println(a); }
static void inputB() {
System.out.println(b); } }
public class Example {
public static void main(String args[]) {
【代码5】 //通过类名操作类变量b,并赋值100 【代码6】 //通过类名调用方法inputB() A cat=new A(); A dog=new A();
【代码7】 //cat象调用方法setA(int a)将cat的成员a的值设置为200 【代码8】 //cat调用方法setB(int b)将cat的成员b的值设置为400 【代码9】 //dog象调用方法setA(int a)将dog的成员a的值设置为150 【代码10】 //dog调用方法setB(int b)将dog的成员b的值设置为300 【代码11】 //cat调用inputA()。 【代码12】 //cat调用inputB()。 【代码13】 //dog调用inputA()。 【代码14】 //dog调用inputB()。 } }
实验后的练习:
1. 将inputA()方法中的
System.out.println(a); 改写为
System.out.println(a+b); 编译是否出错?为什么? 2. 将inputB()方法中的
System.out.println(b); 改写为
System.out.println(a+b); 编译是否报错?为什么?
3.使用package语句与import语句。
实验要求:
创建一个java包,名为“chan”;定义一个学生类student1,分别定义num,name,sex三个属性,访问修饰符分别是private、无修饰符和public修饰符。在主类student中创建学生类的对象,并且分别设置学号,姓名和性别的初始值,在主类中调用对象。用import语句导入学生包fxj_stu,分别定义num,name,sex三个属性,访问修饰符分别是private、无修饰符和public修饰符,然后在主类中创建对象,修改其属性值,看能否成功,如果不能,改变其访问修饰符,然后再观察结果。
程序运行效果示例:
程序运行效果如下图所示:
程序模板: student.java package chan; import fxj.fxj_stu; class student1{ public int num;
String name; public String sex;
}
public class student {
public static void main(String[] args) {
student1 new_student=new student1(); new_student.num=14; new_student.name=\"chan\";
new_student.sex=\"男\";
fxj_stu xiaming=new fxj_stu(); xiaming.num=19;
xiaming.name=\"夏明\"; xiaming.sex=\"男\";
System.out.println(\"输出我的基本信息:\");
System.out.println(\"号码:\"+new_student.num); System.out.println(\"姓名:\"+new_student.name); System.out.println(\"性别:\"+new_student.sex); System.out.println(\"输出夏明的基本信息:\"); System.out.println(\"号码:\"+xiaming.num); System.out.println(\"姓名:\"+xiaming.name);
System.out.println(\"性别:\"+xiaming.sex); } }
fxj_stu.java package fxj;
public class fxj_stu { public static int num=17; public static String name=\"付小姐\"; public static String sex=\"女\";
public static void main(String[] args) { System.out.println(\"输出付小姐的基本信息:\"); fxj_stu fuxiaojun=new fxj_stu(); }
System.out.println(\"号码:\"+fuxiaojun.num); System.out.println(\"姓名:\"+fuxiaojun.name); System.out.println(\"性别:\"+fuxiaojun.sex); }
实验后的练习:
1. 将访问修饰符权限全改为public,可以在不同包中访问吗?可以不同类中被访问吗?
2. 将student1中的num的权限改为private,能否通过编译?为什么?
3. 将fxj包中的num和name改为private和default,能否通过编译?为什么?
【结果】
将本次上机实验结果按照实验要求内容依次进行,填写实验目标、过程、结果。 【注意事项】
实验报告要求每人提交一份,使用专门的报告纸,内容写全,包括实验名称、班级、姓名、试验日期。
实验三 字符串、时间与数字类
一、实验目的及要求
1. 掌握String类的常用方法
2. 掌握Date类以及Calendar类的常用方法; 3. 掌握BigInteger类的常用方法。 二、实验学时
4学时 三、实验任务
1.String类的常用方法。
实验要求:
编写一个Java应用程序,判断两个字符串是否相同,判断字符串的前缀、后缀是否和某个字符串相同,按字典顺序比较两个字符串的大小关系,检索字符串,创建字符串,将数字型字符串转换为数字,将字符串存放到数组中,用字符数组创建字符串。 程序模板:
StringExample.java
class StringExample
{ public static void main(String args[])
{ String s1=new String(\"you are a student\"), s2=new String(\"how are you\");
if(【代码1】) // 使用equals方法判断s1与s2是否相同 {
System.out.println(\"s1与s2相同\"); } else {
System.out.println(\"s1与s2不相同\"); }
String s3=new String(\"22030219851022024\");
if(【代码2】) //判断s3的前缀是否是“220302”。 {
System.out.println(\"吉林省的身份证\"); }
String s4=new String(\"你\"), s5=new String(\"我\");
if(【代码3】)//按着字典序s4大于s5的表达式。 {
System.out.println(\"按字典序s4大于s5\"); } else {
System.out.println(\"按字典序s4小于s5\"); }
int position=0;
String path=\"c:\\\\java\\\\jsp\\\\A.java\";
position=【代码5】 //获取path中最后出现目录分隔符号的位置
System.out.println(\"c:\\\\java\\\\jsp\\\\A.java中最后出现\\\\的位置:\"+position); String fileName=【代码6】//获取path中“A.java”子字符串。
System.out.println(\"c:\\\\java\\\\jsp\\\\A.java中含有的文件名:\"+fileName); String s6=new String(\"100\"),
s7=new String(\"123.678\");
int n1=【代码7】 //将s6转化成int型数据。 double n2=【代码8】 //将s7转化成double型数据。 double m=n1+n2; System.out.println(m);
String s8=【代码9】 //String调用valuOf(int n)方法将m转化为字符串对象 position=s8.indexOf(\".\");
String temp=s8.substring(position+1);
System.out.println(\"数字\"+m+\"有\"+temp.length()+\"位小数\") ; String s9=new String(\"ABCDEF\");
char a[]=【代码10】 //将s8存放到数组a中。 for(int i=a.length-1;i>=0;i--) {
System.out.print(\" \"+a[i]); } } }
实验后的练习: 1. 程序中的s6改写成
String s6=new String(“1a12b”); 运行时提示怎样的错误?
2. 请用数组a的前3个单元创建一个字符串并输出该串。 3. 请给出获取path中“jsp”子字符串的代码。
4. 在程序的适当位置增加如下代码,注意输出的结果。
String str1=new String(“ABCABC”), str2=null, str3=null, str4=null;
str2=str1.replaceAll(“A”,”First”); str3=str2.replaceAll(“B”,”Second”); str4=str3.replaceAll(“C”,”Third”); System.out.println(str1); System.out.println(str2);
System.out.println(str3); System.out.println(str4);
5. 可以使用Long类中的下列static方法得到整数各种进制的字符串表示: Public static String toBinaryString(long i) Public static String toOctalString(long i)
Public static String toHexString(long i) Public static String toString(long i,int p)
其中的toString(long i, int p)返回整数i的p进制表示。请在适当位置添加代码输出12345的二进制、八进制和十六进制表示。
6. 在适当位置添加代码,分别输出数字m的整数部分和小数部分。
2.比较日期的大小。
实验要求:
编写一个Java应用程序,用户从输入对话框输入了两个日期,程序将判断两个日期的大小关系,以及两个日期之间的间隔天数。 程序模板:
DateExample.java
import java.util.*;
import javax.swing.JOptionPane; public class DateExample {
public static void main(String args[ ]) {
String str=JOptionPane.showInputDialog(\"输入第一个日期的年份:\"); int yearOne=Integer.parseInt(str);
str=JOptionPane.showInputDialog(\"输入该年的月份:\"); int monthOne=Integer.parseInt(str);
str=JOptionPane.showInputDialog(\"输入该月份的日期:\"); int dayOne=Integer.parseInt(str);
str=JOptionPane.showInputDialog(\"输入第二个日期的年份:\"); int yearTwo=Integer.parseInt(str);
str=JOptionPane.showInputDialog(\"输入该年的月份:\"); int monthTwo=Integer.parseInt(str);
str=JOptionPane.showInputDialog(\"输入该月份的日期:\"); int dayTwo=Integer.parseInt(str);
Calendar calendar=【代码1】 //初始化日历对象
【代码2】 //将calendar的时间设置为yearOne年monthOne月dayOne日
long timeOne=【代码3】 //calendar表示的时间转换成毫秒
【代码4】 //将calendar的时间设置为yearTwo年monthTwo月dayTwo日
long timeTwo=【代码5】 //calendar表示的时间转换成毫秒。 Date date1=【代码6】 // 用timeOne做参数构造date1 Date date2=【代码7】 // 用timeTwo做参数构造date2 if(date2.equals(date1)) {
System.out.println(\"两个日期的年、月、日完全相同\"); }
else if(date2.after(date1)) {
System.out.println(\"您输入的第二个日期大于第一个日期\"); }
else if(date2.before(date1)) {
System.out.println(\"您输入的第二个日期小于第一个日期\"); }
long days=【代码8】//计算两个日期相隔天数
System.out.println(yearOne+\"年\"+monthOne+\"月\"+dayOne+\"日和\"
+yearTwo+\"年\"+monthTwo+\"月\"+dayTwo+\"相隔\"+days+\"天\"); } }
实验后的练习:
1. Calendar对象可以将时间设置到年、月、日、时、分、秒。请改进上面的程序,使用户输入的两个日期包括时、分、秒。
3.处理大整数。
实验要求:
编写一个Java应用程序,计算两个大整数的和、差、积和商,并计算一个大整数的因子个数(因子中不包括1和大整数本身)。 程序模板:
BigIntegerExample.java
import java.math.*; class BigIntegerExample {
public static void main(String args[])
{ BigInteger n1=new BigInteger(\"987654321987654321987654321\"), n2=new BigInteger(\"123456712345671234567\"), result=null;
result=【代码1】//n1和n2做加法运算
System.out.println(\"和:\"+result.toString()); result=【代码2】//n1和n2做减法运算
System.out.println(\"差:\"+result.toString()); result=【代码3】//n1和n2做乘法运算
System.out.println(\"积:\"+result.toString()); result=【代码4】//n1和n2做除法运算
System.out.println(\"商:\"+result.toString()); BigInteger m=new BigInteger(\"19657\"), COUNT=new BigInteger(\"0\"), ONE=new BigInteger(\"1\"), TWO=new BigInteger(\"2\");
System.out.println(m.toString()+\"的因子有:\");
for(BigInteger i=TWO;i.compareTo(m)<0;i=i.add(ONE)) { if((n1.remainder(i).compareTo(BigInteger.ZERO))==0) { COUNT=COUNT.add(ONE);
System.out.print(\" \"+i.toString()); } }
System.out.println(\"\");
System.out.println(m.toString()+\"一共有\"+COUNT.toString()+\"个因子\"); } }
【结果】
将本次上机实验结果按照实验要求内容依次进行,填写实验目标、过程、结果。 【注意事项】
实验报告要求每人提交一份,使用专门的报告纸,内容写全,包括实验名称、班级、姓名、实验日期。
实验四 用户图形界面GUI
一、实验目的及要求
1. 学习处理ActionEvent事件;
2. 学习处理ItemEvent事件和paint方法; 3. 学习使用布局类。 二、实验学时
4学时 三、实验任务
1.算术测试。
实验要求:
编写一个算书测试小软件,用来训练小学生的算术能力。程序由3个类组成,其中Teacher类对象负责给出算术题目,并判断回答者的答案是否正确;ComputerFrame类对象负责为算术题目提供视图,比如用户可以通过ComputerFrame类对象提供的GUI界面看到题目,并通过该GUI界面给出题目的答案;MainClass是软件的主类。 程序模板:
Teacher.java
public class Teacher
{ int numberOne,numberTwo; String operator=\"\"; boolean right;
public int giveNumberOne(int n)
{ numberOne=(int)(Math.random()*n)+1; return numberOne; }
public int giveNumberTwo(int n)
{ numberTwo=(int)(Math.random()*n)+1; return numberTwo; }
public String giveOperator()
{ double d=Math.random(); if(d>=0.5)
operator=\"+\"; else
operator=\"-\"; return operator; }
public boolean getRight(int answer) { if(operator.equals(\"+\"))
{ if(answer==numberOne+numberTwo) right=true; else
right=false; }
else if(operator.equals(\"-\"))
{ if(answer==numberOne-numberTwo) right=true; else
right=false; }
return right; } }
ComputerFrame.java
import java.awt.*;
import java.awt.event.*;
public class ComputerFrame extends Frame implements ActionListener { TextField textOne,textTwo,textResult; Button getProblem,giveAnwser; Label operatorLabel,message; Teacher teacher;
ComputerFrame(String s) { super(s);
teacher=new Teacher();
setLayout(new FlowLayout());
textOne=【代码1】 //创建textOne,其可见字符长是10 textTwo=【代码2】 //创建textTwo,其可见字符长是10 textResult=【代码3】 //创建textResult,其可见字符长是10 operatorLabel=new Label(\"+\");
message=new Label(\"你还没有回答呢\"); getProblem=new Button(\"获取题目\"); giveAnwser=new Button(\"确认答案\"); add(getProblem); add(textOne);
add(operatorLabel);
add(textTwo);
add(new Label(\"=\")); add(textResult); add(giveAnwser); add(message);
textResult.requestFocus(); textOne.setEditable(false); textTwo.setEditable(false);
【代码4】//将当前窗口注册为getProblem的ActionEvent事件监视器 【代码5】//将当前窗口注册为giveAnwser的ActionEvent事件监视器 【代码6】//将当前窗口注册为textResult的ActionEvent事件监视器 setBounds(100,100,450,100); setVisible(true); validate();
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e) { System.exit(0); } } ); }
public void actionPerformed(ActionEvent e) { if(【代码7】) //判断事件源是否是getProblem { int number1=teacher.giveNumberOne(100); int number2=teacher.giveNumberTwo(100); String operator=teacher.giveOperator(); textOne.setText(\"\"+number1); textTwo.setText(\"\"+number2); operatorLabel.setText(operator); message.setText(\"请回答\");
textResult.setText(null);
}
if(【代码8】) //判断事件源是否是giveAnwser { String answer=textResult.getText(); try{
int result=Integer.parseInt(answer); if(teacher.getRight(result)==true) { message.setText(\"你回答正确\"); } else
{ message.setText(\"你回答错误\"); } }
catch(NumberFormatException ex)
{ message.setText(\"请输入数字字符\"); }
}
textResult.requestFocus(); validate(); } } MainClass.java
public class MainClass
{ public static void main(String args[]) { ComputerFrame frame;
frame=【代码9】//创建窗口,其标题为:算术测试 } }
2.信号灯。
实验要求:
编写一个带有窗口的应用程序。在窗口的北面添加一个下拉列表,该下拉列表有“红”、“黄”和“绿”三个选项。在窗口的中心添加一个画布,当用户在下拉列表选择某项后,画布上绘制相应的信号灯。 程序模板:
SignalCanvas.java
import java.awt.*;
public class SignalCanvas extends Canvas { int red,green,yellow,x,y,r; SignalCanvas()
{ setBackground(Color.white); }
public void setRed(int r) { red=r; }
public void setGreen(int g) { green=g; }
public void setYellow(int y) { yellow=y; }
public void setPosition(int x,int y) { this.x=x; this.y=y; }
public void setRadius(int r) { this.r=r; }
public void paint(Graphics g) { if(red==1)
{ g.setColor(Color.red); }
else if(green==1)
{ g.setColor(Color.green); }
else if(yellow==1)
{ g.setColor(Color.yellow); }
g.fillOval(x,y,2*r,2*r); } }
SignalFrame.java
import java.awt.*; import java.applet.*; import java.awt.event.*;
public class SignalFrame extends Frame implements ItemListener { Choice choice;
SignalCanvas signal=null;
String itemRed=\"红灯\黄灯\绿灯\"; public SignalFrame()
{ signal= new SignalCanvas();
add(signal,BorderLayout.CENTER);
choice=【代码1】 //创建choice
【代码2】 //创建choice添加itemRed 【代码3】 //创建choice添加itemYellow 【代码4】 //创建choice添加itemGreen 【代码5】 //将当前窗口注册为choice的ItemEvent事件监视器 add(choice,BorderLayout.NORTH); setBounds(100,100,360,300); setVisible(true); validate();
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e) { System.exit(0); } } ); }
public void itemStateChanged(ItemEvent e)
{ String item= 【代码6】 // choice返回被选中的条目 int w=signal.getBounds().width; int h=signal.getBounds().height; int m=Math.min(w,h); signal.setRadius(m/6); if(item.equals(itemRed)) { if(signal!=null) { signal.setRed(1);
signal.setYellow(0); signal.setGreen(0);
signal.setPosition(w/3,0); signal.repaint(); } }
else if(item.equals(itemYellow)) { if(signal!=null) { signal.setRed(0); signal.setYellow(1); signal.setGreen(0);
signal.setPosition(w/3,h/3); signal.repaint(); } }
else if(item.equals(itemGreen)) { if(signal!=null) { signal.setRed(0); signal.setYellow(0); signal.setGreen(1);
signal.setPosition(w/3,2*h/3); signal.repaint(); } } } }
SignalMainClass.java
public class SignalMainClass
{ public static void main(String args[]) { SignalFrame frame;
frame=new SignalFrame() ; frame.setTitle(\"信号灯\"); } }
3.布局与日历。
实验要求:
编写一个应用程序,有一个窗口,该窗口为BorderLayout布局。窗口的中心添加一个Panel容器:pCenter,pCenter的布局是7行7列的GridLayout布局,pCenter中放置7个按钮和42个标签,用来显示日历。窗口的北面添加一个Panel容器pNorth,其布局是FlowLayout布局,pNorth放置两个按钮:nextMonth和previousMonth,单击nextMonth按钮,可以显示当前月的下一月的日历;单击previousMonth按钮,可以显示当前月的上一月的日历。窗口的南面添加一个Panel容器pSouth,其布局是FlowLayout布局,pSouth中放置一个标签用来显示一些信息。 程序模板:
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; }
if(month==4||month==6||month==9||month==11) { day=30; }
if(month==2)
{ if(((year%4==0)&&(year%100!=0))||(year%400==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 java.applet.*;
public class CalendarFrame extends Frame implements ActionListener { Label labelDay[]=new Label[42]; Button titleName[]=new Button[7];
String name[]={\"日\一\二\三\四\五\六\ Button nextMonth,previousMonth; int year=2006,month=10; CalendarBean calendar;
Label showMessage=new Label(\"\ public CalendarFrame()
{ Panel pCenter=new Panel();
【代码1】 //将pCenter的布局设置为7行7列的GridLayout 布局。 for(int i=0;i<7;i++)
{ titleName[i]=new Button(name[i]);
【代码2】//pCenter添加组件titleName[i]。 }
for(int i=0;i<42;i++) {
labelDay[i]=new Label(\"\ 【代码3】//pCenter添加组件labelDay[i]。 }
calendar=new CalendarBean(); calendar.setYear(year); calendar.setMonth(month);
String day[]=calendar.getCalendar(); for(int i=0;i<42;i++)
{ labelDay[i].setText(day[i]); }
nextMonth=new Button(\"下月\"); previousMonth=new Button(\"上月\"); nextMonth.addActionListener(this); previousMonth.addActionListener(this); Panel pNorth=new Panel(), pSouth=new Panel(); pNorth.add(previousMonth); pNorth.add(nextMonth); pSouth.add(showMessage);
showMessage.setText(\"日历:\"+calendar.getYear()+\"年\"+ calendar.getMonth()+\"月\" );
ScrollPane scrollPane=new ScrollPane(); scrollPane.add(pCenter);
【代码4】// 窗口添加scrollPane在中心区域 【代码5】// 窗口添加pNorth 在北面区域 【代码6】// 窗口添加pSouth 在南区域。 }
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(\"日历:\"+calendar.getYear()+\"年\"+calendar.getMonth()+\"月\" ); } }
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.validate();
frame.addWindowListener(new java.awt.event.WindowAdapter( ) { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } } ); } }
【结果】
将本次上机实验结果按照实验要求内容依次进行,填写实验目标、过程、结果。 【注意事项】
实验报告要求每人提交一份,使用专门的报告纸,内容写全,包括实验名称、班级、姓名、试验日期。
实验五 多线程
一、实验目的及要求
1. 掌握使用Thread的子类创建线程; 2. 学习使用Thread类创建线程; 3. 学习处理线程同步问题。 二、实验学时
2学时 三、实验任务
1.汉字打字练习。
实验要求:
编写一个Java应用程序,在主线程中再创建一个Frame类型的窗口,在该窗口中再创建1个线程giveWord。线程giveWord每隔2秒钟给出一个汉字,用户使用一种汉字输入法将该汉字输入到文本框中。 程序模板:
WordThread.java
import java.awt.*;
public class WordThread extends Thread { char word; int k=19968; Label com;
WordThread(Label com) { this.com=com; }
public void run() { k=19968; while(true) {
word=(char)k; com.setText(\"\"+word);
try{ 【代码1】//调用sleep方法使得线程中断6000豪秒 }
catch(InterruptedException e){} k++;
if(k>=29968) k=19968; } } }
ThreadFrame.java
import java.awt.*; import java.awt.event.*;
public class ThreadFrame extends Frame implements ActionListener {
Label wordLabel; Button button;
TextField inputText,scoreText;
【代码2】//用WordThread声明一个giveWord对象 int score=0; ThreadFrame()
{ wordLabel=new Label(\" \ wordLabel.setFont(new Font(\"\ button=new Button(\"开始\"); inputText=new TextField(3); scoreText=new TextField(5); scoreText.setEditable(false);
【代码3】//创建giveWord,将wordLabel传递给WordThread构造方法的参数 button.addActionListener(this); inputText.addActionListener(this); add(button,BorderLayout.NORTH); add(wordLabel,BorderLayout.CENTER); Panel southP=new Panel();
southP.add(new Label(\"输入标签所显示的汉字后回车:\")); southP.add(inputText); southP.add(scoreText);
add(southP,BorderLayout.SOUTH); setBounds(100,100,350,180); setVisible(true); validate();
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e) { System.exit(0); } } ); }
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button)
{ if(!(【代码4】)) //giveWord调用方法isAlive() { giveWord=new WordThread(wordLabel); } try
{ 【代码5】//giveWord调用方法start() }
catch(Exception exe){} }
else if(e.getSource()==inputText)
{ if(inputText.getText().equals(wordLabel.getText())) { score++; }
scoreText.setText(\"得分:\"+score);
inputText.setText(null); } } }
WordThread.java
public class ThreadWordMainClass
{ public static void main(String args[]) { new ThreadFrame(); }
实验后的练习:
1. 在WordThread类中增加int型的成员time,其初值为6000,将其中的【代码1】更改为线程中断time毫秒。在WordThread类增加public void setTime(int n)方法,使得WordThread线程对象可以调用该方法修改time的值。
2.旋转的行星。
实验要求:
编写一个应用程序,模拟月亮围绕地球旋转、地球围绕太阳旋转。 程序模板:
Mycanvas.java
import java.awt.*;
public class Mycanvas extends Canvas { int r; Color c;
public void setColor(Color c) { this.c=c; }
public void setR(int r) { this.r=r; }
public void paint(Graphics g) { g.setColor(c);
g.fillOval(0,0,2*r,2*r); }
public int getR() { return r; } }
Planet.java
import java.awt.*;
public class Planet extends Panel implements Runnable { 【代码1】 //用Thread类声明一个moon对象 Mycanvas yellowBall;
double pointX[]=new double[360],
pointY[]=new double[360]; //用来表示画布左上角端点坐标的数组 int w=100,h=100;
int radius=30; Planet()
{ setSize(w,h); setLayout(null);
yellowBall=new Mycanvas(); yellowBall.setColor(Color.yellow); add(yellowBall);
yellowBall.setSize(12,12); yellowBall.setR(12/2); pointX[0]=0; pointY[0]=-radius;
double angle=1*Math.PI/180; //刻度为1度
for(int i=0;i<359;i++) //计算出数组中各个元素的值
{ pointX[i+1]=pointX[i]*Math.cos(angle)-Math.sin(angle)*pointY[i]; pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle); }
for(int i=0;i<360;i++)
{ pointX[i]=pointX[i]+w/2; //坐标平移 pointY[i]=pointY[i]+h/2; }
yellowBall.setLocation((int)pointX[0]-yellowBall.getR(),
(int)pointY[0]-yellowBall.getR());
【代码2】 //创建 moon线程,当前面板做为该线程的目标对象 }
public void start() { try{ moon .start(); }
catch(Exception exe){} }
public void paint(Graphics g) { g.setColor(Color.blue); g.fillOval(w/2-9,h/2-9,18,18); }
public void run() { int i=0; while(true) { i=(i+1)%360;
yellowBall.setLocation((int)pointX[i]-yellowBall.getR(),
(int)pointY[i]-yellowBall.getR());
try{ 【代码3】 // Thread类调用类方法sleep使得线程中断10豪秒 }
catch(InterruptedException e){} } } }
HaveThreadFrame.java
import java.awt.*; import java.awt.event.*;
public class HaveThreadFrame extends Frame implements Runnable { 【代码4】 //用Thread类声明一个rotate对象 Planet earth;
double pointX[]=new double[360], pointY[]=new double[360]; int width,height; int radius=120; HaveThreadFrame()
{ rotate=new Thread(this); earth=new Planet(); setBounds(0,0,360,400); width=getBounds().width; height=getBounds().height; pointX[0]=0; pointY[0]=-radius;
double angle=1*Math.PI/180; for(int i=0;i<359;i++)
{ pointX[i+1]=pointX[i]*Math.cos(angle)-Math.sin(angle)*pointY[i]; pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle); }
for(int i=0;i<360;i++) { pointX[i]=pointX[i]+width/2; pointY[i]=pointY[i]+height/2; }
setLayout(null); setVisible(true); validate();
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e) { System.exit(0); } } ); add(earth);
earth.setLocation((int)pointX[0]-earth.getSize().width/2, (int)pointY[0]-earth.getSize().height/2); earth.start();
【代码5】 //用rotate调用start方法 }
public void run() { int i=0; while(true) { i=(i+1)%360;
earth.setLocation((int)pointX[i]-earth.getSize().width/2,
(int)pointY[i]-earth.getSize().height/2); try{ Thread.sleep(100); }
catch(InterruptedException e){} } }
public void paint(Graphics g) { g.setColor(Color.red);
g.fillOval(width/2-15,height/2-15,30,30); } }
HaveThreadFrame.java
public class ThreadRotateMainClass { public static void main(String args[]) { new HaveThreadFrame(); } }
实验后的练习:
1. 在Planet类中再增加一个Mycanvas对象greenBall和一个Thread对象Satellite,线程Satellite占有CPU资源期间可以让greenBall画布旋转。
3.双线程接力。
实验要求:
编写一个应用程序,除了主线程外,还有两个线程:first和second。first负责模拟一个红色的按钮从坐标(10,60)运动到(100,60);second负责模拟一个绿色的按钮从坐标(100,60)运动到(200,60)。 程序模板:
MoveButton.java
import java.awt.*; import java.awt.event.*;
public class MoveButton extends Frame implements Runnable,ActionListener { 【代码1】//用Thread类声明first,second两个线程对象 Button redButton,greenButton,startButton; int distance=10; MoveButton()
{ 【代码2】 //创建first线程,当前窗口做为该线程的目标对象 【代码3】 //创建first线程,当前窗口做为该线程的目标对象 redButton=new Button(); greenButton=new Button();
redButton.setBackground(Color.red); greenButton.setBackground(Color.green); startButton=new Button(\"start\"); startButton.addActionListener(this); setLayout(null); add(redButton);
redButton.setBounds(10,60,15,15);
add(greenButton);
greenButton.setBounds(100,60,15,15); add(startButton);
startButton.setBounds(10,100,30,30); setBounds(0,0,300,200); setVisible(true); validate();
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e) { System.exit(0); } } ); }
public void actionPerformed(ActionEvent e) { try{ first.start(); second.start(); }
catch(Exception exp){} }
public void run() { while(true)
{ if(【代码4】) //判断当前占有CPU资源的线程是否是first { moveComponent(redButton); try{ Thread.sleep(20); }
catch(Exception exp){} }
if(【代码5】) //判断当前占有CPU资源的线程是否是second { moveComponent(greenButton); try{ Thread.sleep(10); }
catch(Exception exp){} } } }
public synchronized void moveComponent(Component b) {
if(Thread.currentThread()==first)
{ while(distance>100&&distance<=200) try{ wait(); }
catch(Exception exp){} distance=distance+1; b.setLocation(distance,60); if(distance>=100)
{ b.setLocation(10,60); notifyAll(); } }
if(Thread.currentThread()==second)
{ while(distance>=10&&distance<100)
try{ wait(); }
catch(Exception exp){} distance=distance+1;
b.setLocation(distance,60); if(distance>200)
{ distance=10;
b.setLocation(100,60); notifyAll(); } } } }
MoveButtonMainClass.java
public class MoveButtonMainClass
{ public static void main(String args[])
{ new MoveButton(); }
实验后的练习:
1. 在MoveButton类中再增加一个蓝色的按钮和一个third线程,third线程负责将这个蓝色的按钮从(200,60)运动到(300,60)。
【结果】
将本次上机实验结果按照实验要求内容依次进行,填写实验目标、过程、结果。 【注意事项】
实验报告要求每人提交一份,使用专门的报告纸,内容写全,包括实验名称、班级、姓名、试验日期。
因篇幅问题不能全部显示,请点此查看更多更全内容