JAVA上机实验6
实验名称:
图形用户界面设计
实验目的:掌握使用布局管理器对组件进行管理.;
理解 Java
的事件处理机制,掌握为不同组件编写事件处理程序的方法;掌握编写独立运行的窗口界面的方法; Java Swing
组件的使用方法。
实验内容:
•
1、编写窗体应用程序,统计一个文本域输入文本的行数、单词数和字符数。可在图形界面中安排一个按钮、一个文本域和一个标签,点击按钮开始统计,在标签中显示结果。
•
2、编写窗体应用程序,安排一个文本框、一个按钮和一个标签,从文本框录入一个数字(0~9),点击按钮将其对应的英文单词(如:zero,one等)显示在标签中。
3、编写一个算术测试小软件,用来训练小学生的算术能力。程序由3个类组成,其中Teacher类对象负责给出算术题目,并判断回答者的答案是否正确:ComputerFrame类对象提供的GUI界面看到题目并通过该GUI界面给出题目的答案;MailClass是软件的主类。
程序模版
请按照模版要求,将【代码】替换为程序代码。
模板代码
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.givetOperator();
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】//创建窗口,其标题为:算术测试
}
}
4、编写一个带有窗口的应用程序。在窗口的北面添加一个下拉列表,该下拉列表有“红灯”、“绿灯”和“黄灯”三个选项。在窗口的中心添加一个画布,当用户在下拉列表选择某项后,画布上绘制相应的信号灯。
程序模版
请按照模版要求,将【代码】替换为程序代码。
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="红灯",itemYellow="黄灯",itemGreen="绿灯";
public SignalFrame()
{
choice=【代码1】
//创建choice
【代码2】
//创建choice添加itemRed
【代码3】
//创建choice添加itemYellow
【代码4】
//创建choice添加itemGreen
【代码5】 //将当前窗口注册为choice的ItemEvent事件监视器
add(choice,BorderLayout.NORTH);
try{ Class
cs=Class.forName("SignalCanvas");
signal=(SignalCanvas)cs.newInstance();
add(signal,BorderLayout.CENTER);
}
catch(Exception e)
{
add(new Label("您还没有编写SignalCanvas类"),BorderLayout.CENTER);
}
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("信号灯");
}
}
5、编写一个应用程序,有一个窗口,该窗口为BorderLayout布局。窗口的中心添加一个Panel容器:pCenter,拍Centerde布局是7行7列的GriderLayout布局,pCenter中放置49个标签,用来显示日历。窗口的北面添加一个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)&&(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 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("",Label.CENTER);
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("",Label.CENTER);
【代码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);
}
}
);
}
}
6、首先编写一个封装一元二次方程的类,然后再编写一个窗口。要求窗口使用三个文本框和一个文本区,为方程对象中的数据提供试图,其中三个文本框用来显示和更新方程对象的系数;文本区对象用来显示方程的根。窗口中有一个按钮,用户单击该按钮后,程序用文本框中的数据修改方程的系数,并将方程的根显示在文本区中。
程序模版
请按照模版要求,将【代码】替换为程序代码。
SquareEquation.java
public class SquareEquation
{
double a,b,c;
double root1,root2;
public void setA(double a)
{ this.a=a;
}
public void setB(double b)
{ this.b=b;
}
public void setC(double c)
{ this.c=c;
}
public double getRootOne() throws
NoRealRootException,NoSquareEquationException
{
if(a!=0)
{ double
disk=b*b-4*a*c;
if(disk>=0)
{ root1=(-b+Math.sqrt(disk))/(2*a);
}
else
{ throw
new NoRealRootException("没有实根");
}
}
else
{
throw new NoRealRootException("不是二次方程");
}
return root1;
}
public double getRootTwo() throws
NoRealRootException,NoSquareEquationException
{
if(a!=0)
{
double disk=b*b-4*a*c;
if(disk>=0)
{ root2=(-b-Math.sqrt(disk))/(2*a);
}
else
{ throw
new NoRealRootException("没有实根");
}
}
else
{
throw new NoRealRootException("不是二次方程");
}
return root2;
}
}
class NoRealRootException extends
Exception
{ String
message;
NoRealRootException(String s)
{
message=s;
}
public String getMessage()
{
return message;
}
}
class NoSquareEquationException extends
Exception
{ String
message;
NoSquareEquationException(String s)
{
message=s;
}
public String getMessage()
{
return message;
}
}
EquationFrame.java
import java.awt.*;
import java.awt.event.*;
public class EquationFrame extends Frame
implements ActionListener
{ SquareEquation
equation;
TextField textA,textB,textC;
TextArea showRoots;
Button controlButton;
public EquationFrame()
{
equation=new SquareEquation();
textA=new TextField(8);
textB=new TextField(8);
textC=new TextField(8);
showRoots=new TextArea();
controlButton=new Button("确定");
Panel pNorth=new Panel();
pNorth.add(new Label("二次项系数:"));
pNorth.add(textA);
pNorth.add(new Label("一次项系数:"));
pNorth.add(textB);
pNorth.add(new Label("常数项系数:"));
pNorth.add(textC);
pNorth.add(controlButton);
【代码1】
//当前窗口作为controlButton的ActionEvent事件的监视器
add(pNorth,BorderLayout.NORTH);
add(showRoots,BorderLayout.CENTER);
setBounds(100,100,630,160);
setVisible(true);
validate();
addWindowListener(new WindowAdapter()
{ public
void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
}
public void
actionPerformed(ActionEvent e)
{
try{
double a=Double.parseDouble(【代码2】);
//textA调用方法获取其中的文本
double b=Double.parseDouble(【代码3】);
//textB调用方法获取其中的文本
double c=Double.parseDouble(【代码4】); //
textC调用方法获取其中的文本
equation.setA(a);
equation.setB(b);
equation.setC(c);
textA.setText(""+a);
textB.setText(""+b);
textC.setText(""+c);
showRoots.append("\n 根:"+equation.getRootOne());
showRoots.append("
根:"+equation.getRootTwo());
}
catch(Exception ex)
{
showRoots.append("\n"+ex+"\n");
}
}
}
EquationMainClass.java
public class EquationMainClass
{ public static void main(String
args[])
{
EquationFrame frame=new EquationFrame();
}
}
加载中,请稍候......