java面向对象程序设计实验 5建立图形用户界面.docx
java面向对象程序设计实验 5建立图形用户界面 实验 5 建立图形用户界面 一、实验目的 了解图形用户界面基本组件窗口、按钮、文本框、选择框、滚动条等的使用方法,了解如何使用布局管理器对组件进行管理,以及如何使用Java 的事件处理机制。 二、实验要求 1. 掌握在Applet 容器中添加组件的方法,掌握使用布局管理器对组件进行管理的方法。 2. 理解Java 的事件处理机制,掌握为不同组件编写事件处理程序的方法。 3. 掌握编写独立运行的窗口界面的方法。 4. 了解Java Swing 组件的使用方法。 5. 了解对话框的使用方法。 三、实验内容 前面的在于体会,重点完成(六)的编程题。 (一)创建图形用户界面 图形用户界面(Graphic User Interface ,简称GUI)是为方便用户使用设计的窗口界面,在图形用户界面中用户可以看到什么就操作什么,取代了在字符方式下知道是什么后才能操作什么的方式。组件(Component)是构成GUI 的基本要素,通过对不同事件的响应来完成和用户的交互或组件之间的交互。组件一般作为一个对象放置在容器(Container)内,容器是能容纳和排列组件的对象,如Applet、Panel(面板)、Frame(窗口)等。通过容器的add 方法把组件加入到容器中。 1.在Applet 中添加标签、按钮并使用网格布局 ?程序功能:在Applet 容器中添加组件标签、按钮,并使用网格布局管理器排列组件在容器中的位置。 ?编写KY7_1.java 程序文件,源代码如下。 import java.awt.*; import java.applet.Applet; public class KY6_1 extends Applet Label l1; Button b1, b2, b3, b4, b5, b6; public void init() setLayout(new GridLayout(3,3); / 设置网格布局(3 行3 列共9 个网格) l1=new Label("标签1"); b1 = new Button("按钮1"); b2 = new Button("按钮2"); b3 = new Button("按钮3"); b4 = new Button("按钮4"); add(l1); add(b1); add(b2); add(b3); add(new Label(); add(b4); add(new Button("按钮5"); add( new Button("按钮6"); add(new Label("标签2"); ?编译程序KY7_1.java。 ?编写显示Applet 的页面文件KY7_1.html 2.在面板中添加组件 ?程序功能:在Applet 中添加面板容器,并分别在Applet、面板容器中添加组件并使用不同的布局管理方式。 ?编写KY7_2.java 程序文件,源代码如下。 import java.awt.*; import java.awt.Color; import java.applet.Applet; public class KY6_2 extends Applet public void init() /设置最底层的 Applet 容器为顺序布局 setFont(new Font("Arial",Font.PLAIN,20); Label l=new Label("这是最底层的 Applet 容器中的标签",Label.CENTER); add(l); Panel panel1=new Panel(); add( panel1); panel1.setBackground(Color.blue); panel1.setForeground(Color.red); panel1.add("North", new Button("北"); panel1.add("South", new Button("南"); panel1.add("East", new Button("东"); panel1.add("West", new Button("西"); panel1.add("Center", new Label("这是在 Panel1 面板中部添加的标签"); Panel panel2; add( panel2); panel2.setLayout(new GridLayout(3,1); /设置网格布局 Choice c=new Choice ();/创建下拉式列表 c.addItem("北京"); c.addItem("上海"); c.addItem("天津"); Label l1=new Label("这是在 Panel2 面板中的标签"); Button b1=new Button("Panel2 中的按钮"); panel2.setBackground(Color.green); panel2.add(l1); 100 panel2.add(b1); panel2.add(c); ?编译程序KY7_2.java,有错误请修改之。 ?编写显示Applet 的页面文件KY7_2.html (二)了解事件处理机制 在图形用户界面中,程序和用户的交互是通过组件响应各种事件来实现的。例如,用户单击了一个按钮,意味着发生了按钮的单击事件;选中下拉框中的一个选项,意味着发生了一个选项事件。在Java 中能产生事件的组件叫做事件源,如按钮。如果希望对单击按钮事件进行处理,可给事件源(按钮)注册一个事件监听器(如包含按钮的容器),如同签订了一个委托合同,当事件源发生事件时,事件监听器就代替事件源对发生的事件进行处理,这就是所谓的委托事件处理机制。 1单击按钮的事件处理程序 ?程序功能:使用手工布局设置组件标签、按钮的位置,为按钮编写单击事件处理方法。当用户用鼠标单击按钮时,会听到一声响声。 ?编写KY7_3.java 程序文件,源代码如下。 import java.awt.*; import java.applet.Applet; public class KY6_3 extends Applet implements ActionListener / 实现动作事件监听 接口 public void init() setLayout(null);/关闭默认的顺序管理布局 Label l=new Label("按一下按钮可听到响声!", Label.CENTER); add(l); l.setBounds(40,10,150,30); Button b=new Button("按钮"); b.setBounds(60,50); b.addActionListener (this); / 注册事件源的动作监听者 public void actionPerformed(ActionEvent e) /实现单击事件接口的方法 Toolkit.getDefaultToolkit ().beep(); /单击事件发生时作出的反应 ?编译程序KY7_2.java,有错误请修改之。 2选择复选框和单选框按钮的事件处理程序 ?程序功能:在Applte 上创建复选框、单选框、文本区域、单行文本框等组件,并实现根据用户输入的10 进制数,选择不同选项可转换为2、8、16 进制数。 ?编写KY7_4.java 程序文件,源代码如下。(提示:看看Integer类提供哪些方法)?编译程序KY7_4.java。 ?编写显示Applet 的页面文件KY7_4.html (三)建立独立运行的窗口界面并使用匿名类 最常使用的包含组件的容器是窗口,在Java 中窗口由Frame 类生成。 1创建一个窗口界面 ?程序功能:创建一个具有关闭功能的空白窗口。 ?编写KY7_5_W.java 程序文件,源代码如下。 import java.awt.*; import java.awt.event.*; public class KY7_5_W public static void main(String args) new KY7_5_W(); KY7_5_W() Frame f=new Frame("初始窗口");/创建窗口对象 f.setSize(350,200);/设置窗口大小 f.setV isible(true);/设置窗口是可视的 f.addWindowListener(new WindowAdapter() /为窗口添加窗口事件适配器 public void windowClosing(WindowEvent e) /关闭窗口事件的方法 System.exit(0); ; ?编译并运行程序 2在窗口中添加组件 ?程序功能:在窗口中添加组件。 ?编写KY7_6.java 程序文件,源代码如下。 import java.awt.*; import java.awt.event.*; public class KY7_6 extends Frame implements ActionListener Button btn1, btn2; TextField f,tf1,tf2; TextArea Area; KY7_6() super("添加组件的窗口"); addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); setSize(350,250); /设置窗口大小 setLocation(200,200);/设置窗口显示位置 setFont(new Font("Arial",Font.PLAIN,12); /设置字体 setLayout(new FlowLayout(); Area=new TextArea (6,40); tf1=new TextField(10); tf2=new TextField(10); btn1=new Button("显示"); btn2=new Button("退出"); f=new TextField(20); add(Area); add(new Label("用户名"); add(tf1); add(new Label("电话"); add(tf2); add(f); add(btn1); add(btn2); tf1.addActionListener(this); tf2.addActionListener(this); btn1.addActionListener(this); btn2.addActionListener(this); show(); public static void main(String args) new KY7_6(); public void actionPerformed(ActionEvent e) if (e.getSource()=btn1) f.setText("你按下了“" + e.getActionCommand() + "”按钮"); if (e.getSource()=tf1) Area.append("用户名:"+tf1.getText()+"n"); if (e.getSource()=tf2) Area.append("电话:"+tf2.getText()+"n"); if (e.getSource()=btn2) for (int i=0; i<100000000; i+); dispose();/只关闭当前窗口,注销该对象 ?编译并运行程序 3为窗口添加菜单 ?程序功能:在窗口中添加菜单栏,在菜单栏添加菜单项,并添加下拉菜单和2 级菜单,通过选择菜单项可以执行不同操作,如“打开”可打开KY6_6 类生成的窗口。 ?编写KY7_7.java 程序文件,源代码如下。 import java.awt.*; import java.awt.event.*; public class KY7_7 extends Frame implements ActionListener Panel p=new Panel(); Button b=new Button("退出"); MenuBar mb=new MenuBar(); / 以下生成菜单组件对象 Menu m1=new Menu("文件"); MenuItem open=new MenuItem("打开"); MenuItem close=new MenuItem("关闭"); MenuItem exit=new MenuItem("退出"); Menu m12=new Menu("编辑"); MenuItem copy=new MenuItem("复制"); MenuItem cut=new MenuItem("剪切"); MenuItem paste=new MenuItem("粘贴"); Menu m2=new Menu("帮助"); MenuItem content=new MenuItem("目录"); MenuItem index=new MenuItem("索引"); MenuItem about=new MenuItem("关于"); KY7_7() super("添加菜单的窗口"); setSize(350,200); add("South",p); p.add(b); b.addActionListener(this); m1.add(open); / 将菜单项加入到菜单m1 中 m1.add(close); m1.addSeparator(); /在菜单中添加分隔条 m1.add(exit); open.addActionListener(this); /给菜单项open 注册事件监听器exit.addActionListener(this); mb.add(m1); / 将菜单m1 加入到菜单栏mb 中 m12.add(copy); m12.add(cut); m12.add(paste); m1.add(m12);/将m12 作为2 级菜单添加到m1 菜单项中 m2.add(content); m2.add(index); m2.addSeparator(); m2.add(about); mb.add(m2); setMenuBar(mb); / 设置菜单栏为mb show();/ 显示组件 public static void main(String args) new KY7_7(); public void actionPerformed(ActionEvent e) if (e.getActionCommand()="退出") System.exit(0); if (e.getActionCommand()="打开") new KY7_6(); ?编译并运行程序 (四)使用Swing 组件 在Java 中,能够实现图形用户界面的类库有两个:java.awt 和javax.swing。前者称为抽象窗口工具库A WT(Abstract Windows Toolkit),后者是Java 基础类库JFC(Java Foundation Classes) 的一个组成部分,它提供了一套功能更强、数量更多、更美观的图形用户界面组件。Swing 组件名称和A WT 组件名称基本相同,但以J 开头,例如A WT 按钮类的名称是Button,在Swing 中的名称则是JButton。 1在JApplet 中添加Swing 组件 ?程序功能:在JApplet 中添加 3 个带有图片的按钮和一个带有图片的标签。 ?准备图片文件:在当前目录下建立一个image 文件夹,存放4 个图片文件,例如?PreviousArrow.gif。 ?编写KY7_8.java 程序文件,源代码如下。 import javax.swing.*; import java.awt.*; import java.awt.Color; public class KY7_8 extends JApplet Container pane; JPanel panel1,panel2; JButton button1,button2,button3; JLabel label; public void init() pane=getContentPane(); panel1=new JPanel(new FlowLayout(); panel2=new JPanel(new FlowLayout(); ImageIcon icon = new ImageIcon("image/PreviousArrow.gif"," "); button1=new JButton(icon); button2=new JButton(new ImageIcon("image/go.GIF"); button3=new JButton(new ImageIcon("image/NextArrow.gif"); label=new JLabel("图像标签", new ImageIcon("image/Candl02.gif"),SwingConstants.CENTER); pane.setBackground(new Color(255,255,200); panel1.setBackground(new Color(255,255,104); panel2.setBackground(new Color(255,255,214); button1.setToolTipText("向上翻页按钮"); button2.setToolTipText("跳转按钮"); button3.setToolTipText("向下翻页按钮"); pane.add("North",panel1); pane.add(panel2,BorderLayout.SOUTH); panel1.add(button1); panel1.add(button2); panel1.add(button3); panel2.add(label); ?编译KY7_8.java。 ?编写显示KY7_8.class 的页面文件。 ?使用appletviewer 查看程序结果 2在JFrame 窗口中添加组件 ?程序功能:创建JFrame 窗口,并在其中添加工具栏。 ?准备图片文件:在当前目录下建立一个image 文件夹,存放3 个图片文件,例如 ?PreviousArrow.gif。 ?编写KY7_9.java 程序文件,源代码如下。 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class KY7_9 extends JFrame implements ActionListener JButton button1,button2,button3; JToolBar toolBar; JTextArea textArea; JScrollPane scrollPane; JPanel panel; public static void main(String args) new KY7_9(); public KY7_9() super("带有工具栏按钮的窗口"); addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); button1=new JButton(new ImageIcon("image/PreviousArrow.gif"); button2=new JButton(new ImageIcon("image/go.GIF"); button3=new JButton(new ImageIcon("image/NextArrow.gif"); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); toolBar=new JToolBar(); toolBar.add(button1); toolBar.add(button2); toolBar.add(button3); textArea=new JTextArea(6,30); scrollPane=new JScrollPane(textArea); panel=new JPanel(); setContentPane(panel); panel.setLayout(new BorderLayout(); panel.setPreferredSize(new Dimension(300,150); panel.add(toolBar,BorderLayout.NORTH); panel.add(scrollPane,BorderLayout.CENTER); pack(); show(); public void actionPerformed(ActionEvent e) String s="" if (e.getSource()=button1) s="左按钮被单击n" else if (e.getSource()=button2) s="中按钮被单击n" else if (e.getSource()=button3) s="右按钮被单击n" textArea.append(s); ?编译KY7_9.java。 ?运行KY7_9.class (五)使用自定义对话框与内部类 对话框是GUI 中很常见的窗口对象,有着广泛的应用。对话框和普通窗口最大的不同就是对话框是依附在某个窗口上,一旦它所依附的窗口关闭了,对话框也要随着关闭。Java 提供了Dialog 类用于制作自定义对话框,当需要改变一些数据或需要一个提示窗口时可使用自定义对话框。 ?程序功能:创建一个带有文本区及“对话框”按钮的父窗口,单击“对话框”按钮可打开一个自定义对话框,从中可以定义行和列的数值,关闭对话框其设置的设置 会显示在父窗口的文本区中。 ?编写KY7_10.java 程序文件,源代码如下。 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class KY6_10 extends JFrame implements ActionListener int row=10, col=40; JPanel p1=new JPanel(), p2=new JPanel(); JTextArea ta=new JTextArea("文本区行数:"+row+" 列数:"+col, row, col); JScrollPane scrollPane=new JScrollPane(ta); Button exit=new Button("关闭"); Button dialog=new Button("对话框"); JPanel panel=new JPanel(); KY7_10() setContentPane(panel); setTitle("带有对话框的父窗口"); panel.setPreferredSize(new Dimension(500,200); panel.setLayout(new BorderLayout(); panel.add("Center", p1); panel.add("South", p2); p1.add(scrollPane); p2.add(exit); p2.add(dialog); exit.addActionListener(this); dialog.addActionListener(this); pack(); show(); /setVisible(true); public static void main(String args) new KY7_10(); public void actionPerformed(ActionEvent e) if (e.getSource()=exit) System.exit(0); else MyDialog dlg=new MyDialog(this, true); dlg.show(); class MyDialog extends Dialog implements ActionListener Label label1=new Label("请输入行数"); Label label2=new Label("请输入列数"); TextField rows=new TextField(50); TextField columns=new TextField(50); Button OK=new Button("确定"); Button Cancel=new Button("取消"); MyDialog(KY7_10 parent, boolean modal) super(parent,modal); setTitle("自定义对话框"); setSize(260,140); setResizable(false); setLayout(null); add(label1); add(label2); label1.setBounds(50,30,65,20); label2.setBounds(50,60,65,20); add(rows); add(columns); rows.setText(Integer.toString(ta.getRows(); columns.setText(Integer.toString(ta.getColumns(); rows.setBounds(120,30,90,20); columns.setBounds(120,60,90,20); add(OK); add(Cancel); OK.setBounds(60,100,60,25); Cancel.setBounds(140,100,60,25); OK.addActionListener(this); Cancel.addActionListener(this); public void actionPerformed(ActionEvent e) if(e.getSource()=OK) int row=Integer.parseInt(rows.getText(); int col=Integer.parseInt(columns.getText(); ta.setRows(row); ta.setColumns(col); ta.setText("文本区行数:"+row+" 列数:"+col); show(); dispose(); 编译并运行程序 (六)综合编程 编写程序,实现如下界面: 用户对选择框的操作将引发ItemEvent事件,该事件需要由实现了ItemListener接口的类进行处理;用户对框架的关闭按钮的操作将引发WindowEvent事件,该事件需要由实现了WindowListener接口的类进行处理。