实验 7 建立图形用户界面

一、实验目的
了解图形用户界面基本组件窗口、按钮、文本框、选择框、滚动条等的使用方法,了解如何使用布局管理器对组件进行管理,以及如何使用 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.setLayout(new BorderLayout());//设置边界布局
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=new Panel();
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.awt.event.*;
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("按钮");
add(b);
b.setBounds(60,50,60,40);
b.addActionListener (this); // 注册事件源的动作监听者
}
public void actionPerformed(ActionEvent e) {//实现单击事件接口的方法
Toolkit.getDefaultToolkit ().beep(); //单击事件发生时作出的反应
}
}
• 编译程序KY7_2.java
• 编写显示Applet 的页面文件KY7_3.html
2. 选择复选框和单选框按钮的事件处理程序
• 程序功能:在Applte 上创建复选框、单选框、文本区域、单行文本框等组件,并实现根据用户输入的10 进制数,选择不同选项可转换为2、8、16 进制数。
• 编写KY7_4.java 程序文件,源代码如下。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class KY6_4 extends Applet implements ItemListener {
TextArea area=new TextArea(6,30);//创建文本区
String Item[]={"2 进制","8 进制","16 进制","10 进制"};
Checkbox cb[]=new Checkbox[5];
Checkbox radio[]=new Checkbox[5];
Label l=new Label("输入10 进制数");
TextField TF=new TextField(6);//创建单行文本框
public void init() {
add(l);add(TF);
add(area);
add(new Label(" 请选择进制:"));
for(int i=0; i<4; i++) {
cb[i]=new Checkbox(Item[i]);
add(cb[i]);
cb[i].addItemListener(this);
}
CheckboxGroup cbGroup=new CheckboxGroup();//创建单选框
add(new Label("请选择进制:"));
for(int i=0; i<4; i++) {
radio[i]=new Checkbox(Item[i],cbGroup,false);
add(radio[i]);
radio[i].addItemListener(this);
}
}
public void itemStateChanged(ItemEvent e) {
int x=Integer.parseInt(TF.getText());
if (e.getItem ()=="2 进制")
area.append ("你选择的是"+e.getItem ()+ Integer.toBinaryString(x)+"\n");
if (e.getItem ()=="8 进制")
area.append ("你选择的是"+e.getItem ()+ Integer.toOctalString(x)+"\n");
if (e.getItem ()=="16 进制")
area.append ("你选择的是"+e.getItem ()+Integer.toHexString(x)+"\n");
if (e.getItem ()=="10 进制")
area.append ("你选择的是"+e.getItem ()+x+"\n");
}
}
• 编译程序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.setVisible(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。前者称为抽象窗口工具库AWT(Abstract Windows Toolkit),后者是Java 基础类库JFC(Java Foundation Classes)
的一个组成部分,它提供了一套功能更强、数量更多、更美观的图形用户界面组件。Swing 组件名称和AWT 组件名称基本相同,但以J 开头,例如AWT 按钮类的名称是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();
}
}
}
• 编译并运行程序
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值