1、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 exten
2、ds 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()/*获取当
3、前 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)/*纯 J
4、ava 样式显示窗体*/JFrame.setDefaultLookAndFeelDecorated(true);/*实例化当前窗体类 */MyFrm frm=new MyFrm();frm.setSize(200,200);frm.setVisible(true);2、常用布局1)、流布局:FlowLayout 从左到右,自上而下方式在容器中排列,控件的大小不会随容器大小变化.容器.setLayout(new FlowLayout(FlowLayout.LEFT);2)、网格布局:GridLayout 按照指定行数与列数,将容器分成大小相等的单元格每个单元格放置一个控件. 不能将控件放在指定单
5、元格容器.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 i
6、mplements ActionListenerJButton 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 ActionListener/* 界面
7、中需要的组件作为属性声明 */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.ad
8、d(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(t
9、rue);/ 设置纯 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
10、.*;public class MyFrm extends JFrame implements ActionListenerJButton 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_CLO
11、SE);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
12、、编写一个程序实现用户登录界面 当用户登录按下确定键,判断用户是否录入了用户名与密码,如果没有按或用户名不为admin 密码不为 1234 都需要提示错误。package Ex5_4;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class MyFrm extends JFrame implements ActionListenerJLabel lbl_name =new JLabel(“用户名“);JLabel lbl_pwd =new JLabel(“密码“);JTextField txt_nam
13、e=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(b
14、tn_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
15、, “用户名或密码未输入!“);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
16、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+”);将随机数赋予文本框 txt1package Ex5_5;import
17、 javax.swing.*;import java.awt.*;import java.awt.event.*;public class MyFrm extends JFrame implements ActionListenerJLabel lbl =new JLabel(“随机数字一“ );JLabel lb2 =new JLabel(“随机数字二“ );JLabel lb3 =new JLabel(“随机数字三“ );JLabel lb4 =new JLabel(“三数平均值“ );JTextField txt1=new JTextField();JTextField txt2=new
18、 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(txt
19、2);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_
20、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.getTe
21、xt();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“,则输出座位
22、0 被选中”package Ex5_6;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class MyFrm extends JFrame implements ActionListenerJButton btn0=new JButton(“讲台“);JButton btn1=new JButton(“座位1“);JButton btn2=new JButton(“座位2“);JButton btn3=new JButton(“座位3“);JButton btn4=new JButton(“座位4“)
23、;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(b
24、tn2);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.addAc
25、tionListener(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.ou
26、t.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
27、.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_r
28、Date=new JLabel(“注册日期:“ );JLabel lb_eDate=new JLabel(“有效日期:“ );JTextField txt_name=new JTextField();JComboBox cmb_sex=new JComboBox();JComboBox cmb_profession=new JComboBox();JComboBox cmb_unit=new JComboBox();JTextField txt_IDnum=new JTextField();JTextField txt_rDate=new JTextField();JTextField txt
29、_eDate=new JTextField();JButton btn_ADD=new JButton(“添加“);JButton btn_DEL=new JButton(“删除“);JButton btn_BACK=new JButton(“撤销“);JButton btn_ESC=new JButton(“退出“);public LoginFrm()JPanel jp=(JPanel)this.getContentPane();JPanel jp1=new JPanel();jp1.setLayout(new GridLayout(7,2,5,10);jp1.add(lb_name);jp
30、1.add(txt_name);jp1.add(lb_sex);jp1.add(cmb_sex);cmb_sex.addItem(“男“);cmb_sex.addItem(“女“);jp1.add(lb_profession);jp1.add(cmb_profession);cmb_profession.addItem(“学生“ );cmb_profession.addItem(“教师“ );cmb_profession.addItem(“职工“ );cmb_profession.setEditable(true);jp1.add(lb_unit);jp1.add(cmb_unit);cmb_
31、unit.addItem(“计算机系“) ;cmb_unit.addItem(“工商管理系“) ;cmb_unit.setEditable(true);cmb_profession.setEditable(true);jp1.add(lb_IDnum);jp1.add(txt_IDnum);jp1.add(lb_rDate);jp1.add(txt_rDate);jp1.add(lb_eDate);jp1.add(txt_eDate);jp.add(jp1,BorderLayout.CENTER);JPanel jp2=new JPanel();jp2.setLayout(new GridLa
32、yout(1,4);jp2.add(btn_ADD);jp2.add(btn_DEL);jp2.add(btn_BACK);jp2.add(btn_ESC);jp.add(jp2,BorderLayout.SOUTH);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setTitle(“图书证办理“ );btn_ADD.addActionListener(this);btn_DEL.addActionListener(this);btn_BACK.addActionListener(this);btn_ESC.addAction
33、Listener(this);public void actionPerformed(ActionEvent e)public static void main(String args)JFrame.setDefaultLookAndFeelDecorated(true);LoginFrm frm=new LoginFrm();frm.setSize(500, 400);frm.setVisible(true);8、完成以下窗体制作(使用 null 布局)package Ex5_8;import javax.swing.*;import java.awt.*;import java.awt.e
34、vent.*;public class LoginFrm extends JFrame implements ActionListener JLabel lb_title=new JLabel(“学生注册查询“ );JLabel lb_name=new JLabel(“姓名“);JLabel lb_snum=new JLabel(“学号“);JLabel lb_unit=new JLabel(“系别“);JLabel lb_major=new JLabel(“专业“ );JLabel lb_address=new JLabel(“地址“ );JTextField txt_name=new JT
35、extField(“jTextField1“);JTextField txt_snum=new JTextField(“jTextField1“);JTextField txt_unit=new JTextField(“jTextField1“);JTextField txt_major=new JTextField(“jTextField1“);JTextField txt_address=new JTextField(“jTextField1“);JButton btn_ADD=new JButton(“添加“);JButton btn_INQ=new JButton(“查询“);JBut
36、ton btn_BACK=new JButton(“取消“);public LoginFrm()JPanel jp=(JPanel)this.getContentPane();jp.setLayout(null);jp.add(lb_name);jp.add(lb_snum);jp.add(lb_address);jp.add(lb_major);jp.add(lb_title);jp.add(lb_unit);jp.add(txt_address);jp.add(txt_major);jp.add(txt_name);jp.add(txt_snum);jp.add(txt_unit);jp.
37、add(btn_ADD);jp.add(btn_BACK);jp.add(btn_INQ);lb_title.setBounds(210,5,200,50);lb_snum.setBounds(80,80,100, 20);txt_snum.setBounds(120,80,100,20);lb_name.setBounds(280,80,100,20);txt_name.setBounds(320,80,100,20);lb_unit.setBounds(80,120,100, 20);txt_unit.setBounds(120,120,100,20);lb_major.setBounds
38、(280,120,100,20);txt_major.setBounds(320,120,100,20);lb_address.setBounds(80,160,100,20);txt_address.setBounds(120,160,300,20);btn_ADD.setBounds(60, 220, 80, 30);btn_INQ.setBounds(210, 220, 80, 30);btn_BACK.setBounds(360, 220, 80, 30);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);btn_ADD.addAc
39、tionListener(this);btn_INQ.addActionListener(this);btn_BACK.addActionListener(this);public void actionPerformed(ActionEvent e)public static void main(String args)LoginFrm frm=new LoginFrm();frm.setSize(500, 400);frm.setVisible(true);9、运用 Swing 控件完成下题package Ex5_9;import javax.swing.*;import java.awt
40、.*;import java.awt.event.*;public class MyFrm extends JFrame implements ActionListener JLabel lb_num=new JLabel(“员工编号:“);JLabel lb_thing=new JLabel(“借用器具:“ );JLabel lb_sDate=new JLabel(“借用日期:“ );JLabel lb_eDate=new JLabel(“归还日期:“ );JLabel lb_reason=new JLabel(“借用原因:“);JTextField txt_num=new JTextFie
41、ld();JTextField txt_thing=new JTextField();JTextField txt_sDate=new JTextField();JTextField txt_eDate=new JTextField();JTextField txt_reason=new JTextField();JButton btn_OK=new JButton(“确定“ );JButton btn_CANCEL=new JButton(“取消“);public MyFrm()JPanel jp=(JPanel)this.getContentPane();JPanel jp1=new JP
42、anel();jp1.setLayout(new FlowLayout(FlowLayout.LEFT);jp1.add(lb_num);jp1.add(txt_num);jp1.add(lb_thing);jp1.add(txt_thing);jp1.add(lb_sDate);jp1.add(txt_sDate);jp1.add(lb_eDate);jp1.add(txt_eDate);jp1.add(lb_reason);jp1.add(txt_reason);txt_num.setPreferredSize(new Dimension(120, 25);txt_thing.setPre
43、ferredSize(new Dimension(120, 25);txt_sDate.setPreferredSize(new Dimension(120, 25);txt_eDate.setPreferredSize(new Dimension(120, 25);txt_reason.setPreferredSize(new Dimension(315, 25);jp.add(jp1,BorderLayout.CENTER);JPanel jp2=new JPanel();jp2.setLayout(new GridLayout(1,2);jp2.add(btn_OK);jp2.add(b
44、tn_CANCEL);jp.add(jp2,BorderLayout.SOUTH);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setTitle(“借用物品“ );btn_OK.addActionListener(this);btn_CANCEL.addActionListener(this);public void actionPerformed(ActionEvent e)public static void main(String args)MyFrm frm=new MyFrm();frm.setSize(500, 200);frm.setVisible(true);