第七次实验:GUI标准组件及事件处理一、实验目的了解图形用户界面基本组件:框架、面板、按钮、标签、菜单、列表等的使用方法;了解如何使用布局管理器对组件进行管理;理解和掌握Java 的事件处理机制。
二、实验要求1. 了解Java图像用户界面的开发,掌握基本组件的使用。
2. 掌握编写独立运行的窗口界面的方法,了解菜单和对话框的使用方法。
3. 理解Java 的事件处理机制,掌握为不同组件编写事件处理程序的方法。
三、实验内容(一)在面板中添加多个组件,并进行合理的布局♦程序功能:在一个框架(Frame)容器中添加一个面板(Panel)容器,并分别在框架和面板容器中添加组件并使用不同的布局管理方式。
♦请编写KY7_1.java 程序文件,源代码如下:import java.awt.*;import java.awt.Color;public class KY7_1{public static void main(String args[]){Frame f = new Frame(); //创建一个框架fPanel p = new Panel(); //创建一个面板pf.add(p); //把面板p添加到框架f中p.setBackground(Color.blue); //设置面板p的背景颜色为蓝色p.setLayout(new FlowLayout()); //设置面板p的布局为流式布局Label l = new Label();p.add(l); //在面板p中添加一个标签lButton button1 = new Button();Button button2 = new Button();Button button3 = new Button();Button button4 = new Button();Button button5 = new Button();Button button6 = new Button();p.add(button1);p.add(button2); p.add(button3); p.add(button4); p.add(button5); p.add(button6); //在面板p 中添加六个按钮 Choice c=new Choice(); // 创建一个下拉列表c , c.addItem("北京"); // 下拉列表c 中有三个选项:北京、上海和天津 c.addItem("上海"); c.addItem("天津"); p.add(c); //把列表c 添加到面板p 中f.setBounds(400,400,400,400); f.setVisible(true);f.validate(); //设置框架f 的大小和可见性}}(二)为窗口添加菜单,并处理由菜单项所引发的事件♦ 程序功能:在窗口中添加菜单条,在菜单条中添加菜单,并在菜单中添加菜单项和子菜单。
通过选择菜单项可以引发不同的事件,从而执行不同操作,例如点击“打开”菜单项可以打开一个“打开文件对话框”。
♦ 编写KY7_2.java 程序文件,代码如下:import java.awt.*;import java.awt.event.*;public class KY7_2 extends Frame implements ActionListener{static Frame f;m1m2 mstatic FileDialog fd1;static FileDialog fd2;public static void main(String args[]){KY7_2 k = new KY7_2();f = new Frame();MenuBar mb = new MenuBar();Menu m1 = new Menu("文件");Menu m2 = new Menu("帮助");mb.add(m1);mb.add(m2);MenuItem m11 = new MenuItem("打开");MenuItem m12 = new MenuItem("关闭");MenuItem m13 = new MenuItem("退出");m1.add(m11);m1.add(m12);m1.add(m13);MenuItem m21 = new MenuItem("目录");MenuItem m22 = new MenuItem("索引");MenuItem m23 = new MenuItem("关于");m2.add(m21);m2.add(m22);m2.add(m23);Menu m3 = new Menu("编辑");MenuItem m31 = new MenuItem("复制");MenuItem m32 = new MenuItem("剪切");MenuItem m33 = new MenuItem("粘贴");m3.add(m31);m3.add(m32);m3.add(m33);m1.add(m3);m11.addActionListener(k);m13.addActionListener(k);f.setSize(350,200);f.setMenuBar(mb);f.setVisible(true);}public void actionPerformed (ActionEvent e){ if (e.getActionCommand() == "打开"){FileDialog fd1 = new FileDialog (f, "open", FileDialog.SAVE);fd1.setVisible (true);}if (e.getActionCommand() == "保存"){FileDialog fd2 = new FileDialog (f, "save", FileDialog.SAVE);fd2.setVisible (true);} }}三、运行题中程序,然后按【思考问题】提示来分析、修改并体验程序。
【思考问题】①基本容器JFrame比起Frame有何特点?为什么这里定义了一个c=this.getContentPane();Frame是awt中的组件,JFrame是swing中的组件,JFrame 包含一个JRootPane 作为其唯一的子容器。
this.getContentPane()的作用是初始化一个容器,用来在容器上添加一些控件②采用了什么布局管理器,各组件按什么次序加入组件的?FlowLayout,从左到右排列成一行。
③很多地方用到this,这个this指什么?1、表示对当前对象的引用;2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名时进行区分; 3、用于在构造方法中引用满足指定参数类型的构造器。
④分析事件执行方法 actionPerformed里面的下面三条语句起何作用?a=Double.valueOf(TOprand1.getText()).doubleValue();b=Double.valueOf(TOprand2.getText()).doubleValue();Result.setText(String.valueOf(sum));读出T0prand1和T0prand2中的数,和写入Result中。
⑤程序中对按钮事件的监听采用了什么方法?请修改成另外两种方法实验。
import java.awt.*;import java.awt.event.*;import javax.swing.*;class Ex9_1 extends JFrame{ JTextField TOprand1;JTextField TOprand2;JTextField Result;JLabel LAdd,LSum;JButton BAdd,BClear;Container c=null;public Ex9_1(){ TOprand1=new JTextField("0.0000");TOprand2=new JTextField("0.0000");Result=new JTextField("0.0000");LAdd=new JLabel("+");LSum=new JLabel("=");BAdd=new JButton("加法");BClear=new JButton("清除");c=this.getContentPane();c.setLayout(new FlowLayout());c.add(TOprand1);c.add(LAdd);c.add(TOprand2);c.add(LSum);c.add(Result);c.add(BAdd);c.add(BClear);this.pack();this.setVisible(true);PoliceMan p=new PoliceMan();BAdd.addActionListener(p);BClear.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){ TOprand1.setText("0.0000");TOprand2.setText("0.0000");Result.setText(String.valueOf("0.0000"));}});this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){ System.exit(0);}}); }class PoliceMan implements ActionListener{public void actionPerformed(ActionEvent e){ double a,b,sum;a=Double.valueOf(TOprand1.getText()).doubleValue();b=Double.valueOf(TOprand2.getText()).doubleValue();sum=a+b;Result.setText(String.valueOf(sum));}}public static void main(String args[]){ Ex9_1 mainFrame = new Ex9_1();mainFrame.setSize(350, 200);mainFrame.setTitle("GUI实验一");}}⑥将定义的类class Ex9_1 extends JFrame implements ActionListener去掉继承extends JFrame,功能不变,程序如何修改?import java.awt.*;import java.awt.event.*;import javax.swing.*;class Ex9_1 implements ActionListener{ TextField TOprand1;TextField TOprand2;TextField Result;Label LAdd,LSum;Button BAdd,BClear;Container c=null;public Ex9_1(){ Frame f=new Frame();TOprand1=new TextField("0.0000");TOprand2=new TextField("0.0000");Result=new TextField("0.0000");LAdd=new Label("+");LSum=new Label("=");BAdd=new Button("加法");BClear=new Button("清除");c.setLayout(new FlowLayout());c.add(TOprand1);c.add(LAdd);c.add(TOprand2);c.add(LSum);c.add(Result);c.add(BAdd);c.add(BClear);c.pack();c.setVisible(true);c.setSize(350, 200);c.setTitle("GUI实验一");BAdd.addActionListener(this);BClear.addActionListener(this);f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){ System.exit(0);}});}public void actionPerformed(ActionEvent e){ double a,b,sum;if(e.getSource()==BAdd){ a=Double.valueOf(TOprand1.getText()).doubleValue(); b=Double.valueOf(TOprand2.getText()).doubleValue(); sum=a+b;Result.setText(String.valueOf(sum));}if(e.getSource()==BClear){TOprand1.setText("0.0000");TOprand2.setText("0.0000");Result.setText(String.valueOf("0.0000"));}}public static void main(String args[]){ Ex9_1 mainFrame = new Ex9_1();}}⑦设置布局管理器为null,使组件摆放次序不变,重新修改程序。