开发java图形用户界面面有哪些方法

图形用户界面编程&java
第7章&图形用户界面编程&
授课班级:P03计1、2、5,D04选8、11,W02选&
授课时间:05年10月17日—10月21日&
授课周次、学时:第八周,2学时&&&&&&&&&&&&&&&&&
&&&&&&&&&&&图形用户界面是程序与用户交互的窗口。每个图形界面下的&Java&程序都必须设计和建立自己的图形用户界面并利用它接受用户的输入,向用户输出程序运行的结果。用户界面功能是否完善,使用是否方便,将直接影响到用户对应用软件的使用。因此,构造和设计用户界面,是软件开发中的一项重要工作。&
什么是图形用户界面(GUI)&?&&
它具有什么功能?&
GUI是英文&Graphic&User&Interface&的简&
称,中文意思是图形用户界面&(接口)。&
如果&你要使&Java&程序具有绘制图形的功&
能,那么你就要使用GUI&。通过GUI可以&
画线、画矩型、画圆等基本图形,并且能&
创建按钮、标签、列表框等与用户进行交&
互的组件,使用户方便地建立自己的图形&
用户界面。&
通过这个界面可使用户方便地向计算机系统发出&
命令,启动操作,并将程序运行的结果以图形的&
方式显示出来。使程序的整体运行操作简便、形&
象动人、富于渲染,因此,GUI&很受广大用户&
的欢迎,目前,已经成为应用软件的设计标准之&
一。&&&&&&&&
&&&&&&&GUI是由软件包&Java&.awt&来实现的。&
它包含生成图形用户界面的各种类和方法。&
2.什么是&awt&包?&
随着图形用户界面的普及和界面元素标准化程度的提高,许多辅助设计和实现图形用户界面的方法和工具相应出现。这免除了开发人员的编程负担,目前许多应用软件的开发工具都具有可视化编程的功能。其中,Java&.awt包就是为了方便图形用户界面的开发设计了专门的类库来生成各种标准图形用户界面元素和处理图形界面的各种事件。&
Awt类库中的各种操作被定义成在一个并不存在的“抽象窗口”中进行,使开发人员所设计的界面独立于具体的界面,可适应于所有的平台系统。&
3.图形用户界面的构成:图形用户界面是一组图形界面成分和界面元素的有机组合,这些成分和元素之间不但外观上有着包含、相邻、相交等物理关系,内在的也有包含、调用等逻辑关系共同组成一个能响应特定事件、具有一定功能的图形用户界面系统。
4.图形用户界面各种元素的分类&
Java中图形用户界面各种元素和成分可分为三类:&
⑴容器:容器是用来组织其他界面成分和元素的单元,一般一个应用程序的图形用户界面首先应对应于一个复杂的容器,如一个窗口。在这个窗口内将包含许多界面成分和元素,而且这些界面元素也可能又是一个容器。&
容器的引入有利于分解图形用户界面的复杂性。&
⑵控制组件&
控制组件是图形用户界面的最小单位之一,它里面不再包含其他的成分。&
控制组件的作用是完成与用户的一次交互,如:接受用户的一个命令;接受用户的一个文本或选择输入用户显示一个文本或一个图形等等。&
目前常用的控制组件有:&
选择类的单选按钮、复选按钮、下拉列表;&
文字处理类的文本框、文本区域;&
命令类的按钮、菜单等。&
使用控制组件通常需要以下步骤:见P184&
⑶用户自定义成分&
编程人员还可以根据用户的程序设计的需要设计一些自定义的图形界面成分,如:几何图形、使用标志图案等。以起到装铈、美化的作用,而不能响应用户的的动作,也不能交互。&
图形用户界面核心概念&
容器---可以容纳GUI部件(按某种布局)&&
&&&&----窗体&、面板&&
图形用户界面核心概念---创建窗体&
Frame&&f=new&&Frame(“标题“)&
图形用户界面核心概念&
创建文本框、按钮、标签&
TextField&x=new&TextField(10);&&
Button&b=new&&Button(“ok”);&
Label&&dis=new&&Label(“hint…”);&
图形用户界面核心概念
—&&&给容器中加入部件&
setLayout(new&FlowLayout())&
图形用户界面核心概念&
事件处理&------委托事件处理模型&
事件委托处理—图&
委托事件处理---过程&
图形用户界面核心概念&
布局管理---FlowLayout(流式布局)&&
布局管理---BorderLayout(边缘或方位布局)&&
布局管理---BorderLayout(边缘或方位布局)&&
布局管理---GridLayout布局&&
布局管理---GridLayout构造方法&
&&&GridLayout布局—加入组件&
布局管理---CardLayout布局&&
CardLayout布局---卡片翻动&
Component类(抽象类)&
文本框(TextField)&
文本框(TextField)---事件&
文本域(TextArea)&
1.&&选择事件&(ItemEvent)类&&
public&ItemSelectable&getItemSelectable()&&
public&Object&getItem()&&
public&int&getStateChange()&&
&&返回值:&
&&ItemEvent.SELECTED&:&代表选项被选中。&&
&&ItemEvent.DESELECTED&:代表选项被放弃不选。&
2.复选按钮&(Checkbox)&&
⑴&举例&:&Checkbox&backg&=&new&Checkbox("背景色&");&&
⑵&常用方法&&
boolean&getState()&:&获取复选按钮的选中状态,返回true代表按钮被选中&&
void&setState(boolean&value)&:设置复选按钮的状态,vlaue为true表示选中。&&
⑶&事件响应&&
itemStateChanged(ItemEvent&e)方法&
通过&e.getItemSelectable()获得事件源对象引用&
调用getState()获取事件&源对象的状态。&
例7-11&&一个简单的多选题练习程序&
例7-11&&一个简单的多选题练习程序&&
import&java.awt&.*;&import&java.applet&.*;&import&java.awt.event.*&;&&
public&class&FuXuan&extends&Applet&&implements&ActionListener&&{&&
&&&&String&question[]={"Java&&test&question1\n&A.&choice1\n&B.choice2\n&C.choice3"&,"Java&&test&question2\n&A.&good\n&B.&bad\n&C.&luck"};&
&&&&String&ch[]={"A","B","C"};&&&
&&&&String&answer[]={"AB","BC"};&&
&&&&Checkbox&cb[]=new&Checkbox[3];&&&
&&&&Label&&&TextArea&&&int&bh=0;&&
&&&&Button&ok,next,&&&&
public&void&init()&{&&
&&&&&setLayout(new&BorderLayout());&&
content&=new&TextArea(10,50);&add("Center",content);&&
content.setText(question[bh]);&&&
&&&&Panel&p=new&Panel();&&
p.setLayout(new&GridLayout(2,1));&&
&&&&Panel&p1=new&Panel();&&&
for&(int&i=0;i&ch.i++&)&{&
&&&&&&&cb[i]&=&new&&Checkbox(ch[i]);&&p1.add(cb[i]);&&&&}&&
&&&&p.add(p1);&Panel&p2=new&Panel();&&
&&&&ok=new&Button("&确定&");&
&&&&p2.add(ok);&hint=new&Label("&对错提示");&p2.add(hint);&next=new&Button("&下一题&");&&p2.add(next);&previous=new&Button("&上一题&");&p2.add(previous);&&
p.add(p2);&add("South",p);&&&next.addActionListener(this);&&
previous.addActionListener(this);&&
ok.addActionListener(this);&&&
public&void&actionPerformed(ActionEvent&e)&{&
if&(e.getSource()==ok)&{
&&&String&s="";&&
&&&for&(int&i=0;i&ch.i++&)&&
&&&&&&if&(cb[i].getState())&&
&&&&s=s+cb[i].getLabel();&&
&&&&&&&&&if&(s.equals(answer[bh]))&&
&&&&&&&&&&&hint.setText("对");&&&&&
&&&&&&&&else&&
&&&&&&&&&&&&hint.setText("错");&&
&&&}&else&if&(e.getSource()==next)&{&&&&
&&&&&&&&if&(bh&question.length-1)&&
&&&&bh++;&&
&&&&&&&&&content.setText(question[bh]);&&
}&else&{&&&&&
&&&&&&&&&if&(bh&0)&&
&&&&&&&&bh--;&&
&&&&&content.setText(question[bh]);&&
&}&&&&}&}&&
3.&单选按钮(CheckBoxGroup)&&
使用复选框组,可以实现单选框的功能。例如:&&
&&&&CheckboxGroup&style&=&new&CheckboxGroup();&&
&&&&Checkbox&p&=&new&Checkbox("普通&",&true,&style);&&
&&&&Checkbox&b&=&new&Checkbox("黑体&",&false,&style);&&
&&&&Checkbox&i&=&new&Checkbox("斜体&",&false,&style);&
【注意】把CheckboxGroup加入容器时必须将每个Checkbox对象逐一加入容器,不能使用CheckboxGroup对象一次性加入。&&&
事件编程处理&
每个单选按钮要单独注册监听者&
在事件处理代码中通过CheckboxGroup的对象的getSelectCheckbox()方法可获取当前被选中的选项按钮对象,要设置选项按钮i为选中状态可通过方法setSelectedCheckbox(i)。&
选项按钮的其他方法:&
getLabel()方法可获取选项按钮的标识&
getState()可判选项按钮对象是否选中。&
setState()设置某个单选按钮为选中状态。&&
例7-12&用单选按钮控制画笔的颜色&&
import&java.awt&.*;&&
import&java.applet&.*;&&
import&java.awt.event.*&;&&
public&class&ChangeColor&extends&Applet&implements&ItemListener&{&&
String&des[]={"红色","兰色","绿色","白色","灰色"};&&
&&Color&c[]={Color.red,Color.blue,Color.green,Color.white,Color.gray};&&
&&Color&drawColor=Color.&&
public&void&init()&{&&
&&&&CheckboxGroup&style&=&new&CheckboxGroup();&&&&&&
&&&&for&(int&i=0;i&des.i++&)&{&&
&&&&&&&Checkbox&one=new&Checkbox(des[i],false,style);&&
&&&&&&&one.addItemListener(this);&&
&&&&&&&add(one);&&
public&void&paint(Graphics&g)&{&&
&&&&g.setColor(drawColor);&&
&&&&g.setFont(new&Font("变色字",&Font.BOLD,24));&&
&&&&g.drawString("变色字",80,80);&&
根据选择的按钮设置drawColor的颜色值&
public&void&itemStateChanged(ItemEvent&e){&&
&&&&&Checkbox&temp=(Checkbox)e.getItemSelectable();&&
&&&&&for&(int&i=0;i&des.length&;&i++)&&{&&
&&&&&&&&if&(temp.getLabel()==des[i])&{&&
&&&&&&&&&&&drawColor=c[i];&&&
&&&&&&&&&&&repaint();&&
&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&&&}&&&}&&}&
4.下拉列表(Choice)&&
“多选一”控件&&
下拉列表是作为一个整体加入到容器,各个列表元素不是独立的操作对象。&
下拉列表也是产生ItemEvent类的选择事件&
对下拉列表的选项值的判定处理有两种方法可供选择:一种是根据选项在列表中的序号,即通过getSelectedIndex()方法;另一种是通过getSelectItem()方法获取列表项对应的字符串&。&
相关方法:&
select(int&index)和select(String&item):强制将某列表项定为选中状态;&
add(String&item)&和insert(String&item,int&index):添加新元素到列表中&
remove(int&index)和&remove(String&item):删除某个列表元素&
removeAll():删除所有元素。&
例7-13&&用下拉列表控制Applet的背景变化&&
import&java.awt&.*;&&
import&java.applet&.*;&&
import&java.awt.event.*&;&&
public&class&ChangeColor2&extends&Applet&implements&ItemListener{&
&&&String&des[]={"红色","兰色","绿色","白色","灰色"};&
&&&Color&c[]={Color.red,Color.blue,Color.green,Color.white,Color.gray};&
&&&public&void&init()&{&
&&&&&Choice&color&=&new&Choice();&
&&&&&for&(int&i=0;i&des.i++&)&&&color.add(des[i]);&
&&&&&color.addItemListener(this);
&&&&&add(color);&
例7-13(续)&
public&void&itemStateChanged(ItemEvent&e){&
&&&&&&Choice&temp=(Choice)e.getItemSelectable();&
&&&&&&for&(int&i=0;i&des.length&;&i++)&{&
&&&&&&&&&if&(temp.getSelectedIndex()==i)&{&&&&&&&&&&&&setBackground(c[i]);&
&&&&&&&&&&
5.&列表(List)&&
列表与下拉列表的区别有两点:&
&&&一是列表可以在屏幕上看到一定数目的选择项,而下拉列表只能看到一项;&&&另一点用户可能允许同时选择列表中的多项,而下拉列表只能选一项。&&
&MyList&=&new&List(4,&true);&&
给列表添加选项用add方法&
下拉列表的方法均可用于列表对象,另外,由于列表支持多选,因此,列表中还提供有getSelectItems()方法和getSelectedIndexs()方法,它们返回的均是数组,分别代表哪些选中的选项的字符串和序号。&&
列表可以产生两类事件:&
ItemEvent类选择事件,当单击某选项时触发。&&
ActionEvent类动作事件。当双击某选项触发。&
&&&&值得注意的是,双击事件不能覆盖单击事件,当用户双击一个选项时,首先产生双击、然后产生单击。&
例7-14&&假设有一个发文系统,需要将一份文件发给多个单位&&
import&java.applet.*;&&
import&java.awt.*;&&
import&java.awt.event.*;&&
public&class&TestList&extends&Applet&&
implements&ActionListener,ItemListener&{&&
&&List&myL&&
&&Label&&&
&&String&unit[]={"总务处","教务处","工会","科研处","信息学院","机械学院"};&&
public&void&init()&&{&&
&&&&myList&=&new&List(5,true);&&
&&&&for&(int&i=0;i&unit.i++)&&
&&&&&&&myList.add(unit[i]);&&&&
&&&&add(myList);&&&&&
&&&&myList.addActionListener(this);&&
&&&&myList.addItemListener(this);&&
public&void&actionPerformed(ActionEvent&e)&{&&
&&&&if(e.getSource()==myList)&&
&&&&&&&&showStatus("您双击了选项"+e.getActionCommand());&&
public&void&itemStateChanged(ItemEvent&e)&&{&&
&&&&&String&sList[];&&
&&&&&String&str&=&"";&&
&&&&&List&temp&=&(List)(e.getItemSelectable());&&
&&&&&sList&=&temp.getSelectedItems();&&
&&&&&for(int&i=0;i&sList.i++)&&
&&&&&&&&str&=&str&+&sList[i]&+&"&";&&
&&&&&&&showStatus("您选择了选项:"+str);&&&}&
1、创建滚动条&&
滚动条按方向分垂直和水平两种。例如,以下代码创建一个水平滚动条:&&
Scrollbar&mySlider&=&new&Scrollbar(Scrollbar.HORIZONTAL,0,1,0,255);&&
有关说明:&&
(1)第1个参数为常量,代表水平滚动条,如果是垂直滚动条,则为Scrollbar.VERTICAL;&&
(2)第2个参数代表为初始值;&&
(3)第3个参数代表滚动条的滑块长度;&&
(4)第4、5个参数分别代表滚动条的最小和最大值,由于滚动条滑块要占一定宽度,所以滚动条的实际最大值=最大值-滑块长度。&&&&
2、滚动条的事件处理&&
&&&&&AdjustmentEvent(调整值变化事件)是在滚动条滑块移动时引发。在滚动条上可通过多种操作来改变其滑块位置,例如:用户可以拖动滚动条的滑块,点击块增量区或上、下三角按钮均会导致滑块的变化,而且移动的步长不同,按Page&Up和Page&Down键也相当于点击滚动条的块增量区&
使用addAdjustmentListener()方法给滚动条注册监听者,监听者要求实现AdjustmentListener接口,该接口中包含如下方法:&&
public&void&adjustmentValueChanged(AdjustmentEvent&e)&&&
&&&&&&&滚动条编程的要点是对滚动条所代表的值的获取与设置,如下方法分别用来获取和设置滚动条的当前值:&&
&public&int&getValue()&&
public&void&setValue(int&newValue)&&
&&&&&如下方法获取事件源和引起值变化的调整类型:&&
Adjustable&getAdjustable()&&
&&&返回引发状态变化的事件源对象。&&
int&getAdjustmentType()&&
&&&&返回引发状态变化事件的调整类型&
调整类型值可通过以下常量进行判断。&
AdjustmentEvent.BLOCK_DECREMENT&&&点击下方引取下移&&
AdjustmentEvent.BLOCK_INCREMENT&&&上移&&
&AdjustmentEvent.TRACK&&&&&&&&&&&&&拖动滑块&&
AdjustmentEvent.UNIT_DECREMENT&&&&点击下三角按钮&&
AdjustmentEvent.UNIT_INCREMENT&&&&点了上三角按钮&&
设定和获取滚动条滑块的移动增量值&
void&setUnitIncrement(int)&&&//指定单位增量&&
void&setBlockIncrement(int)&&//指定块增量&&
int&getUnitIncrement()&&&&&&//获取单位增量&&
int&getBlockIncrement()&&&&&//获取块增量&&
例7-15&&利用滚动条设计一个调色控制板用来调整任意部件的颜色&&
import&java.applet.*;&&
import&java.awt.*;&&
import&java.awt.event.*;&&
class&colorBar&extends&Scrollbar&{&&
public&colorBar()&{&&
&&super(Scrollbar.HORIZONTAL,0,40,0,295);&&
&&&&&&this.setUnitIncrement(1);&&
&&&&&&this.setBlockIncrement(50);&&
class&ColorPanel&extends&Panel&implements&AdjustmentListener&{&&
&&&&Scrollbar&redSlider&=&new&colorBar();&&&
&&&&Scrollbar&greenSlider&=&new&colorBar();&&
&&&&Scrollbar&blueSlider&=&new&colorBar();&&
&&&&Canvas&mycanvas&=&new&Canvas();&&
&&&Color&&&&
public&ColorPanel()&{&&
&&&Panel&x=new&Panel();&&
&&&&&&x.setLayout(new&GridLayout(3,2,1,1));&&&
&&&&&&&x.add(new&Label("red"));&x.add(redSlider);&&
&&&&&&&x.add(new&Label("green"));&x.add(greenSlider);&&
&&&&&&&x.add(new&Label("blue"));&x.add(blueSlider);&&
&&&&&&&setLayout(new&GridLayout(2,1,5,5));&&&
&&&&&&add(mycanvas);&&
&&&add(x);&&
&&&&&&&redSlider.addAdjustmentListener(this);&&&
&&&&&&&greenSlider.addAdjustmentListener(this);&&
&&&&&&&blueSlider.addAdjustmentListener(this);&&
&&&&public&void&adjustmentValueChanged(AdjustmentEvent&e)&{&&
&&&&&&&int&value1,value2,value3;&&
&&&&&&&&value1&=&redSlider.getValue();&&
&&&&&&&&value2&=&greenSlider.getValue();&&
&&&&value3&=&blueSlider.getValue();&&
&&&&&&&&color=&new&Color(value1,value2,value3);&&
&&&&&&&&mycanvas.setBackground(color);&&
public&class&TestSlider&extends&Applet&&
&&&public&void&init()&{&&
&&&&&&setLayout(new&BorderLayout());&&
&&&&&&add("Center",new&ColorPanel());&&
鼠标事件&&
&&&&共有7种情形,用&MouseEvent类的同名静态整型常量标志,&分别是MOUSE_DRAGGED、MOUSE_ENTERED、MOUSE_EXITED、MOUSE_MOVED、MOUSE_PRESSED、MOUSE_RELEASED、MOUSE_CLICKED&
鼠标事件的处理接口&
MouseListener&&
&&&负责接收和处理鼠标的press(按下)、release(释放)、click(点击)、enter(移入)和exit(移出)动作触发的事件;&&
MouseMotionListener&&
&&&负责接收和处理鼠标的move(移动)和drag(拖动)动作触发的事件。&&
MouseEvent类&
public&int&getX()&:返回发生鼠标事件的&X坐标。&&
&public&int&getY()&:返回发生鼠标事件的&Y坐标。&&
public&Point&getPoint()&:返回&Point对象,也即鼠标事件发生的坐标点。&&
public&int&getClickCount()&:返回鼠标点击事件的连击次数。&&
一个鼠标位置跟踪程序,在当前位置画红色小圆&&
&&&&import&java.applet.A
import&java.awt.*;
import&java.awt.event.*;
public&class&&extends&Applet&implements&MouseMotionListener&{
&&private&static&final&int&RADIUS&=&7;
&&private&int&posx=10,posy=10;
&&public&void&init()&{
&&&&addMouseMotionListener&(this);
一个鼠标位置跟踪程序,在当前位置画红色小圆&(续1)&
public&void&paint(Graphics&g)&{
&&&&&//在鼠标位置画红色小圆
&&&&g.setColor(Color.red);
&&&&g.fillOval(posx-RADIUS,&posy-RADIUS,&RADIUS&*&2,&RADIUS&*&2);&
一个鼠标位置跟踪程序,在当前位置画红色小圆&(续2)&
&&&public&void&mouseMoved(MouseEvent&event)&{
&&&&&&posx&=&event.getX();
&&&&&&posy&=&event.getY();
&&&&&&repaint();
&&&public&void&mouseDragged(MouseEvent&event)&{&}
键盘事件&&
&包含&3个,分别对应&KeyEvent类的几个同名的静态整型常量KEY_PRESSED、&KEY_RELEASED、KEY_TYPED。&
监听者接口是KeyListener&&
public&void&keyPressed(KeyEvent&e)&&
&&&&某个键按下时执行。&&
public&void&keyReleased(KeyEvent&e)&&&
&&&&某键被释放时执行。&&
&public&void&keyTyped(KeyEvent&e)&&
&&&&按键被敲击。&&
&&KeyTyped包含keyPressed和KeyRelased两个动作&
小方框变色和移动&
&&&&import&java.awt.*;&import&java.awt.event.*;
import&java.applet.A
public&class&KeyboardDemo&extends&Applet&implements&KeyListener{
&&static&final&int&SQUARE_SIZE&=&20;
&&Color&squareC&&int&squareTop,&squareL&
public&void&init()&{
&&&setBackground(Color.white);&&&
squareTop&=&getSize().height&/&2&-&SQUARE_SIZE&/&2;&
&&&&squareLeft&=&getSize().width&/&2&-&SQUARE_SIZE&/&2;
&&&&squareColor&=&Color.
&&&&addKeyListener(this);&&&}&
&&&&public&void&paint(Graphics&g)&{
&&&&g.setColor(Color.cyan);&
&&&&int&width&=&getSize().
&&&&int&height&=&getSize().&&
&&&&&&&g.drawRect(0,0,width-1,height-1);
&&&&g.drawRect(1,1,width-3,height-3);
&&&&g.drawRect(2,2,width-5,height-5);
&&&&g.setColor(squareColor);
&&&&g.fillRect(squareLeft,&squareTop,&SQUARE_SIZE,&SQUARE_SIZE);&
public&void&keyTyped(KeyEvent&evt)&{
&&&&char&ch&=&evt.getKeyChar();&
&&&&if&(ch&==&'B'&||&ch&==&'b')&{
&&&&&&&squareColor&=&Color.
&&&&&&&repaint();&}
&&&&else&if&(ch&==&'G'&||&ch&==&'g')&{
&&&&&&&squareColor&=&Color.
&&&&&&&repaint();&&}
&&&else&if&(ch&==&'R'&||&ch&==&'r')&{
&&&&&&squareColor&=&Color.
&&&&&&repaint();&&}
&&&else&if&(ch&==&'K'&||&ch&==&'k')&{
&&&&&&squareColor&=&Color.
&&&&&&repaint();
&&public&void&keyPressed(KeyEvent&evt)&{&
&&&&int&key&=&evt.getKeyCode();&&
&&&&&&&&if&(key&==&KeyEvent.VK_LEFT)&{&&&&&&squareLeft&-=&8;
&&&&&&if&(squareLeft&&&3)
&&&&&&&&&squareLeft&=&3;
&&&&&&repaint();
&&else&if&(key&==&KeyEvent.VK_RIGHT)&{
&&&&&squareLeft&+=&8;
&&&&if&(squareLeft&&&getSize().width&-&3&-&SQUARE_SIZE)
&&&&&&squareLeft&=&getSize().width&-&3&-&SQUARE_SIZE;
&&&&&&repaint();
&&&&&&&else&if&(key&==&KeyEvent.VK_UP)&{
&&&&&squareTop&-=&8;
&&&&&if&(squareTop&&&3)
&&&&&&&&squareTop&=&3;
&&&&&&&&repaint();
&&&else&if&(key&==&KeyEvent.VK_DOWN)&{
&&&&&&squareTop&+=&8;
&&&&&if&(squareTop&&&getSize().height&-&3&-&SQUARE_SIZE)
&&&&&&&squareTop&=&getSize().height&-&3&-&SQUARE_SIZE;
&&&&&&&repaint();
&&&&public&void&keyReleased(KeyEvent&evt)&{&}
1.菜单编程的基本步骤&&
⑴&创建菜单条(MenuBar)&&
例:MenuBar&m_MenuBar&=&new&MenuBar();&&//创建一个空的菜单条MenuBar&&
⑵&创建不同的菜单项(Menu)并加入到菜单条中&&
例:&Menu&menuEdit&=&new&Menu("编辑");&&
&&&&&&&&m_MenuBar.add(menuEdit);&&
⑶&创建菜单子项(MenuItem)加入菜单项&
例:MenuItem&mi_Edit_Copy&=&new&MenuItem("复制");&&
&&&&&&&menuEdit.add(mi_Edit-copy);&&&&
使用Menu的addSeparator()方法可以在各菜单项之间可以加入分隔线。&&
也可以给菜单子项定义快捷键&&
具体有两种方法:&&
&&方法一:创建MenuItem对象时设定。例如:&&
MenuItem&mi_File_Open&=&new&MenuItem("打开",&new&MenuShortcut('o'));&&
方法二:通过MenuItem对象的setShortCut方法。&&
mi_File_Open.setShortcut(new&MenuShortcut('o'));&&
⑷&给窗体设定菜单条&&
执行窗体对象的setMenuBar方法可将菜单条绑定给窗体。&&
⑸&各菜单子项注册动作事件监听者&&
例如:mi_Edit_Copy.addActionListener(this);&&
⑹&&在监听者的actionPerformed(ActionEvent&e)方法中实现处理代码&&
通过e.getSource()或e.getActionCommand()判断事件源,为每个菜单项编写对应的功能代码。&
import&java.applet.*;&&
import&java.awt.*;&&
import&java.awt.event.*;&&
public&class&Menudemo&extends&Frame&implements&ActionListener{&&
&&&&TextArea&&&
&&public&Menudemo()&{&&
&&&&ta=new&TextArea(30,60);&&&add(ta);&&
&&&&MenuBar&menubar&=&new&MenuBar();&&
&&&&setMenuBar(menubar);&&
&&&&Menu&file&=&new&Menu("File");&&
&&&&menubar.add(file);&&
&&&&MenuItem&open&=&new&MenuItem("open",&new&MenuShortcut(KeyEvent.VK_O));&&
&&&&MenuItem&quit&=&new&MenuItem("Quit",&new&MenuShortcut(KeyEvent.VK_Q));&&
&&&&file.add(open);&&
&&&&file.addSeparator();&&
&&&&file.add(quit);&&
&&&&this.addWindowListener(new&WindowAdapter()&{&&
&&&&&&&public&void&windowClosing(WindowEvent&e)&{&&
&&&&&&&&&&Frame&frm=(Frame)(e.getSource());&&
&&&&&&&&&&frm.dispose();&&
&&&&&&&&}&&
&&&&&&});&&
&&&&open.addActionListener(this);&&
quit.addActionListener(this);&&
&&&&setSize(300,&300);&&
&&&&setVisible(true);&&
public&void&actionPerformed(ActionEvent&e)&{&&
&&&&if&(e.getActionCommand()=="Quit")&{&&
&&&&&&&dispose();&&
&&&&&}&&else&{&&
&&&&&&&&&ta.setText("read&a&file&content&and&write&here");&&
&&public&&static&void&main(String&a[])&{&&
&new&Menudemo();&&
1.&弹出式菜单的编程要点&&
(1)创建弹出菜单对象&
例如:PopupMenu&popup&=&new&PopupMenu("Color");&&
(2)创建若干菜单项并通过执行弹出菜单的add方法将它们加入弹出菜单;给每个菜单项注册动作事件监听者,并编写相应的处理程序。&&
(3)通过执行部件的add方法将弹出式菜单附着在某个组件或容器上;&&
(4)在该组件或容器注册鼠标事件监听者(MouseListener);&&
(5)重载processMouseEvent(MouseEvent&e)方法判断是否触发弹出菜单,如果是点击鼠标右键,则调用弹出式菜单的show(),把它自身显示在用户鼠标点击的位置。&
例7-20&&一个画图程序,可以通过弹出菜单选择画笔颜色,通过鼠标拖动画线&&
import&java.applet.*;&&
import&java.awt.*;&&
import&java.awt.event.*;&&
public&class&MenuScribble&extends&Applet&implements&ActionListener&{&&
&&protected&int&lastx,&&&
&&protected&Color&color&=&Color.&&
&&protected&PopupMenu&&&
public&void&init()&{&&
&&&&popup&=&new&PopupMenu("Color");&String&labels[]={"Clear",&"Red",&"Green",&"Blue",&"Black"};&&
&&&&for(int&i&=&0;&i&&&labels.&i++)&{&&
&&&&&&&&MenuItem&mi&=&new&MenuItem(labels[i]);&&
&&&&&&&&mi.addActionListener(this);&&&
&&&&&&&&popup.add(mi);&&&}&&
&&&&this.add(popup);&&
&&&&this.addMouseListener(new&MouseAdapter()&{&&
public&void&mousePressed(MouseEvent&e)&{&&
&&&&&&&&&lastx&=&e.getX();&lasty&=&e.getY();&&&&}&&
&&&this.addMouseMotionListener(new&MouseMotionAdapter()&{&&
&&&&&public&void&mouseDragged(MouseEvent&e)&{&&
&&&&&&&&Graphics&g&=&getGraphics();&&
&&&&&&&&&int&x&=&e.getX(),&y&=&e.getY();&&
&&&&&&&&g.setColor(color);&&
&&&&&&&&g.drawLine(lastx,&lasty,&x,&y);&&
&&&&&&&&lastx&=&x;&lasty&=&y;&&
&public&void&processMouseEvent(MouseEvent&e)&{&&
&&&&if&((popup&!=&null)&&&&e.isPopupTrigger())&&
&&&&&&&popup.show(this,&e.getX(),&e.getY&&&&&
&&&&&&super.processMouseEvent(e);&&
public&void&actionPerformed(ActionEvent&e)&{String&name&=((MenuItem)e.getSource()).getLabel();&&
if&(name.equals("Clear"))&{&&&
Graphics&g&=&this.getGraphics();&&
&&&&&&&&g.setColor(this.getBackground());&&
&&g.fillRect(0,&0,&this.getSize().width,this.getSize().height);&&
&&&else&if&(name.equals("Red"))&&&color&=&Color.&&
&&&&&else&if&(name.equals("Green"))&color&=&Color.&&
&&&&&else&if&(name.equals("Blue"))&&color&=&Color.&&
&&&&&else&if&(name.equals("Black"))&color&=&color.&&
2.&深入理解事件处理模型&&
1、对话框的创建&&
对话框必须依托一个Frame。&
常见的对话框包括:提示对话框、确认对话框、输入对话框等,对话框的构造方法有多种,典型的是:&&
Dialog(Frame&parent,String&title,boolean&isModal)&&
其中,parent为对话框的依托窗体,title为对话框的标题,isModel用来指示对话框是否为“模式”对话框。&&
2、模式对话框与非模式对话框&&
模式对话框在显示时将阻塞该应用的其它操作,要求用户必须回答;而非模式对话框用户可以不理会,继续其它操作。&
默认情况下为非模式对话框,已经创建的对话框也可以用以下方法检查和设置模式。&&
boolean&isModal()&&
setModal(boolean&isModal)&&
例7-21&&将例7-15的颜色面板放入一个对话框,给窗体设置背景颜色&&
import&java.awt.*;&&
import&java.awt.event.*;&&
public&class&TestDialog&extends&Frame&{&&
&&&Button&change=new&Button("Change&Color");&&
&&&ColorPanel&m;&&
&&&Button&b&=&new&Button("确定");&&
&&&Dialog&&&
public&TestDialog&()&{&&
&&super("Parent");&&
&&setLayout(new&FlowLayout());&&
&&m=new&ColorPanel();&&//创建颜色选择面板&&
&&&&add(change);&&
&&&&change.addActionListener(new&ActionListener(){&&
&&&&&&&&&&public&void&actionPerformed(ActionEvent&e)&{&&
&&my=new&Dialog(TestDialog.this,"Select&color",true);&&
&&&&my.addWindowListener(new&WindowAdapter()&{
&public&void&windowClosing(WindowEvent&e)&{
&&&&&&&&&&&&&&&&&my.dispose();
&&&&&&&&&&&&&}
&&&&&&&&&&&});&&
&&&&&&&&&&&&my.setLayout(new&BorderLayout());&
&&&&&&&&&&&&my.add("Center",m);&my.add("South",b);&my.setSize(300,200);&&
&&&&&&&&&&&&my.setVisible(true);&&
&&&&&&&&&&}&&
setSize(300,300);&&
&setVisible(true);&&
&&&&&&&b.addActionListener(new&ActionListener(){&&
&&&&&&&&&public&void&actionPerformed(ActionEvent&e)&{&&
&&&&&&&&&&&&&my.dispose();&&
&&&&&&&&&&&&setBackground(m.mycanvas.getBackground());&&
&&&&&&&}&&
public&static&void&main(String&a[])&{&&
&&&&&&&new&TestDialog();&&
FileDialog&
是Dialog的子类。该类的构造方法有3个:&&
FileDialog(Frame&parent)&&
FileDialog(Frame&parent,&String&title)&&
FileDialog(Frame&parent,&String&title,&int&mode)&:创建一个对话框,mode取值为FileDialog.LOAD或FileDialog.SAVE,决定对话框是打开还是保存文件。&&
常用的FileDialog方法如下:&&
String&getDirectory()&:&返回对话框选择的目录&&
String&getFile():&返回对话框选择的文件名,当对话框未选文件时返回null。&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 图形用户界面 的文章

 

随机推荐