实验一 设计以下应用程序的界面
一、实验目的
掌握图形用户界面中的容器和组件的基本设计方法
二、实验内容
1、设计一个用户注册页面
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class MyJFrame extends JFrame{
JLabel jl1,jl2,jl3,jl4,jl5,jl6,jl7;
JTextField jtf;//文本框
JPasswordField jpf1,jpf2;//密码
JTextArea jta;
JButton jb1,jb2;
JRadioButton jrb1,jrb2;
JCheckBox jcb1,jcb2,jcb3;
JComboBox<String> jc;
public MyJFrame() {
this.setTitle("注册");
setBounds(300,300,500,600);
//设置窗体为流式布局
//setLayout(new FlowLayout());
//设置窗体为网格布局
setLayout(new GridLayout(20,1));
//空布局
setLayout(null);
init();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
jb1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
String info="";
info="姓名:"+jtf.getText();
info+="\r\n"+"密码:"+jpf1.getText();
info+="\r\n"+"密码:"+jpf2.getText();
info+="\r\n"+"性别:";
if (jrb1.isSelected())
info+=jrb1.getText();
if (jrb2.isSelected())
info+=jrb2.getText();
info+="\r\n爱好:";
if(jcb1.isSelected())
info+=jcb1.getText();
if(jcb2.isSelected())
info+=jcb2.getText();
if(jcb3.isSelected())
info+=jcb3.getText();
info+="\r\n学历:"+jc.getSelectedItem();
info+="\r\n简历:"+jta.getText();
JOptionPane.showMessageDialog(null, info);
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// System.exit(0);
//获取事件源对象
JButton jb=(JButton)e.getSource();
jtf.setText(jb.getText());
}
});
}
//注册用的组件初始化
public void init() {
// TODO Auto-generated method stub
jl1=new JLabel("用户名:");
jl2=new JLabel("密码:");
jl7=new JLabel("再次密码:");
jl3=new JLabel("简历:");
jl4=new JLabel("性别:");
jtf=new JTextField(10);
jpf1=new JPasswordField(10);
jpf2=new JPasswordField(10);
jta=new JTextArea(4,20);
jb1=new JButton("注册");
jb2=new JButton("取消");
jl1.setBounds(100,30,180,30);
jtf.setBounds(200,30,180,30);
jl2.setBounds(100, 70, 180, 30);
jpf1.setBounds(200, 70, 180, 30);
jl7.setBounds(100, 110, 180, 30);
jpf2.setBounds(200, 110, 180, 30);
jl3.setBounds(100, 280, 100, 30);
jta.setBounds(100,280,400,200);
JScrollPane jsp=new JScrollPane(jta);
jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jsp.setBounds(170, 280, 240, 100);
jb1.setBounds(100, 400, 100, 30);
jb2.setBounds(220, 400, 100, 30);
jrb1=new JRadioButton("男");
jrb2=new JRadioButton("女");
jl4.setBounds(100, 150, 180, 30);
jrb1.setBounds(200,150, 100, 30);
jrb2.setBounds(300,150, 100, 30);
ButtonGroup bg=new ButtonGroup();
bg.add(jrb1);
bg.add(jrb2);
jl5=new JLabel("爱好:");
jcb1=new JCheckBox("游戏");
jcb2=new JCheckBox("篮球");
jcb3=new JCheckBox("旅游");
jl5.setBounds(100 , 240, 100, 30);
jcb1.setBounds(160 , 240, 100, 30);
jcb2.setBounds(260 , 240, 100, 30);
jcb3.setBounds(360 , 240, 100, 30);
jl6=new JLabel("学历:");
jc=new JComboBox<>();
jc.addItem("高中");
jc.addItem("大专");
jc.addItem("本科");
jc.addItem("研究生");
jl6.setBounds(100 , 200, 100, 30);
jc.setBounds(200 , 200, 100, 30);
add(jl1);
add(jtf);
add(jl2);
add(jpf1);
add(jl7);
add(jpf2);
add(jl3);
add(jsp);
add(jl4);
add(jrb1);
add(jrb2);
add(jl5);
add(jcb1);
add(jcb2);
add(jcb3);
add(jl6);
add(jc);
add(jb1);
add(jb2);
}
public static void main(String[] args) {
new MyJFrame();
}
}
2、设计一个用户登录页面
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Regulation extends JFrame{
JLabel jl1,jl2,jl3,jl4;
JTextField jtf;//文本框
JPasswordField jpf;//密码
JButton jb1,jb2;
public Regulation() {
this.setTitle("登录窗口");
setBounds(300,300,500,400);
//设置窗体为流式布局
setLayout(new GridLayout(20,1));
//空布局
setLayout(null);
init();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
jb1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
String info="";
info="姓名:"+jtf.getText();
info+="\r\n"+"密码:"+jpf.getText();
JOptionPane.showMessageDialog(null, info);
}
});
jb2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// System.exit(0);
//获取事件源对象
JButton jb=(JButton)e.getSource();
jtf.setText(jb.getText());
}
});
}
public void init() {
jl1=new JLabel("企业人事管理系统");
jl2=new JLabel("用户名:");
jl3=new JLabel("密码:");
jtf=new JTextField(10);
jpf=new JPasswordField(10);
jb1=new JButton("注册");
jb2=new JButton("取消");
jl1.setBounds(150,30,200,60);
jl2.setBounds(100, 120, 180, 30);
jtf.setBounds(200, 120, 180, 30);
jl3.setBounds(100, 180, 180, 30);
jpf.setBounds(200, 180, 180, 30);
jb1.setBounds(100, 260, 100, 30);
jb2.setBounds(220, 260, 100, 30);
Font font = new Font("楷体",Font.PLAIN,25);
jl1.setFont(font);
jl1.setForeground(Color.red);
add(jl1);
add(jl2);
add(jtf);
add(jl3);
add(jpf);
add(jb1);
add(jb2);
}
public static void main(String[] args) {
new Regulation();
}
}
3、设计一个计算器的页面
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class CalcJFrame extends JFrame{
JButton[] jbs;
JButton jb2;
JTextField jtf;
String[] cons={"1","2","3","+","4","5","6","-","7","8","9","*","0",".","/","="};
JPanel jp1;
String op1="",ops="";
double num1,num2;
//flag=0,表示连续输入操作数,flag=1表示新的操作数开始
int flag=0;
public CalcJFrame() {
setTitle("计算器");
setBounds(400,300,400,500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
init();
setVisible(true);
for(int i=0;i<16;i++){
jbs[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton jb=(JButton)e.getSource();
//获取用户单击的按钮上面的文本
char ch=jb.getText().charAt(0);
//判断单击的按钮属于哪个类型
if (ch>='0' && ch<='9'|| ch=='.'){
//如果是数字
if (flag==1) {
//如果之前进行了计算,文本框中是计算结果,准备接收下一个操作数,op1清空,
op1="";
//准备接收下一个操作数的连续输入
flag=0;
}
//数字连接,并显示在文本框
op1=op1+ch;
jtf.setText(op1);
}else if (ch=='='){//表示要对两个操作数进行运算
//记录刚才单击的是等号
flag=1;
//获取第二个操作数
num2=Double.parseDouble(op1);
//根据运算符进行计算
switch(ops){
case "+": num1=num1+num2;break;
case "-": num1=num1-num2;break;
case "*": num1=num1*num2;break;
case "/": if (num2!=0) {num1=num1/num2;}
else JOptionPane.showMessageDialog(null, "出错!除数不能为零");
num1=0.0;break;
}
//运算符清空
ops="";
//将结果放在op1中
op1=num1+"";
//结果显示在文本框
jtf.setText(op1);
}else{//单击了运算符,表示第二个操作数录入结束
if (ops!=""){//如果连续运算
//记录要进行计算,
flag=1;
//将文本框中的内容保存在num2中
num2=Double.parseDouble(jtf.getText());
//根据运算符计算结果
switch(ops){
case "+": num1=num1+num2;break;
case "-": num1=num1-num2;break;
case "*": num1=num1*num2;break;
// case "/": if (num2!=0) num1=num1/num2;break;
}
//获取运算符到ops中
ops=ch+"";
//将计算结果放在op1中
op1=num1+"";
//将结果显示在文本框
jtf.setText(op1);
}else{//独立的单个运算,只需要记录运算符和第一个操作数
ops=ch+"";
num1=Double.parseDouble(op1);
//保存完第一个操作数后,清空op1内容,准备存储第二个操作数。
op1="";
}
}
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
num1=0;
op1="";
jtf.setText("");
jtf.requestFocus();
}
});
}
}
public void init() {
jtf=new JTextField();
jtf.setFont(new Font("宋体", 0, 30));
jtf.setHorizontalAlignment(jtf.RIGHT);
jtf.setText("");
add(jtf,BorderLayout.NORTH);
jp1=new JPanel();
GridLayout gridLayout = new GridLayout(4,4);
gridLayout.setHgap(8);
gridLayout.setVgap(8);
jp1.setLayout(gridLayout);
jbs=new JButton[16];
for(int i=0;i<16;i++){
jbs[i]=new JButton();
jbs[i].setText(cons[i]);
jbs[i].setFont(new Font("宋体",0,30));
jp1.add(jbs[i]);
}
add(jp1);
jb2=new JButton("清空");
jb2.setFont(new Font("宋体", 0, 30));
add(jb2,BorderLayout.SOUTH);
}
public static void main(String[] args) {
new CalcJFrame();
}
}
实验二 登录设计
一、实验目的
掌握ActionEvent动作事件实现界面的运行
二、实验内容
1、登录窗体类:NullLayout_Example
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Regulation extends JFrame{
JLabel jl1,jl2,jl3,jl4;
JTextField jtf;//文本框
JPasswordField jpf;//密码
JButton jb1,jb2;
public Regulation() {
this.setTitle("登录窗口");
setBounds(300,300,500,400);
//设置窗体为流式布局
setLayout(new GridLayout(20,1));
//空布局
setLayout(null);
init();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
jb1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
String info="";
info="姓名:"+jtf.getText();
info+="\r\n"+"密码:"+jpf.getText();
JOptionPane.showMessageDialog(null, info);
}
});
jb2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// System.exit(0);
//获取事件源对象
JButton jb=(JButton)e.getSource();
jtf.setText(jb.getText());
}
});
}
public void init() {
jl1=new JLabel("企业人事管理系统");
jl2=new JLabel("用户名:");
jl3=new JLabel("密码:");
jtf=new JTextField(10);
jpf=new JPasswordField(10);
jb1=new JButton("注册");
jb2=new JButton("取消");
jl1.setBounds(150,30,200,60);
jl2.setBounds(100, 120, 180, 30);
jtf.setBounds(200, 120, 180, 30);
jl3.setBounds(100, 180, 180, 30);
jpf.setBounds(200, 180, 180, 30);
jb1.setBounds(100, 260, 100, 30);
jb2.setBounds(220, 260, 100, 30);
Font font = new Font("楷体",Font.PLAIN,25);
jl1.setFont(font);
jl1.setForeground(Color.red);
add(jl1);
add(jl2);
add(jtf);
add(jl3);
add(jpf);
add(jb1);
add(jb2);
}
public static void main(String[] args) {
new Regulation();
}
}
2、用户名密码不正确,给出如下提示
3、用户名为admin密码为123456,则给出如下提示,并进入下个窗体
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Login extends JFrame{
JLabel jl1,jl2,jl3,jl4;
JTextField jtf;//文本框
JPasswordField jpf;//密码
JButton jb1,jb2;
public Login() {
this.setTitle("登录窗口");
setBounds(300,300,500,400);
//设置窗体为流式布局
setLayout(new GridLayout(20,1));
//空布局
setLayout(null);
init();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
jb1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(jtf.getText().trim().equals("admin")&&
new String(jpf.getPassword()).trim().equals("123456"))
{JOptionPane.showMessageDialog(null, "欢迎进入本系统!");
new MyFrameArea();}
else if(jtf.getText().trim().length()==0||
new String(jpf.getPassword()).trim().length()==0)
{JOptionPane.showMessageDialog(null, "用户名或密码不能为空!");}
else {JOptionPane.showMessageDialog(null, "用户名或密码错误!");}
}
});
jb2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// System.exit(0);
//获取事件源对象
JButton jb=(JButton)e.getSource();
jtf.setText(jb.getText());
}
});
}
public void init() {
jl1=new JLabel("企业人事管理系统");
jl2=new JLabel("用户名:");
jl3=new JLabel("密码:");
jtf=new JTextField(10);
jpf=new JPasswordField(10);
jb1=new JButton("登录");
jb2=new JButton("取消");
jl1.setBounds(150,30,200,60);
jl2.setBounds(100, 120, 180, 30);
jtf.setBounds(200, 120, 180, 30);
jl3.setBounds(100, 180, 180, 30);
jpf.setBounds(200, 180, 180, 30);
jb1.setBounds(100, 260, 100, 30);
jb2.setBounds(220, 260, 100, 30);
Font font = new Font("楷体",Font.PLAIN,25);
jl1.setFont(font);
jl1.setForeground(Color.red);
add(jl1);
add(jl2);
add(jtf);
add(jl3);
add(jpf);
add(jb1);
add(jb2);
}
public static void main(String[] args) {
new Login();
}
}
4、单击确定,显示如下
计算面积窗体类:MyFrame
在窗体中输入半径值,单击计算显示面积
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class MyFrameArea extends JFrame{
JLabel jl1,jl2;
JTextField jtf;//文本框
JButton jb;
double PI=3.14;
double r,S;
public MyFrameArea() {
this.setTitle("计算面积");
setBounds(300,300,500,400);
//设置窗体为流式布局
setLayout(new GridLayout(20,1));
//空布局
setLayout(null);
init();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String info="";
info=jtf.getText();
r=Double.parseDouble(info);
S=PI*r*r;
JOptionPane.showMessageDialog(null, S);
}});}
public void init() {
jl1=new JLabel("请输入半径:");
jtf=new JTextField();
jb=new JButton("计算");
jl1.setBounds(20,34,200,60);
jtf.setBounds(180, 50, 150, 30);
jb.setBounds(350, 49, 100, 30);
Font font = new Font("楷体",Font.PLAIN,25);
jl1.setFont(font);
jl1.setForeground(Color.black);
add(jl1);
add(jtf);
add(jb);
}
public static void main(String[] args) {
new MyFrameArea();
}
}
三、实验指导
1、涉及到两个窗体类,登录窗体、计算面积窗体,一个测试类
2、为了完成界面的正常运行,需要对相应的组件添加监视器,并实现接口中的方法
例如:
jbt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//判断用户输入是否正确的代码
}
});
3、显示消息的对话框的方法
JOptionPane.showMessageDialog(null, "欢迎进入本系统");
JOptionPane类不仅可以弹出消息对话框,还可以弹出输入对话框(参看API)
实验三 算术测试
一、实验目的
掌握处理ActionEvent事件的方法
二、实验内容
编写一个算术测试小软件,用来训练小学生的算术能力。程序有3个类组成,其中Teacher类的对象充当监视器,负责给出算术题目,并判断回答者的答案是否正确;ComputerFrame类的对象负责为算术题目提供视图,比如用户可以通过ComputerFrame对象提供的GUI界面看到题目,并通过改GUI界面给出题目的答案;MailClass是软件的主类。
三、程序代码
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.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextField;
public class ComputerFrame extends JFrame {
JMenuBar menubar;
JMenu choiceGrade; //选择级别的菜单
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);
textOne=new JTextField(5);//创建textOne,其可见字符长是5
textTwo=new JTextField(5);
textResult=new JTextField(5);
operatorLabel=new JLabel("+");
operatorLabel.setFont(new Font("Arial",Font.BOLD,20));
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);
textTwo.setEditable(false);
getProblem.setActionCommand("getProblem");
textResult.setActionCommand("answer");
giveAnwser.setActionCommand("answer");
teacherZhang.setJTextField(textOne,textTwo,textResult);
teacherZhang.setJLabel(operatorLabel,message);
getProblem.addActionListener(teacherZhang);//将teacherZhang注册为getProblem的ActionEvent事件监视器
giveAnwser.addActionListener(teacherZhang);//将teacherZhang注册为giveAnwser的ActionEvent事件监视器
textResult.addActionListener(teacherZhang);//将teacherZhang注册为textResult的ActionEvent事件监视器
setVisible(true);
validate();
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
}
Teacher.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("getProblem")) {
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(""+numberOne);
textTwo.setText(""+numberTwo);
operatorLabel.setText(operator);
message.setText("请回答");
textResult.setText(null);
}
else if(str.equals("answer")) {
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];
}
}
四、实验指导
1、学习处理事件时,必须掌握事件源、监视器、处理事件的接口这3个概念。
2、JButton对象可以触发ActionEvent事件。为了能监视到此类型事件,事件源必须使用addActionListener方法获得监视器,创建监视器类必须实现接口ActionListener。
3、扩展功能:模仿本实验代码,再增加“小学生”级别;给程序增加测试乘法的功能。