建立图形用户界面 JAVA实验

实验 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();
}
}
}
¨编译并运行程序

工业互联网:制造业与新一代信息技术融合发展的关键
空调不制冷的原因
SIG开发者大会:PLDA公司推出Gen4SWITCH PCIe4.0开发套件(PDK)
未来智能魔镜显示屏将完美融入日常的家居生活
CYZT-9032开关柜状态指示器
建立图形用户界面 JAVA实验
工程师队伍体现出的技术发展之殇
维谛UPS电源常见告警及处理办法
测量投影仪特点_测量投影仪测量方法
干扰滤波器的种类_干扰滤波器怎么装
投影机色彩数
场效应管(MOSFET)检测方法与经验
WAIC 2023:英特尔以技术之力推动边缘人工智能发展,打造数字化未来“芯”时代
充电桩充电技术种类和建设要求有哪些
半导体晶片湿蚀工艺的浮式数值分析
上拉电阻和下拉电阻的用处和区别
华为P20渲染图曝光:异形全面屏+麒麟970
NI建议将LabVIEW NXG用于使用传感器或执行器测量物理系统
Linear推出高效率,4MHz同步降压型稳压器LTC361
国家电网服务国家重大战略实施:彰显央企脊梁作用