实验五 Java图形用户界面设计.docx
实验五 Java图形用户界面设计 §5 Java 图形用户界面设计 §5.1实验目的、内容及性质 掌握Java 的GUI 设计技术,掌握AWT 和Swing 的应用技巧。实验性质:验证、必做 实验学时:2学时 §5.2问题及思考 1、最常见的AWT以及Swing控件用法。 2、几个常见布局总结 3、区分容器控件和一般非容器控件 4、Java事件几种关键组成部分以及事件处理流程 §5.3实验指导 1、Swing示例 /*需要哪些组件,如何布局?*/ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MyFrm extends JFrame/从JFrame继承 /*声明界面需要使用的控件*/ JLabel lbl_name =new JLabel("用户名"); JLabel lbl_pwd =new JLabel("密码"); JTextField txt_name=new JTextField(); JPasswordField txt_pwd=new JPasswordField(); JButton btn_OK=new JButton("登陆"); JButton btn_Cancel=new JButton("取消"); /*在构造函数中将控件放置在JFrame上*/ public MyFrm() /*获取当前Frame的内容面板*/ JPanel jp=(JPanel)this.getContentPane(); /*设置内容面板的布局Layout*/ jp.setLayout(new GridLayout(3,2); jp.add(lbl_name);jp.add(txt_name); jp.add(lbl_pwd);jp.add(txt_pwd); jp.add(btn_OK);jp.add(btn_Cancel); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); public static void main(String arg) /*纯Java样式显示窗体*/ JFrame.setDefaultLookAndFeelDecorated(true); /*实例化当前窗体类*/ MyFrm frm=new MyFrm(); frm.setSize(200,200); frm.setVisible(true); 2、常用布局 1)、流布局:FlowLayout 从左到右,自上而下方式在容器中排列,控件的大小不会随容器大小变化. 容器.setLayout(new FlowLayout(FlowLayout.LEFT); 2)、网格布局:GridLayout 按照指定行数与列数,将容器分成大小相等的单元格每个单元格放置一个控件. 不能将控件放在指定单元格 容器.setLayout(new GridLayout(3,4,10,15); 3)、边界布局:BorderLayout 将容器分成东、西、南、北、中五个部分 容器.setLayout(new BorderLayout(); 窗口的内容面板默认布局就是边界布局。 容器.add(控件,BorderLayout.NORTH); 4)、混合布局:使用JPanel,将多个布局组合在一起使用 JPanel jp=(JPanel)this.getContentPane(); for(int i=0;i事件源侦听者接收事件->自动调用相应事件处理函数. 编程模板: class MyFrm extends JFrame implements ActionListener JButton btn=new JButton("OK"); . public MyFrm() . btn.addActionListner(this); . public void actionPerformed(ActionEvent e) . if(e.getSource()=btn) Java事件处理示例: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyFrm extends JFrame implements ActionListene r /* 界面中需要的组件作为属性声明 */ JTextField txt = new JTextField(10); JLabel lbl = new JLabel("姓名"); JButton btn = new JButton("查询"); /* 组件在构造函数中放置在窗体JFrame上 */ public MyFrm() /* 获取JFrame的内容面板ContentPane,控件放在该面板上 */ JPanel jp = (JPanel) this.getContentPane(); /* 设置面板布局Layout,如何放? */ jp.setLayout(new FlowLayout(); jp.add(lbl); jp.add(txt); jp.add(btn); /* 为事件源加一个侦听者*/ btn.addActionListener(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* 事件处理方法*/ public void actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(this, "btn点击"); public static void main(String arg) JFrame.setDefaultLookAndFeelDecorated(true);/ 设置纯Java样式 MyFrm frm = new MyFrm(); frm.setSize(400, 300); frm.setVisible(true); 注意:在做下列题目前仔细阅读第一个示例,彻底弄懂Swing界面设计 §5.4实践编程 1、调试运行Swing示例 2、调试运行Java事件处理示例 3、依据题1、2,编写如下界面 当用户点击”Click Me”按钮,显示消息对话框,消息为” Click Me 按钮被点击”。package Ex5_3; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyFrm extends JFrame implements ActionListener JButton btn=new JButton("Click Me"); public MyFrm() JPanel jp=(JPanel)this.getContentPane(); jp.setLayout(new FlowLayout(); jp.add(btn); btn.addActionListener(this); this.setTitle("Action Event"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); public void actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(this,"Click Me 按钮被点击"); package Ex5_3; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Test public static void main(String args) MyFrm frm = new MyFrm(); frm.setSize(400, 300); frm.setVisible(true); 4、编写一个程序实现用户登录界面 当用户登录按下确定键,判断用户是否录入了用户名与密码,如果没有按或用户名不为admin 密码不为1234 都需要提示错误。 package Ex5_4; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyFrm extends JFrame implements ActionListener JLabel lbl_name =new JLabel("用户名"); JLabel lbl_pwd =new JLabel("密码"); JTextField txt_name=new JTextField(); JPasswordField txt_pwd=new JPasswordField(); JButton btn_OK=new JButton("登陆"); JButton btn_Cancel=new JButton("取消"); public MyFrm() JPanel jp=(JPanel)this.getContentPane(); jp.setLayout(new GridLayout(3,2,10,5); jp.add(lbl_name);jp.add(txt_name); jp.add(lbl_pwd);jp.add(txt_pwd); jp.add(btn_OK);jp.add(btn_Cancel); this.setTitle("登陆"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); btn_OK.addActionListener(this); public void actionPerformed(ActionEvent e) String uname=txt_name.getText(); String upwd=txt_pwd.getText(); if(uname.equals("")|upwd.equals("") JOptionPane.showMessageDialog(this, "用户名或密码未输入!"); else if(!uname.equals("admin")|!upwd.equals("1234") JOptionPane.showMessageDialog(this, "用户名或密码输入错误!"); else JOptionPane.showMessageDialog(this, "用户名或密码输入正确!"); package Ex5_4; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Test public static void main(String args) JFrame.setDefaultLookAndFeelDecorated(true); MyFrm frm=new MyFrm(); frm.setSize(400,200); frm.setVisible(true); 5、利用合适的布局和Swing控件完成下题 按照界面使用相应控件与合适的布局完成下题,要求按生成随机数按纽产生三个随机整数0到100之间,按计算平均数按纽计算平均值,如图所示,初始界面 参考:int x=(Math.random()*41+60); 产生随机数 txt1.setText(x+”);将随机数赋予文本框txt1 package Ex5_5; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyFrm extends JFrame implements ActionListener JLabel lbl =new JLabel("随机数字一"); JLabel lb2 =new JLabel("随机数字二"); JLabel lb3 =new JLabel("随机数字三"); JLabel lb4 =new JLabel("三数平均值"); JTextField txt1=new JTextField(); JTextField txt2=new JTextField(); JTextField txt3=new JTextField(); JTextField txt4=new JTextField(); JButton btn_start=new JButton("生成随机数"); JButton btn_average=new JButton("计算平均数"); public MyFrm() JPanel jp=(JPanel)this.getContentPane(); jp.setLayout(new GridLayout(5,2,10,5); jp.add(lbl);jp.add(txt1); jp.add(lb2);jp.add(txt2); jp.add(lb3);jp.add(txt3); jp.add(lb4);jp.add(txt4); jp.add(btn_start);jp.add(btn_average); this.setTitle("三个随机数字"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); btn_start.addActionListener(this); btn_average.addActionListener(this); public void actionPerformed(ActionEvent e) if(e.getSource()=btn_start) int x=(int)(Math.random()*41+60); txt1.setText(x+""); int y=(int)(Math.random()*41+60); txt2.setText(y+""); int z=(int)(Math.random()*41+60); txt3.setText(z+""); if(e.getSource()=btn_average) double x=Double.valueOf(txt1.getText(); double y=Double.valueOf(txt2.getText(); double z=Double.valueOf(txt3.getText(); double t=(x+y+z)/3; txt4.setText(t+""); package Ex5_5; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Test public static void main(String args) MyFrm frm=new MyFrm(); frm.setSize(400,200); frm.setVisible(true); 6编写程序实现如下界面,实现事件如果按下座位i 就在控制台中显示“座位i被选中”例如按下“座位0“,则输出座位0被选中” package Ex5_6; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyFrm extends JFrame implements ActionListener JButton btn0=new JButton("讲台"); JButton btn1=new JButton("座位1"); JButton btn2=new JButton("座位2"); JButton btn3=new JButton("座位3"); JButton btn4=new JButton("座位4"); JButton btn5=new JButton("座位5"); JButton btn6=new JButton("座位6"); public MyFrm() JPanel jp=(JPanel)this.getContentPane(); JPanel jp1=new JPanel(); jp1.setLayout(new GridLayout(); jp1.add(btn0); jp.add(jp1,BorderLayout.NORTH); JPanel jp2=new JPanel(); jp2.setLayout(new GridLayout(2,3); jp2.add(btn1);jp2.add(btn2);jp2.add(btn3); jp2.add(btn4);jp2.add(btn5);jp2.add(btn6); jp.add(jp2,BorderLayout.CENTER); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); btn1.addActionListener(this); btn2.addActionListener(this); btn3.addActionListener(this); btn4.addActionListener(this); btn5.addActionListener(this); btn6.addActionListener(this); public void actionPerformed(ActionEvent e) if(e.getSource()=btn1) System.out.println("座位1被选中"); if(e.getSource()=btn2) System.out.println("座位2被选中"); if(e.getSource()=btn3) System.out.println("座位3被选中"); if(e.getSource()=btn4) System.out.println("座位4被选中"); if(e.getSource()=btn5) System.out.println("座位5被选中"); if(e.getSource()=btn6) System.out.println("座位6被选中"); public static void main(String args) MyFrm frm=new MyFrm(); frm.setSize(1000,500); frm.setVisible(true); 7 完成以下窗体制作 参考:这一题考虑使用组合布局,将上面控件放置在JPanel上,再将JPanel放到内容面板的中间。下面四个按钮先放在某JPanel再放置在内容面板的South部分 package Ex5_7; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class LoginFrm extends JFrame implements ActionListener JLabel lb_name=new JLabel("姓名:"); JLabel lb_sex=new JLabel("性别:"); JLabel lb_profession=new JLabel("身份:"); JLabel lb_unit=new JLabel("单位:"); JLabel lb_IDnum=new JLabel("证件号码:"); JLabel lb_rDate=new JLabel("注册日期:"); JLabel lb_eDate=new JLabel("有效日期:"); JTextField txt_name=new JTextField();