文档章节

Java图形用户接口

超人学院
 超人学院
发布于 2016/08/08 16:45
字数 2588
阅读 47
收藏 1

Java图形用户接口

对一个优秀的应用程序来说,良好的图形用户接口是必不可少的。缺少良好的图形用户接口,将会给用户理解和使用应用程序带来很多不便。很难想象用户为了学会使用一个应用程序,去记一大堆命令。Java提?copy;了生成一个良好的图形用户接口所需要的一?copy;基本元件:面板(Panel?copy;、按钮(Button?copy;、标?copy;(Label?copy;、画板(Canvases?copy;、滚动条(Scrollbar?copy;、列表框(List?copy;、文本域(TextField?copy;、文本区(TextArea?copy;。

6.1面板

面板提?copy;了建立应用程序的空间。你可以把图形元件(包括其他面板?copy;放在一个面板上。Applet类提?copy;了一个基本的面板。

6.1.1布局管理

Java提?copy;了几种布局:顺序布局(FlowLayout?copy;、边界布局(BorderLayout?copy;和网格布局(GridLayout?copy;。

6.1.1.1顺序布局

顺序布局(FlowLayout?copy;是最基本的一种布局,面板的缺省布局就是顺序布局。顺序布局指的是把图形元件一个接一个地?reg;平地放在面板上。下面是一个顺序布局的例子:

importjava.awt.*;importjava.applet.Applet;

publicclassmyButtonsextendsApplet{Buttonbutton1,button2,button3;publicvoidinit(){button1=newButton("确定");button2=newButton("打开");button3=newButton("关闭");add(button1);add(button2);add(button3);}}

该程序生成的布局如下:

图6.1

6.1.1.2边界布局

边界布局包括五个区:北区、南区、东区、西区和中区。这几个区在面板上的分布规律是“上北下南,左西右东”。下面是一个边界布局的例子:

importjava.awt.*;importjava.applet.Applet;

publicclassbuttonDirextendsApplet{

ButtonbuttonN,buttonS,buttonW,buttonE,buttonC;

publicvoidinit(){setLayout(newBorderLayout());buttonN=newButton("?reg;");buttonS=newButton("火");buttonE=newButton("木");buttonW=newButton("金");buttonC=newButton("土");add("North",buttonN);add("South",buttonS);add("East",buttonE);add("West",buttonW);add("Center",buttonC);}}

下面是该程序运行的结果:

图6.2

6.1.1.3网格布局

网格布局把面板分成一个个的网格,你可以给出网格的行数和列数。下面是一个网格布局的例子:

importjava.awt.*;importjava.applet.Applet;

publicclassbuttonGridextendsApplet{Buttonbutton1,button2,button3,button4,button5,button6,button7,button8;

publicvoidinit(){setLayout(newGridLayout(4,2));button1=newButton("乾");button2=newButton("坤");button3=newButton("艮");button4=newButton("震");button5=newButton("坎");button6=newButton("离");button7=newButton("巽");button8=newButton("兑");add(button1);add(button2);add(button3);add(button4);add(button5);add(button6);add(button7);add(button8);}}

下面是该程序运行的结果:

图6.3

6.2按钮

6.2.1按钮事件

用户点一下按钮,就会有一个按钮事件发生。你可以通过覆盖一个applet的action成员函数来捕捉按钮事件。

publicbooleanaction(Evente,Objecto){if(e.targetinstanceofButton){system.out.println((string)o);}else{System.out.println("Non-buttonevent");}returntrue;}

6.2.2按钮类型

Java提?copy;了标准的按压式按钮,同时也提?copy;了选择式按钮和标记式按钮。

6.2.2.1选择式按钮

选择式按钮提?copy;了从几个选项中选一个选项的功能。下面是从几个市中选一个市的例子,市名放在选择式按钮中:

CityChooser=newChoice();

CityChooser.addItem("北?copy;");CityChooser.addItem("上海");CityChooser.addItem("天津");

add(CityChooser);

图6.4

6.2.2.2标记式按钮

标记式按钮的状态作为标记框事件的对象参数返回。下面是一个标记式按钮的例子:

CheckboxfillStyleButton;fillStyleButton=newCheckbox("Solid");

publicbooleanaction(Evente,Objectarg){if(e.targetinstanceofCheckbox){System.out.println("Checkbox:"+arg);}returntrue;}

图6.5

6.2.2.3按键式按钮

按键式按钮是一组按钮,用户可以选中其中一个,同时这一组中的其他按钮将被关闭。下面是一个按键式按钮的例子:publicclassCheckBoxextendsApplet{CheckboxGroupcbg;

publicvoidinit(){cbg=newCheckboxGroup();add(newCheckbox("one",cbg,true));add(newCheckbox("two",cbg,false));add(newCheckbox("three",cbg,false));}}

图6.6

6.2.3自包含按钮

Java语言的面向对象特性使我们能够创建完全自包含的按钮。在自包含按钮里,你可以在?copy;展按钮类里建立事件控制函数。下面是一个自包含按钮的例子:

importjava.awt.*;importjava.applet.Applet;

classokButtonextendsButton{

publicokButton(){setLabel("Ok");}

publicbooleanaction(Evente,Objectarg){System.out.println("OKButton");returntrue;}}

publicclassbuttontestextendsApplet{okButtonmyOkButton;

publicvoidinit(){myOkButton=newokButton();add(myOkButton);}}

图6.7

6.3标?copy;

标?copy;是一种放到面板上的静止的正文。下面是一个标?copy;的例子:importjava.awt.*;importjava.applet.Applet;

publicclasslabelextendsApplet{

publicvoidinit(){setLayout(newFlowLayout(FlowLayout.CENTER,10,10));Labellabel1=newLabel("你好!");Labellabel2=newLabel("另一个标?copy;");add(label1);add(label2);}}

下面是运行结果:

图6.8

6.4列表框

列表框使用户易于操作大量的选项。创建列表框的方法和Choicebutton有?copy;相似。列表框的所有条目都是可见的,如果选项很多,超出了列表框可见区的范围,则列表框的旁边将会有一个滚动条。首先,创建列表框:Listl=newList(4,false);这个成员函数创建了一个显示4行的列表框。第二个参数“false"表示这个列表框是单选的,如果是“true",则表示是多选的。下面增加列表框的选项:

l.addItem("北?copy;大学");l.addItem("清华大学");l.addItem("吉林大学");l.addItem("复?copy;大学");l.addItem("南开大学");l.addItem("天津大学");l.addItem("南?copy;大学");add(l);

图6.9

6.4.1在列表框中进行选择

可以用成员函数getSelectedItem()或getSelectedItems()来接收在列表框中被选的选项。在单选列表框里,“双击”一个选项就可以触发一个可被action()成员函数捕捉到的事件。publicbooleanaction(Evente,Objectarg){...if(e.targetinstanceofList){System.out.println("Listentry:"+arg);}...}

6.4.2多选列表框

对于多选列表框,要使你的选择产生作用,需要使用其他的外部事件。例如,你可以使用按钮事件:

图6.10

publicbooleanaction(Evente,Objectarg){...if(e.targetinstanceofButton){...if("Ok".equals(arg)){string[]selected;selected=l.getSelectedItems();for(intI=0;I<selected.length;I++){System.out.println(selected[i]);}}}}

6.5文本域

文本域一般用来让用户输入象姓名、信用卡号这样的信息,它是一个能够接收用户的键盘输入的小块区域。

6.5.1创建文本域

在创建文本域时,有四种类型?copy;你选择:空的、空的并且具有指定长度、带有初始文本内容的和带有初始文本内容并具有指定长度的。下面是生成这四种文本域的代码:

TextFieldtf1,tf2,tf3,tf4;

//空的文本域tf1=newTextField();//长度为20的空的文本域tf2=newTextField(20);//带有初始文本内容的文本域tf3=newTextField("你好");//带有初始文本内容并具有指定长度的文本域tf4=newTextField("你好",30);add(tf1);add(tf2);add(tf3);add(tf4);

图6.11

6.5.2文本域事件

当用户在文本域里敲“回车”键时,就产生了一个文本域事件。象其他事件一样,你可以以在成员函数action()中捕捉到这个事件。

publicbooleanaction(Evente,Objectarg){...if(e.targetinstanceofTextField){System.out.println("TextField:"+arg);}...}

6.6文本区

文本区可以显示大段的文本。

6.6.1创建文本区

与文本域类似,创建文本区时也有四种类型?copy;选择,但如果指定文本区的大小,必须同时指定行数和列数。

TextAreata1,ta2;//一个空的文本区ta1=newTextArea();

//一个带有初始内容、大小为5x40的文本区ta2=newTextArea("你好!",5,40);

可以用成员函数setEditable()来决定用户是否可对文本区的内容进行编辑。

//使文本区为只读的ta2.setEditable(false)

图6.12

6.6.2接收文本区的内容

可以用成员函数getText()来获得文本区的当前内容。例如:System.out.println(ta1.getText());文本区本身不产生自己的事件。但你可以用外部事件来接收文本区的内容:

publicbooleanaction(Evente,Objecto){if(e.targetinstanceofButton){if("send".equals(o)){StringtextToSend=ta1.getText();System.out.println("sending:"+textTosend);mySendFunction(textToSend);}}else{...}}

6.7画板

画板能够捕捉到?copy;露事件、鼠标事件和其他类似的事件。基本的画板类不处理这?copy;事件,但你可以?copy;展它来创建有你所需功能的画板类。

6.7.1创建画板

importjava.awt.*;importjava.applet.Applet;

publicclasssuperGUIextendsApplet{...myCanvasdoodle;...publicvoidinit(){...//建立我们的画板doodle=newmyCanvas();doodle.reshape(0,0,100,100);leftPanel.add("Center",doodle);...}}

classmyCanvasextendsCanvas{publicvoidpaint(Graphicsg){g.drawRect(0,0,99,99);g.drawString("Canvas",15,40);}}

6.7.2画板事件

你可以覆盖一般的事件处理成员函数。下面是一个包含了mouseDown事件处理的例子:

importjava.awt.*;importjava.applet.Applet;

publicclasscanvasextendsApplet{

Buttonb1;

publicvoidinit(){//SetourlayoutasaBorderstylesetLayout(newBorderLayout(15,15));b1=newButton("Test");myCanvasc1=newmyCanvas(100,100);//addthecanvasandthebuttontotheappletadd("Center",c1);add("South",b1);}

publicbooleanaction(Evente,Objectarg){System.out.println("Event:"+arg);returntrue;}

publicbooleanmouseDown(Evente,intx,inty){System.out.println("Mouseworks:("+x+","+y+")");returntrue;}}

classmyCanvasextendsCanvas{privateintwidth;privateintheight;

publicmyCanvas(intw,inth){width=w;height=h;reshape(0,0,w,h);}

publicvoidpaint(Graphicsg){g.setColor(Color.blue);g.fillRect(0,0,width,height);}

publicbooleanmouseDown(Evente,intx,inty){if((x<width)&&(y<height)){System.out.println("Canvasmouseworks:("+x+","+y+")");returntrue;}returnfalse;//NotourmouseDown}}

6.8滚动条

在某?copy;程序中,需要调整线性的值,这时就需要滚动条。滚动条提?copy;了易于操作的值的范围或区的范围。

6.8.1创建滚动条

当创建一个滚动条时,必须指定它的方向、初始值、滑块的大小、最小值和最大值。

publicScrollbar(intorientation,intinitialValue,intsizeOfSlider,intminValue,intmaxValue);

下面是一个例子:

ScrollbarredSlider;publicvoidinit(){redSlider=newScrollbar(Scrollbar.VERTICAL,0,1,0,255);add(redSlider);}

图6.13

6.8.2滚动条事件

和其他接口元件一样,滚动条产生一个你可以控制的事件,但和其他事件不同,你必须直接使用成员函数handleEvent(),而不能使用成员函数action().

publicbooleanhandleEvent(Evente){if(e.targetinstanceofScrollbar){System.out.println("Scrollbar:"+((Scrollbar)e.target).getValue());returntrue;}returnsuper.handleEvent(e);}

6.8.3滚动条的值的显示

如果你想显示滑块所在位置的值,需要加一个自己的文本域。下面是一个例子。

importjava.awt.*;importjava.applet.Applet;

publicclassredSliderextendsApplet{Scrollbarredslider;TextFieldredvalue;Labelredlabel;

publicvoidinit(){setLayout(newGridLayout(1,3));redslider=newScrollbar(Scrollbar.HORIZONTAL,0,1,0,255);redvalue=newTextField("0",5);redvalue.setEditable(false);redlable=newLabel("Red(0-255)");add(redlabel);add(redslider);add(redvalue);}

publicbooleanhandleEvent(Evente){if(e.targetinstanceofScrollbar){redvalue.setText(Integer.toString(((Scrollbar)e.target).getValue()));returntrue;}returnsuper.handleEvent(e);}

publicbooleanaction(Evente,Objectarg){System.out.println("Event"+arg);returntrue;}}

图6.14

本章小结

1.Java提?copy;了生成一个良好的图形用户接口所需要的一?copy;基本元件:面板(Panel?copy;、按钮(Button?copy;、标?copy;(Label?copy;、画板(Canvases?copy;、滚动条(Scrollbar?copy;、列表框(List?copy;、文本域(TextField?copy;、文本区(TextArea?copy;。2.大部分元件都有自己的事件,你可以捕捉并处理它们。

了解更多详情请登录超人学院网站http://www.crxy.cn或者每周日晚八点半相约免费公开课 https://ke.qq.com/course/53102#term_id=100145289  具体详情请联系QQ2435014406

© 著作权归作者所有

上一篇: 多线程
下一篇: Java的类
超人学院
粉丝 114
博文 335
码字总数 388917
作品 0
昌平
CTO(技术副总裁)
私信 提问
龙博方案网Big Faceless Java图形展现控件详细介绍及下载

Graph Library 是用于以Java创建图形和图表的Java类库。它使用全三维模式,可在 PNG、Flash、PDF或 SVG 中绘制二维或阴影型三维饼图、折线图、条形图等。使用 JSP 标签库 (JSP Tag Library) ...

javascript1
2014/05/16
206
0
UAVStack功能上新:新增JVM监控分析工具

UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据;同时提供JVM基本参数获取、内存dump、线程分析、内存分配采样和热点方法分析等功能。 引言 作为...

宜信技术学院
10/15
1K
0
[转]五个免费开源的数据挖掘软件

Orange Orange 是一个基于组件的数据挖掘和机器学习软件套装,它的功能即友好,又很强大,快速而又多功能的可视化编程前端,以便浏览数据分析和可视化,基绑定了 Python以进行脚本开发。它包...

红薯
2010/12/14
20.4K
8
JAVA基础再回首(二十七)——JAVA中的图形化界面、GUI概述、简单的窗体创建、事件监听机制、动作事件、GUI布局、鼠标事件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52719838 JAVA基础再回首(二十七)——JAVA中的图形化界面、GUI概述、简单的窗体创...

Aduroidpc
2016/10/02
0
0
3D引擎--可移植到Android的开源的引擎

随着android在全球的风靡,越来越多的人将自己的目光投向搭载android的移动设备,但由于手持设备的局限性,怎样利用有限的资源来达到很好的体验,是设备厂商必须要考虑的问题,其中炫目的界面...

长平狐
2012/08/29
12.2K
6

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部