版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java的图形用户界面java.awt包与javax.swing包java.awt包称为抽象窗口工具集AWT(AbstractWindowToolkit),是使用Java进行GUI设计的基础功能
用户界面组件事件处理模型图形和图像工具布局管理器程序的GUI部分由AWT线程管理在特定平台上,每个AWT组件对象都有一个控制该对象外观显示的本地对等组件对象ButtonButtonPeerWindowsButtonPeerMotifButtonPeerMacOsButtonPeer平台无关的API和实现特定于平台的实现javax.swing包
几乎所有AWT组件对应有功能更强的Swing组件
java.awt.Framejavax.swing.JFrame加入了一些全新的组件
Swing组件都是AWT的Container类的直接子类和间接子类。
java.awt.Component
-java.awt.Container-java.awt.Panel-java.applet.Applet-java.awt.ScrollPane
-java.awt.Window
-java.awt.Frame-javax.swing.JFrame
-java.awt.Dialog-javax.swing.JDialog
-javax.swing.JWindow
-java.awt.Applet-javax.swing.JApplet
-javax.swing.Jcomponet-javax.swing.JPanelAWT组件与Swing组件重量级组件代码依赖于底层操作系统,并且存在一个对等组件做对应,将事件传递给对等组件处理。AWT组件是重量级的轻量级组件
没有本地代码,不依赖操作系统的支持具有平台独立的API并且有平台独立的实现Swing组件是轻量级的Swing组件以J开头增加了一个丰富的高层组件集合,如表格(JTable)、树(JTree)。
在Swing中,JFrame,JDialog,JWindow,JApplet这四个组件被称为重量级组件(顶层容器),它们必须使用本地代码来显示窗口画面。Swing组件不能直接添加到顶层容器中,必须添加到一个与Swing顶层容器相关联的内容面板(contentpane)上。publicContainergetContentPane()内容面板是顶层容器包含的一个普通容器,它是一个轻量级组件。一个简单的图形用户界面程序importjavax.swing.*;classWinextendsJFrame{JButtonbtn;Win(Strings){super(s);
btn=newJButton("hello");
getContentPane().add(btn);setSize(600,300);setVisible(true);validate();}}publicclassSimpleExp{publicstaticvoidmain(String[]args){newWin("MyWindow");}}添加布局管理和事件处理importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;classWinextendsJFrameimplementsActionListener{JButtonbtn;Win(Strings){super(s);btn=newJButton("hello");
btn.addActionListener(this);getContentPane().add(btn);
getContentPane().setLayout(newFlowLayout());setSize(600,300);setVisible(true);validate();}publicvoidactionPerformed(ActionEvente){
btn.setBackground(Color.red);}}publicclassSimpleExp{publicstaticvoidmain(String[]args){newWin("MyWindow");}}布局管理器FlowLayout流式布局GridLayout网格布局BorderLayout边界布局CardLayout卡片布局BoxLayout盒式布局GridBagLayout网格包布局FlowLayout布局Applet、Panel、JPanel型容器的默认布局布局方式组件按加入的先后顺序从左到右排列通过设置componentOrientation属性改变流的方向LEFT_TO_RIGHTRIGHT_TO_LEFTUNKNOWN一行排满后自动换行每一行中的组件都居中排列每一个组件的大小为默认的最佳大小组件间的默认水平和垂直间隙是5个像素常用方法
publicvoidsetPreferredSize(Dimension)
java.awt.Component
组件改变最佳大小的函数组件调用setSize(intx,inty)设置的大小无效
publicvoidsetAlignment(int
align)
重新设置布局的对齐方式FlowLayout.LEFT
FlowLayout.RIGHTFlowLayout.CENTER
FlowLayout.LEADING
FlowLayout.TRAILING每一行组件沿容器方向的开始边界对齐每一行组件沿容器方向的结束边界对齐常用方法
publicvoidsetHgap(int
hgap)重新设置组件间及组件和容器边界间的水平间隙publicvoidsetVgap(int
vgap)重新设置组件间及组件和容器边界间的垂直间隙
publicvoidsetComponentOrientation(ComponentOrientation
o)java.awt.ComponentContainercon=getContentPane();con.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);importjava.awt.*;importjavax.swing.*;classWindowFlowextendsJFrame{JButtonb[]=newJButton[10];WindowFlow(Strings){super(s);
FlowLayoutflow=newFlowLayout();
flow.setAlignment(FlowLayout.LEFT);
flow.setHgap(2);
flow.setVgap(8);
setLayout(flow);for(inti=1;i<b.length;i++){b[i]=newJButton("Iam"+i);if(i>=8)
b[i].setPreferredSize(newDimension(70,70));add(b[i]);}setBounds(100,100,350,160);setVisible(true);validate();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}}publicclassFlowLayoutExp{publicstaticvoidmain(String[]args){WindowFlowwin=newWindowFlow("FlowLayout布局窗口");}}WindowConstants接口中的常量BorderLayout布局是Window型容器(如Window、Dialog、Frame)的默认布局布局方式容器空间划分为东、西、南、北、中5个区域
CENTER(默认)NORTHSOUTHWESTEAST中间区域最大,添加组件时应指明所添加的区域,且组件将占据整个区域至多添加5个组件当用户改变容器窗口大小时,各个组件的相对位置不变,而组件大小改变常用方法publicBorderLayout()
构造一个组件之间没有间距的新边框布局。
publicBorderLayout(int
hgap,int
vgap)
构造一个具有指定组件间距的边框布局。水平间距由hgap指定,垂直间距由vgap指定。
publicvoidadd(Componentcomp,Objectconstraints)java.awt.Container
将指定的组件添加到此容器的尾部。同时通知布局管理器使用指定的constraints对象将组件添加到此容器的布局中。publicComponentadd(Stringname,Componentcomp)在BorderLayout类中,定义了表示方位的5个publicstaticfinalString类型的常量:EAST(值为”East”)、WEST(值为”West”)、SOUTH(值为”South”)、NORTH(值为“North”)、CENTER(值为”Center”)将指定组件添加到此容器中并返回该组件importjava.awt.*;importjavax.swing.*;publicclassBorderLayoutExp{publicstaticvoidmain(String[]args){JFramewin=newJFrame("窗体");win.setBounds(100,100,600,300);win.setVisible(true);JButtonbSouth=newJButton("我在南边"),bNorth=newJButton("我在北边"),bEast=newJButton("我在东边"),bWest=newJButton("我在西边"),bCenter=newJButton("我在中心");
win.add(bNorth,BorderLayout.NORTH);win.add(bSouth,BorderLayout.SOUTH);win.add(bEast,BorderLayout.EAST);win.add(bWest,BorderLayout.WEST);win.add(bCenter,BorderLayout.CENTER);
win.validate();win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}CardLayout布局布局方式可容纳多个组件,组件被层叠放入容器中最先加入容器的组件位于最上层,依次向下排序每次只能显示一个组件,被显示组件占据所有的容器空间卡片通常为一个Panel对象当需要许多面板切换,而每个面板需要显示为不同布局时,可以使用卡片布局常用方法
publicCardLayout()
创建一个间距大小为0的新卡片布局。publicCardLayout(int
hgap,int
vgap)创建一个具有指定水平间距和垂直间距的新卡片布局。水平间距置于左右边缘。垂直间距置于上下边缘。
publicComponentadd(String
name,Component
comp)java.awt.Container将指定组件添加到此容器中并返回该组件
publicvoidshow(Container
parent,String
name)翻转到容器中具有指定name的组件。
publicvoidfirst(Container
parent)
翻转到容器的第一张卡片publicvoidlast(Container
parent)翻转到容器的最后一张卡片publicvoidprevious(Container
parent)翻转到指定容器的前一张卡片
publicvoidnext(Container
parent)翻转到指定容器的后一张卡片importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;classWindowCardextendsJFrameimplementsActionListener{JPanelp1;JLabellab1,lab2,lab3;JButtonb1;WindowCard(Strings){super(s);p1=new
JPanel(newCardLayout());
lab1=newJLabel("thisisone!");lab2=newJLabel("thisistwo!");lab3=newJLabel("thisisthree!");b1=newJButton("next");
p1.add("one",lab1);
p1.add("two",lab2);p1.add("three",lab3);
((CardLayout)p1.getLayout()).show(p1,"one");
setLayout(newGridLayout(2,1));add(p1);add(b1);
b1.addActionListener(this);setBounds(100,100,600,300);setVisible(true);validate();}
publicvoidactionPerformed(ActionEvente){
((CardLayout)p1.getLayout()).next(p1);}}publicclassCardLayoutExp{publicstaticvoidmain(String[]args){WindowCardwin=newWindowCard("CardLayout布局窗口");}}GridLayout布局布局方式把容器划分成若干行乘若干列的网格区域,每个网格大小相同组件按进入容器的顺序装入网格中(从第一行到最后一行,每行从左到右),强制组件与网格的大小相同常用方法
publicGridLayout()创建具有默认值的网格布局,即每个组件占据一行一列。publicGridLayout(int
rows,int
cols)
创建具有指定行数和列数的网格布局,0为任意值publicGridLayout(int
rows,int
cols,int
hgap,int
vgap)
创建具有指定行数和列数的网格布局。将水平和垂直间距设置为指定值。常用方法
publicintgetRows()
获取此布局中的行数
publicintgetColumns()
获取此布局中的列数
publicintgetHgap()
获取组件间的水平间距
publicintgetVgap()
获取组件间的垂直间距
publicvoidsetRows(int
rows)
将布局中的行数设置为指定值
publicvoidsetColumns(int
cols)
将布局中的列数设置为指定值
publicvoidsetHgap(int
hgap)将组件之间的水平间距设置为指定值。
publicvoidsetVgap(int
vgap)将组件之间的垂直间距设置为指定值。importjava.awt.*;importjavax.swing.*;classWindowGridextendsJFrame{JButtonb1,b2,b3,b4,b5,b6;publicWindowGrid(Strings){super(s);
GridLayoutgridLayout=newGridLayout(3,2);
gridLayout.setHgap(4);
gridLayout.setVgap(8);
setLayout(gridLayout);b1=newJButton("1");b2=newJButton("2");b3=newJButton("3");b4=newJButton("4");b5=newJButton("5");b6=newJButton("6");add(b1);add(b2);add(b3);add(b4);add(b5);add(b6);setBounds(100,100,600,300);setVisible(true);validate();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}}publicclassGridLayoutExp{publicstaticvoidmain(String[]args){WindowGridwin=newWindowGrid("GridLayout窗口");}}BoxLayout布局盒式容器的默认布局是盒式布局且不允许更改使用javax.swing包中的Box类及其子类创建的容器称为盒式容器布局方式使用盒式布局的容器将组件排列在一行或一列
行型盒式布局将组件排列在一行,组件按加入的先后顺序从左至右排列,组件上沿在同一水平线上
列型盒式布局将组件排列在一列,组件按加入的先后顺序从上至下排列,组件左沿在同一垂直线上
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.Box常用方法
publicBoxLayout(Container
target,int
axis)创建一个将沿给定轴放置组件的布局管理器。
BoxLayout.X_AXIS组件从左到右放置BoxLayout.Y_AXIS组件从上到下放置BoxLayout.Line_AXIS根据目标容器的ComponentOrientation属性确定的文本行方向放置组件BoxLayout.Page_AXIS根据目标容器的ComponentOrientation属性确定的文本行在页面中的流向来放置组件Box类的常用方法Box类是使用BoxLayout的轻量级容器在javax.swing包中
publicBox(int
axis)
创建一个沿指定坐标轴显示其组件的Box
publicstaticBoxcreateVerticalBox()创建一个从上到下显示其组件的BoxpublicstaticBoxcreateHorizontalBox()创建一个从左到右显示其组件的Box
publicstaticComponentcreateHorizontalStrut(int
width)创建一个不可见的、固定宽度的组件(水平支撑组件)。可控制组件间的水平间距。publicstaticComponentcreateVerticalStrut(int
height)创建一个不可见的、固定高度的组件(垂直支撑组件)。可控制组件间的垂直间距。importjava.awt.*;importjavax.swing.*;classWindowBoxextendsJFrame{BoxbaseBox,box1,box2;WindowBox(Strings){super(s);
box1=Box.createVerticalBox();box1.add(newJLabel("输入您的姓名"));
box1.add(Box.createVerticalStrut(8));box1.add(newJLabel("输入您的职业"));
box2=Box.createVerticalBox();box2.add(newJTextField(16));
box2.add(Box.createVerticalStrut(8));box2.add(newJTextField(16));
baseBox=Box.createHorizontalBox();baseBox.add(box1);
baseBox.add(Box.createHorizontalStrut(10));baseBox.add(box2);setLayout(newFlowLayout());add(baseBox);setBounds(100,100,400,150);setVisible(true);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}publicclassBoxLayoutExp{publicstaticvoidmain(String[]args){newWindowBox("BoxLayout窗口");}}GridBagLayout布局布局方式提供具有不同大小的行和列放置组件,每个单元可有不同的大小维持一个动态的矩形单元网格,每个组件占用一个或多个这样的单元每个由GridBagLayout管理的组件都与GridBagConstraints的实例相关联。网格的总体方向取决于容器的ComponentOrientation属性。水平自左向右:网格坐标(0,0)位于容器的左上角,其中X向右递增,Y向下递增水平自右向左:网格坐标(0,0)位于容器的右上角,其中X向左递增,Y向下递增
GridBagConstraints的成员gridx、gridy指定组件左上角在网格中的行与列容器中最左边列的gridx=0,最右边列的gridy=0GridBagConstraints.RELATIVE表示对应的组件将放在前面放置组件的右边或下面gridwidth、gridheight组件的横向/纵向宽度,即组件占用的列数/行数使用GridBagConstraints.REMAINDER指定组件的显示区域,该区域的范围是从gridx/gridy到该行/列中的最后一个单元使用GridBagConstraints.RELATIVE指定组件的显示区域,该区域的范围是从gridx/gridy到其所在行/列的倒数第二个单元
fill
当显示区域比组件的区域大时,可以用来控制组件的行为。GradBagConstraints.NONE默认GradBagConstraints.HORIZONTAL组件横向充满显示区域,但不改变组件高度GradBagConstraints.VERTICAL组件纵向充满显示区域,但不改变组件宽度GradBagConstraints.BOTH组件横纵向充满其显示区域ipadx、ipady
指定布局中组件的内部填充,是组件最小大小在横向/纵向方向的添加量。当fill取BOTH时不起作用。
insets
指定组件的外部填充,即组件间的间隙及组件与其显示网格边缘之间间距的最小量默认组件没有外部填充anchor当组件小于显示区域时,告诉布局管理器组件在显示区域中的位置
绝对值NORTH、SOUTH、WEST、EAST、NORTHWEST、NORTHEAST、SOUTHWEST、SOUTHEAST、CENTER(默认)相对于方向的值PAGE_START、PAGE_END、LINE_START、LINE_END、FIRST_LINE_START、FIRST_LINE_END、LAST_LINE_START、LAST_LINE_END相对于基线的值BASELINE、BASELINE_LEADING、BASELINE_TRAILING、ABOVE_BASELINE、ABOVE_BASELINE_LEADING、ABOVE_BASELINE_TRAILING、BELOW_BASELINE、BELOW_BASELINE_LEADING和BELOW_BASELINE_TRAILINGweightx、weighty行/列的权重,告诉布局管理器在容器大小改变时,增加或减少的空间如何在组件间分配默认值是0,即所有的组件将聚拢在容器中心,多余的空间将放在容器边缘与网格单元之间除非在行(weighty)和列(weightx)中至少指定一个组件的权重,否则所有组件都会聚集在其容器的中央。若组件横跨多列,将weightx设置为0;若组件纵跨多行,将weighty设置为0一行的权重为该行中组件的weighty的最大值一列的权重为该列中组件的weightx的最大值weightx,weighty取值一般在0与1之间常用方法
publicGridBagConstraints()publicvoidsetConstraints(Component
comp,GridBagConstraintsconstraints)(GridBagLayout类)publicvoidadd(Component
comp,Objectconstraints)(java.awt.Container类)btn1btn2btn3btn4btn5btn6insets:(10,20,30,40)gridx:012012gridy:000111gridwidth:11REMAINDER
1RELATIVE
REMAINDERgridheight:111222weightx:102030000weighty:101010202020fill:VERTICALBOTHBOTHBOTHBOTHNONEipadx:510ipady:15anchor:CENTER
LAST_LINE_ENDnull布局当处理一些手工绘图时,需要自己来设置图形的位置,不需要使用系统提供的布局管理器,可使用无布局管理器组件调用setBounds(inta,intb,intwidth,intheight)方法设置组件在容器中的位置和大小联合布局GridBagLayoutBoxLayoutFlowLayout事件处理事件处理原理事件源组件对象名.addActionListener(监听者)监听者事件实现ActionListener接口publicvoidactionPerformed(ActionEvente)ActionEvent触发注册参数传递事件处理事件处理机制事件分类事件监听器事件适配器灵活设计事件监听器类用匿名内置类实现事件监听器事件处理的多重运用修改组件的默认事件处理方式事件处理机制三个重要的概念事件:用户对组件的一个操作,称为一个事件事件源:发生事件的组件事件处理器:某个Java类中负责处理处理事件的成员方法,该方法接收一个事件对象,对其进行解释,并作出相应处理事件源、事件、事件处理器之间的工作关系:组件(事件源)事件处理器事件监听器注册事件对象生成事件对象外部作用把事件对象传入事件处理器事件处理采用基于层次模型的向上传递机制当事件发生时,首先发送给产生事件的组件,如果该组件不对事件进行处理,则事件将自动传递到包含组件的容器事件将沿着组件间的包含关系层层向上传递事件监听器一个事件监听器对象负责处理一类事件一类事件的每一种发生情况,分别由事件监听器对象中的一个方法进行处理在事件源和事件监听器对象中进行约定的接口类,被称为事件监听器接口
Java中每类事件都定义了一个相应的监听器接口,该接口中实现了事件处理方法事件监听器接口类的名称与事件类的名称是相对应的,比如MouseEvent的事件类的监听器接口名是MouseListener事件监听器接口Java提供了抽象的响应特定事件的”事件监听器”,在java.awt.event包中定义为接口这些接口都由
java.util.EventListener接口继承而来事件源注册的事件监听者必须实现相应接口中的抽象方法,以进行事件处理一个事件监听者若要处理多种事件,就必须要实现多个事件接口。处理发生在某个GUI组件上的XXXEvent事件的某种情况,其事件处理的通用编写流程:编写一个实现了XXXListener接口的事件监听器类publicclassMyClassimplementsActionListener{……}XXXListener类中的用于处理该事件情况的方法中,编写处理代码publicclassMyClassimplementsActionListener{……publicvoidactionPerformed(ActionEvente){……}……}调用组件的addXXXListener方法,将类XXXListener创建的实例对象注册到GUI组件上someComponent.AddActionListener(newMyClass());publicvoidaddActionListener(
ActionListener
l)l可以引用任何实现了该接口的类所创建的对象,当事件源发生事件时,接口l立刻回调被类实现的接口中的某个方法,即采用接口回调技术事件处理的多重运用一个组件上的一个动作可以产生多种不同类型的事件组件(事件源)外部作用事件对象1事件对象2事件处理器1事件处理器2……一个事件监听器对象可以注册到多个事件源上组件1(事件源1)外部作用事件对象事件处理器…组件2(事件源2)在一个事件源上也可以注册对同一类事件进行处理的多个事件监听器对象组件(事件源)外部作用事件对象事件处理器1…事件处理器2这些事件处理方法的调用顺序系统是没有定义的适配器类JDK中提供了大多数事件监听器接口的最简单的实现类,称为事件适配器类
事件监听器所在的类可以用适配器类作为父类,覆盖要实现的方法,其余未实现的方法采用适配器类中的默认方式实现事件监听器所在的类可作为独立类,也可作为组件所在类的内部类或匿名内部类用事件适配器来处理事件,可以简化事件监听器的编写事件适配器的不足如果事件监听器类已继承其他类,就不能再继承事件适配器类可以采用内部类和匿名内部类解决该问题如果监听器接口中只有一个方法,那么JDK没必要为它形成一个适配器事件处理的几种方法组件所在的类实现接口,用本类对象作为事件监听器classWinextendsJFrameimplementsActionListener{JButtonbtn;Win(){btn=newButton(“button”);
btn.addActionListener(this);…………}
publicvoidactionPerformed(ActionEvente){……}}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}
用组件所在类(设为类A)之外的类(设为类B)对象作为事件监听器,类B实现事件监听接口classWinextendsJFrame{JButtonbtn;
privateActionEventHandleractListener;Win(){btn=newButton(“button”);actListener=newActionEventHandler();
btn.addActionListener(actListener);…………}…………}classActionEventHandlerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){……}}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}classWinextendsJFrame{privateWindowCloserwndListener;Win(){wndListener=newWindowCloser();
addWindowListener(wndListener);…………}…………}classWindowCloserextendsWindowAdapter{
publicvoidwindowClosing(WindowEvente){System.exit(0);}}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}单独类classWinextendsJFrame{
privateclassInnerWindowCloserextends
WindowAdapter{
publicvoidwindowClosing(WindowEvente)
{System.exit(0);}}Win(){addWindowListener(newInnerWindowCloser());…………}…………}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}有名内部类classWinextendsJFrame{Win(){addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente){System.exit(0);}});
…………}…………}publicclassExp{publicstaticvoidmain(String[]args){newWin();}}匿名内部类事件分类按产生事件的物理操作和GUI组件的表现效果进行分类MouseEventWindowEventActionEvent……事件类型在javax.swing.event中出现了一些新的swing组件事件类型TextEvent事件事件源:TextComponent、TextArea、TextField常量Text_VALUE_CHANGED
表示文本发生改变
KeyEvent事件
在InputEvent类中
publicbooleanisControlDown()publicbooleanisShiftDown()publicbooleanisMetaDown()publicbooleanisAltDown()判断某个特定修饰符是否被按下publicintgetModifiers()返回修饰符KeyEvent类定义KEY_PRESSED、KEY_RELEASED、KEY_TYPED事件
publicintgetKeyCode()
返回按键的Unicode码publicchargetKeyChar()
返回按键对应的字符
publicstaticStringgetKeyText(int
keyCode)返回对按键描述的字符串
publicstaticStringgetKeyModifiersText(int
modifiers)
返回对修饰符描述的字符串处理复合键
e.getModifiers()==InputEvent.CTRL_MASK&&e.getKeyCode()==KeyEvent.VK_XInputEvent
SHIFT_MASKCTRL_MASKMETA_MASKALT_MASKALT_GRAPH_MASKBUTTON1_MASKBUTTON2_MASKBUTTON3_MASK复合键示例在窗口中放一个红色按钮按下shift+X,按钮向右下方向各移动100按下ctrl+X,按钮的长和宽各增加30setLayout(newFlowLayout());b=newJButton("button");b.setBackground(Color.red);
b.addKeyListener(this);add(b);publicvoidkeyPressed(KeyEvente){…………if(e.getModifiers()==InputEvent.SHIFT_MASK&&e.getKeyCode()==KeyEvent.VK_X){ b.setLocation(x+100,y+100);}elseif(e.getModifiers()==InputEvent.CTRL_MASK&&e.getKeyCode()==KeyEvent.VK_X){ b.setSize(w+30,h+30);}}MouseEvent事件常量定义
MOUSE_CLICKED按动鼠标按键
MOUSE_PRESSED按下鼠标按键
MOUSE_RELEASED释放鼠标按键
MOUSE_MOVED移动鼠标
MOUSE_ENTERED鼠标移入组件
MOUSE_EXITED鼠标离开组件
MOUSE_DRAGGED拖动鼠标常用方法
publicintgetX()
publicintgetY()publicPointgetPoint()publicintgetClickCount()鼠标事件示例在窗口上添加一个按钮和带滚动条的文本区在按钮上按下鼠标,在文本区中显示按下点的坐标在按钮上释放鼠标,在文本区中显示释放点的坐标鼠标进入和退出按钮时,在文本区中显示相应信息拖动按钮和移动鼠标时,在文本区中显示相应信息在按钮上点击鼠标,在文本区中显示点击位置的坐标,用右键还是左键点击,点击次数btn.addMouseListener(this);btn.addMouseMotionListener(this);publicvoidmousePressed(MouseEvente){ text.append("\nmousepressedat"+e.getX()+","+e.getY());}publicvoidmouseEntered(MouseEvente){ text.append("\nmouseentered!");}publicvoidmouseClicked(MouseEvente){ text.append("\nmouseclickedat"+e.getX()+","+e.getY()); if(e.getClickCount()>=2) text.append("\nclicked"+e.getClickCount()+"times"); if(e.getModifiers()==e.BUTTON1_MASK) text.append("\nleftbuttonclicked!"); elseif(e.getModifiers()==e.BUTTON3_MASK) text.append("\nrightbuttonclicked!"); }FocusEvent事件焦点的永久变化:焦点从一个组件直接移动到另一个部件
publicvoidrequestFocus()java.awt.Component
焦点的暂时变化:对组件进行非直接操作【作业】利用鼠标进行绘图点击窗口中的空白处,得到一张“笑脸”的图像;点击已存在的图像,图像在“笑脸”和“哭脸”之间切换;用鼠标可以对图像进行拖动操作;在窗口左上角,显示当前鼠标光标的位置运行结果如下:焦点事件示例在窗口上放三个长度为7的文本框当一个文本框输入满后,焦点自动转移到下一个文本框获得焦点的文本框自动清空for(inti=0;i<3;i++){text[i]=newTextField(7);
text[i].addKeyListener(this);
text[i].addFocusListener(this);add(text[i]);}
text[0].requestFocusInWindow();/*如果此Component的顶层祖先已经是获得焦点的Window,则请求此Component获取输入焦点*/publicvoidfocusGained(FocusEvente){TextFieldtext=(TextField)e.getSource();text.setText(null);}
publicvoidkeyPressed(KeyEvente){TextFieldt=(TextField)e.getSource();if(t.getCaretPosition(
)>=6)//返回文本插入符的位置
t.transferFocus();//将焦点转移到下一个组件}WindowEvent事件WindowListener接口publicvoidwindowActivated(WindowEvente)窗口从非激活状态到激活状态时publicvoidwindowDeactivated(WindowEvente)窗口从激活状态到非激活状态时publicvoidwindowClosing(WindowEvente)窗口正在被关闭publicvoidwindowClosed(WindowEvente)窗口关闭时publicvoidwindowIconified(WindowEvente)窗口图标化时publicvoidwindowDeiconified(WindowEvente)窗口撤销图标化时publicvoidwindowOpened(WindowEvente)窗口打开时单击窗口右上角的图标化按钮
windowIconified()windowDeactivated()撤消窗口图标化
windowDeiconified()windowActivated()单击窗口的关闭图标
windowClosing()(调用dispose()方法)执行窗口初始化时用setDefaultCloseOperation(intn)设定的关闭操作执行windowClosed()若在windowClosing()中执行了System.exit(0)或setDefaultCloseOperation设定的关闭操作是EXIT_ON_CLOSE或DO_NOTHING_ON_CLOSE,则监视器没有机会调用windowClosed()方法窗口事件示例在窗口中添加一个带滚动条的文本区窗口打开、被激活、未激活、图标化和未图标化时在文本区中显示相应信息窗口正被关闭及已关闭,在控制台输出相应信息publicvoidwindowActivated(WindowEvente){ta.append("窗口被激活\n");}publicvoidwindowDeactivated(WindowEvente){ta.append("窗口未被激活\n");}publicvoidwindowOpened(WindowEvente){ ta.append("窗口被打开");} publicvoidwindowIconified(WindowEvente){ta.append("窗口被图标化\n");} publicvoidwindowDeiconified(WindowEvente){ta.append("窗口未被图标化\n");}publicvoidwindowClosing(WindowEvente){System.out.println("窗口正在关闭\n");}publicvoidwindowClosed(WindowEvente){System.out.println("窗口已被关闭\n");}publicWin(){ta=newJTextArea();add(newJScrollPane(ta),BorderLayout.CENTER);addWindowListener(this); setVisible(true);setSize(300,400);setDefaultCloseOperation(DISPOSE_ON_CLOSE);validate(); }自定义事件AWTEventMulticasterjava.awt事件源可注册多个监听器,此类管理一个由
事件监听器链构成的结构,将事件发送到所有的监听器此类实现了所有事件监听接口,并包含方法publicstaticXXXListeneradd(XXXListenerlis,XXXListenernewListener)将newListener添加到lis上并返回组合的监听器publicstaticXXXListenerremove(XXXListenerlis,XXXListeneroldListener)把oldListener从lis上移走并返回削减的监听器publicmyComponentextendsComponent{ActionListeneractionListener=null;publicsynchronizedvoidaddActionListener(ActionListenerl){actionListener=AWTEventMulticaster.add(actionListener,l);}publicsynchronizedvoidremoveActionListener(ActionListenerl){actionListener=AWTEventMulticaster.remove(actionListener,l);}publicvoidprocessEvent(AWTEvente){ActionListenerlistener=actionListener;if(listener!=null){listener.actionPerformed(newActionEvent());}}}
添加监听器移走监听器自定义组件类创建事件调用监听器中的事件处理方法自定义事件示例点击start开始计数,计数完毕产生一个自定义事件该自定义事件传递给自定义组件的事件侦听者,并在文本框中输出信息指出事件源classCountDown{ActionListenerlistener=null;Objectsource=null;intmaxCount=10;publicCountDown(Objects,intm){ source=s; maxCount=m;}
publicvoidaddActionListener(ActionListenernewListener){listener=AWTEventMulticaster.add(listener,newListener);}publicvoidremoveActionListener(ActionListeneroldListener){listener=AWTEventMulticaster.remove(listener,oldListener);}publicvoidstartCounting(){ if(listener!=null) {for(inti=maxCount;i>=0;i--) System.out.println("i:"+i); System.out.println("Done.Generatingeventnow...");
listener.actionPerformed(newActionEvent(source,ActionEvent.ACTION_PERFORMED,"CountDown")); }}publicvoidactionPerformed(ActionEvente){if(e.getSource()==start)
count.startCounting();elseif(e.getSource()==show) display.setText("Eventcamefrom:"+e.getActionCommand());}startStart触发ActionEvent事件actionPerformed监听器countstartCountingActionEvent事件”CountDown”创建注册注册修改事件的默认处理方式只有在一个组件上注册了某种事件的事件监听器对象后,组件才会产生相应的事件对象默认的processEvent方法调用相应的processXXXEvent方法调用enableEvents(long)方法,可以在即使没有注册事件监听器的情况下,组件也能够对某些类型的事件进行响应和产生相应的事件对象Canvas是具有最基本和最简单的GUI功能的组件Canvas代表屏幕上的一块空白的矩形区域,程序能够在这个部件表面绘图,也能够捕获用户的操作,产生相应的事件当要设计自定制的具有GUI功能的组件类时,继承Canvas将会大大简化编程难度编程实例:设计一个自定制的计时器组件,当鼠标在计时器组件上按下时,计时器开始计时,并显示计时时间;当鼠标释放时,计时器停止计时GUI组件文本组件JTextField、JTextArea、JPasswordFieldJTextField
文本框允许用户输入单行文本常用函数
publicvoidaddActionListener(ActionListener
l)publicvoidremoveActionListener(ActionListener
l)publicJTextField(String
text)publicJTextField()publicJTextField(int
columns)publicStringgetText()
javax.swing.text.JTextComponentpublicvoidsetText(String
t)javax.swing.text.JTextComponent
publicvoidsetEditable(boolean
b)publicvoidsetHorizontalAlignment(int
alignment)
JTextField.LEFTJTextField.CENTERJTextField.RIGHTJTextField.LEADINGJTextField.TRAILING
在文本框中输入文本后,按下Enter触发ActionEvent事件ActionEvent事件事件源:Button、TextField、List、MenuItem
常量ACTION_PERFORMED是事件的识别码常量SHIFT_MASK、CTRL_MASK、ALT_MASK、META_MASK
表示事件发生时同时按下的键
publicStringgetActionCommand()
返回与此动作相关的命令字符串。如Button的命令字是按钮的标签,List的命令字是选择项,TextField的命令字是输入字符串文本框上的文档类型
publicJTextField(Document
doc,String
text,int
columns)用指定的文档document创建一个文本框,文本框的默认文档类型是PlainDocumentjavax.swing.text.AbstractDocument
javax.swing.text.PlainDocument
PlainDocument类的重要方法
insertString(intoffset,Strings,AttributeSeta)在文本框中进行字符输入操作时,自动执行publicvoidremove(int
offs,int
len)
在文本框中进行字符删除操作时,自动执行
javax.swing.text.AbstractDocumentpublicvoidsetDocument(Document
doc)javax.swing.JTextField
改变文本框的文档类型
JPasswordField
javax.swing.JTextField
javax.swing.JPasswordField默认回显字符是‘*’常用函数
publicvoidsetEchoChar(char
c)publicchargetEchoChar()publicchar[]getPassword()
可以触发ActionEvent事件
字体:粗斜
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 棒球击球笼网市场发展现状调查及供需格局分析预测报告
- 蔬菜盘市场发展预测和趋势分析
- 2024年度农业种植技术转让合同:高效节能种植技术
- 2024年度环保设施建造及运营管理合同
- 2024年度物流服务合同:某物流公司为其提供物流服务的合同
- 2024年度地坪施工人员培训合同
- 2024年度深海探测设备安装施工合同
- 2024年度版权购买合同:摄影作品著作权购买及使用权
- 2024年度技术开发合同:智能手机操作系统定制
- 2024年度演艺经纪合同(艺人推广与代理)
- 污水源热泵系统设计方案
- 工业萘精馏毕业设计说明书
- 保洁整改措施
- 船舶安全开航技术要求
- 知法懂法守法主题班会课件
- 【新教材】苏教版2017版新版六年级上册科学全册教案
- 成语故事课件一诺千金
- 巾箱秘术己庚辛壬癸部部分内容部
- 小学语文三年级上册第二组双向细目表
- 抄控器使用说明书
- 订单协调管理流程
评论
0/150
提交评论