




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
图形用户界面编程基础图形用户界面核心概念容器与布局管理常用GUI标准组件鼠标和键盘事件JavaGUI编程概述
图形用户界面
图形用户界面是一种高效的人机交互界面。它通过图形展示的方法,借助菜单、按钮等标准界面元素和鼠标、键盘灯操作,帮助用户方便地向计算机发出操作命令,并将程序运行结果以图形的方式反馈给用户。图形用户界面核心概念JavaGUI编程概述
Java图形用户界面
Java图形用户界面(GUI,GraphicsUserInterface)设计的基础是其所特有的两套图形设计工具集,即AWT(AbstrctWindowToolkit)和Swing,其中包含许多类来支持GUI设计,涉及到用户界面组件、事件处理模型、图形和图像工具(包括形状、颜色和字体类)及布局管理器(可以在窗口中对组件进行灵活地布局)。JavaGUI编程概述
组件界面设计的核心是组件,根据其在界面中所起的作用可分为两类:即非容器组件和容器组件。例如:
整个窗体是一个容器组件,而窗体里面的两个按钮(login和cancel)和用户名输入文本框等就是非容器组件。JavaGUI编程概述1非容器组件
非容器组件,是指一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。
非容器组件不能独立地显示出来,必须将其放在一定的载体(即容器组件)中才可以显示出来。任何系统组件的使用,必须先导入其相应的类。如:importjavax.swing.JButton;JButtonbutton=newJButton();注:Java中所有组件直接或间接继承于组件类,即Component类,该类中封装了组件通用的方法和属性。JavaGUI编程概述1非容器组件Component类的常用方法(1)StringgetName():获取组件的名称。(2)voidrepaint():重绘此组件。(3)voidsetBackground(Colorc):设置组件的背景色。(4)voidsetBounds(intx,inty,intwidth,intheight):显示组件的左顶点坐标(x,y),长宽为width和height。(5)voidsetEnabled(booleanb):根据参数b的值启用或禁用此组件。(6)voidsetFont(Fontf):设置组件的字体。(7)voidsetForeground(Colorc):设置组件的前景色。(8)voidsetSize(intwidth,intheight):调整组件宽度为width,高度为height。(9)voidsetVisible(booleanb):根据参数b的值显示或隐藏此组件。JavaGUI编程概述2容器组件容器组件,是指能够存放组件的组件,它可以容纳多个组件,并使它们成为一个整体。
Container类
Java中所有的容器直接或间接地继承于容器类,即Container类。
实质上,容器本身也是一个组件,因此,Container类是Component类的子类,它具有组件的所有性质,但它的主要功能是容纳其它组件和容器。JavaGUI编程概述2容器组件
常见的组件包括按钮、标签、文本框、文本区域、下拉框等,常用的容器有Frame、Panel、Applet等。Container类和Component类间存在着继承关系。JavaGUI编程概述2容器组件(1)Componentadd(Componentcomp):将指定组件追加到此容器的尾部。(2)voidremove(Componentcomp):从此容器中移除指定组件。(3)voidsetFont(Fontf):设置此容器的字体。(4)voidsetLayout(LayoutManagermgr):设置此容器的布局管理器。
容器类常用的方法Swing简介
AWTAWT是JavaGUI设计的基础,但AWT仅能满足设计简单用户图形界面需求,无法满足GUI编程日益丰富的功能需求,比如AWT缺少剪贴板、打印支持、键盘导航等特性,甚至不包括弹出式菜单或滚动窗格等基本元素。AWT组件基本属于重质组件(weightcomponent),即效果依赖于系统平台。
SwingSwing组件属于轻质组件(lightcomponent),即组件效果完全独立于系统平台。Swing组件是由纯Java实现的,Swing组件都是AWT的Container类的直接或者间接子类。Swing简介部分Swing组件与AWT组件的关系所有的Swing组件都被定义在javax.swing包中,包括两种类型的组件:容器(如JFrame,JApplet,JDialog和JPanel).非容器组件(如JButton,JLabel)。布局管理器
布局的作用布局的作用在于当设计者往一个容器内部添加了若干组件后,能够把这些组件合理美观地排列成一个整体。
Java布局管理器Java把组件布局任务交由布局管理器(LayoutManager)来执行。
常见的布局管理器有:FlowLayout、BorderLayout、GridLayout、CardLayout、箱式布局(BoxLayout)与Box类(与前面不一样)布局管理器1FlowLayout(流式布局管理器)
FlowLayout是Panel类型容器的默认布局管理器。它的布局效果,即组件在容器中按加入顺序逐行定位,行内从左到右,一行满后换行,默认对齐方式为居中对齐。常用的构造方法(1)publicFlowLayout():默认的对齐方式。(2)publicFlowLayout(intalign):创建FlowLayout并设置对齐方式,align为方位常量。(3)publicFlowLayout(intalign,inthgap,intvgap):创建FlowLayout并设置对齐方式,组件的垂直和水平间距。三个方位常量FlowLayout.LEFT(左对齐)、FlowLayout.RIGHT(右对齐)、FlowLayout.CENTER(居中对齐)。布局管理器2BorderLayout(边界布局管理器)
BorderLayout是Window及子类(Frame,Dialog)的默认布局管理器。它的组件布局效果,即将整个容器分为:东,西,南,北,中(East,West,South,North,Center)五部分,组件只能被添加到指定的区域,默认加的Center区域,每个区域只能加入一个组件。东、西为垂直缩放,南、北为水平缩放。常用的构造方法(1)publicBorderLayout():创建默认布局管理器。(2)publicBorderLayout(inth,intv):指定水平和垂直间距。五个方位常量BorderLayout.EAST(内容窗格的东边)、BorderLayout.WEST(内容窗格的西边)、BorderLayout.NORTH(内容窗格的北边)、BorderLayout.SOUTH(内容窗格的南边)、BorderLayout.CENTER(内容窗格的中间)布局管理器3GridLayout(网格布局管理器)
GridLayout布局管理器将容器区域划分成规则的矩形网格,每个单元格区域大小相等。组件被顺序地添加到每个单元格中,先按行从上到下,在同一行里按照从左至右填满一行。GridLayout是一种很有效的布局管理器。常用的构造方法(1)publicGridLayout():默认设置,所有组件在同一行中,各占一列。(2)publicGridLayout(introws,intcols):指定行数和列数。(3)publicGridLayout(introws,intcols,inth,intv):指定行数,列数和垂直,水平间距。布局管理器5箱式布局(BoxLayout)BoxLayout与其他布局管理器稍有不同,必须向其构造函数中传递容器实例的中组件的布局方式:垂直排列(按列)或水平排列(按行)。用水平组件和垂直组件的不同组合嵌套多面板的作用类似于GridBagLayout,但没那么复杂。BoxLayout管理器是用axis参数构造的,该参数指定了将进行的布局类型。有四个选择:X_AXIS
:从左到右水平布置组件。Y_AXIS
:从上到下垂直布置组件。LINE_AXIS
:根据容器的ComponentOrientation属性,按照文字在一行中的排列方式布置组件。如果容器的ComponentOrientation表示水平,则将组件水平放置,否则将它们垂直放置。对于水平方向,如果容器的ComponentOrientation表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上到下放置的。布局管理器5箱式布局(BoxLayout)PAGE_AXIS
:根据容器的ComponentOrientation属性,按照文本行在一页中的排列方式布置组件。如果容器的ComponentOrientation表示水平,则将组件垂直放置,否则将它们水平放置。对于水平方向,如果容器的ComponentOrientation表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上向下放置的。例:JPaneljp=newJPanel();BoxLayoutlayout=newBoxLayout(jp,BoxLayout.X_AXIS);jp.setLayout(layout);容器尺寸:如果使用垂直属性,容器高度为子组件高度之和,宽度为最宽子组件的宽度;使用水平属性,宽度为子组件宽度之和,高度为最高子组件的高度。布局管理器5箱式布局(BoxLayout)在这个例子中,一个BoxLayout布局管理器的实例layout被创建,这个实例被设置为panel的布局管理器,该布局管理器采用了水平排列来排列控件。当BoxLayout进行布局时,它将所有控件依次按照控件的优先尺寸按照顺序的进行水平或者垂直放置,假如布局的整个水平或者垂直空间的尺寸不能放下所有控件,那么BoxLayout会试图调整各个控件的大小来填充整个布局的水平或者垂直空间。BoxLayout往往和Box这个容器结合在一起使用,这么做的理由是,BoxLayout是把控件以水平或者垂直的方向一个接一个的放置,如果要调整这些控件之间的空间,就会需要使用Box容器提供的透明的组件作为填充来填充控件之间的空间,从而达到调整控件之间的间隔空间的目的。Box容器提供了4种透明的组件,分别是rigidarea、strut、glue、filler。Box容器分别提供了不同的方法来创建这些组件。这四个组件的特点如下:布局管理器5箱式布局(BoxLayout)@rigid:透明组件,rigidarea是一种用户可以定义水平和垂直尺寸的透明组件;@strut:struct
与rigidarea类似,但是用户只能定义一个方向的尺寸,即水平方向或者垂直方向,不能同时定义水平和垂直尺寸;@glue:透明组件,与刚性组件不同的是,胶水组件创建时不允许指定尺寸,当用户将glue放在两个控件之间时,它会尽可能的占据两个控件之间的多余空间,从而将两个控件挤到两边;因为胶水组件使用的是为占用的空间。@filler:filler是Box的内部类,它与rigidarea相似,都可以指定水平或者垂直的尺寸,但是它可以设置最小,最大和优先尺寸。实例代码:布局管理器5箱式布局(BoxLayout)importjava.awt.Dimension;importjavax.swing.*;publicclassBoxLayoutTestextendsJFrame{ JButtonjb1=newJButton("纵向按钮一");JButtonjb2=newJButton("纵向按钮二");JButtonjb3=newJButton("纵向按钮三");JButtonjb4=newJButton("横向按钮一");JButtonjb5=newJButton("横向按钮二");JButtonjb6=newJButton("横向按钮三");//privateJButton[]jb=newJButton[]{jb1,jb2,jb3,jb4,jb5};privateBoxbox2=Box.createHorizontalBox();//创建纵向Box容器privateBoxbox1=Box.createVerticalBox();//创建横向Box容器publicBoxLayoutTest(){ 布局管理器5箱式布局(BoxLayout)this.add(box1); box1.add(Box.createRigidArea(newDimension(300,0)));//Dimension类只是用来封装单个对象中组件的宽度和高度,此处表示jb1上方的距离
box1.add(jb1); box1.add(Box.createVerticalStrut(20));//添加高度为20的垂直支架,也就是jb1和jb2之间的距离 box1.add(jb2); box1.add(Box.createVerticalStrut(20)); box1.add(jb3); box1.add(Box.createVerticalGlue());box1.add(box2); box2.add(Box.createHorizontalGlue());//添加水平胶水,就是jb4与左边框的距离box2.add(jb4); 布局管理器5箱式布局(BoxLayout)box2.add(Box.createHorizontalStrut(20)); box2.add(jb5); box2.add(Box.createHorizontalStrut(20)); box2.add(jb6); box2.add(Box.createHorizontalGlue());//添加水平胶水,就是jb6与右边框的距离this.setTitle("箱式布局设置纵横两个箱子"); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setBounds(100,100,400,300);}publicstaticvoidmain(Stringargs[]){ newBoxLayoutTest();}}窗体和面板组件
在Java中,容器通常又可分为两类:顶级容器和普通容器。
顶级容器,是指不允许将其置入其他容器的容器,如窗体(JFrame)。
普通容器,是指其可以容纳其它小组件,而自身又可以被置入其它容器的容器,如面板(JPanel)。窗体和面板组件1窗体(JFrame)
窗体窗体(JFrame),也称之为框架,它是一种顶级容器。窗体通常用于开发桌面应用程序的主窗体和子窗体。它定义了一个包含标题条、系统菜单栏最大化/最小化按钮及可选菜单条的完整窗体。窗体一经定义,就会默认地被加载到系统屏幕上,因此窗体不能再被嵌套在另一个窗体内部。窗体和面板组件1窗体(JFrame)窗体的内部结构一般分为四个窗格:
RootPane
LayeredPane
ContentPane
GlassPane其中内容窗格与编程的关系最为紧密,因为它是窗体添加组件的直接途径。TitleJFrameMenuRootPaneLayeredPaneContentPaneMenuBarGlassPane窗体和面板组件1窗体(JFrame)
窗体默认的布局管理器是BorderLayout,默认组件添加位置是:
BorderLayout.CENTER。常用的构造方法(1)publicJFrame()throwsHeadlessException:构造一个不可见的新窗体。(2)publicJFrame(Stringtitle)throwsHeadlessException:
创建一个新的、初始不可见的、具有指定标题的Frame。窗体和面板组件1窗体(JFrame)窗体的常用方法(1)voidsetJMenuBar(JMenuBarmenubar):设置此窗体的菜单栏。(2)publicvoidsetLayout(LayoutManagermanager):设置LayoutManager。(3)Componentadd(Componentcomp):将指定组件追加到此容器的尾部。(4)ContainergetContentPane():返回此窗体的ContentPane对象。(5)ContainergetJMenuBar():返回此窗体上设置的菜单栏。(6)voidremove(Componentcomp):从该容器中移除指定组件。(7)staticvoidsetDefaultCloseOperation(intoperation):设置用户在此窗体上点击“close”时的默认操作。(8)voidsetIconImage(Imageimage):设置要作为此窗体图标显示的图像。窗体和面板组件2面板(JPanel)
面板面板(JPanel),是一种有效的普通容器。面板通常可以装载一些小组件(如按钮、标签等),同时它又可以容纳其它面板。Java中一种常见的GUI设计模式就是把小组件置于面板中,再把面板加载到窗体的内容窗格(ContentPane)中。JPanel的缺省布局管理器为流式布局管理器。面板(JPanel)的重要构造方法:(1)publicJPanel():创建一个具有默认流式布局管理器的面板。(2)publicJPanel(LayoutManagerlayout):创建一个指定布局管理器的面板。窗体和面板组件2面板(JPanel)窗体和面板的一个简单应用如下:JFrameframe=newJFrame("FrameWithPanel");frame.getContentPane().setBackground(Color.CYAN);//背景设置为蓝绿色JPanelpanel=newJPanel();//创建一个JPanel的实例panel.setBackground(Color.yellow);//将JPanel的实例背景设置为黄色frame.getContentPane().add(panel,BorderLayout.SOUTH);//将JPanel实例添加到JFrame的南侧frame.setSize(300,200); frame.setVisible(true);按钮和标签组件1按钮类(JButton)按钮是一个常用组件,Swing中提供JButton类来创建一个按钮,并且可以带标签或图象,效果如图所示。按钮和标签组件1按钮类(JButton)JButton类的主要构造方法(1)JButton(Iconicon):构造方法1,按钮上显示图标。(2)JButton(Stringtext):构造方法2,按钮上显示字符。(3)JButton(Stringtext,Iconicon):构造方法3,按钮上显示图标和字符。(4)JButton(Actiona):构造方法4,按钮的属性从所提供的Action中获取。JButton类的常用方法(1)voidsetIcon(IcondefaultIcon):设置按钮的默认图标。(2)voidsetText(Stringtext):设置按钮的文本。(3)voidsetEnabled(booleanb):启用(或禁用)按钮。按钮和标签组件2标签类(JLabel)标签(JLabel)是最简单的显示静态文本的功能组件,可以起到信息说明的作用。程序可以改变文本,但运行时用户不能改变其显示的文本内容,其效果如图所示。按钮和标签组件2标签类(JLabel)JLabel组件有三种构造方法(1)JLabel():用于创建一个空字符的标签组件。(2)JLabel(Stringcaption):用于创建一个指定字符串的标签组件。(3)JLabel(Stringcaption,intalignment):用于创建一个指定字符串,并且按一定方式对齐的标签,其中参数alignment的值包括LEFT(左对齐)、RIGHT(右对齐)、CENTER(居中对齐),Label默认对齐方式是左对齐方式。JLabel类的常用方法(1)voidsetText(Stringcaption):设置Label的显示文本内容。(2)StringgetText():获取当前的Label文本。(3)voidsetAlignment(intaligment):设置当前Label的对齐方式。按钮和标签组件使用窗体、面板、按钮、标签等基本界面元素构成界面。知识应用11.1图形用户界面核心概念容器可以容纳GUI部件(按某种布局)
窗体、面板
部件部署在容器中,实现某种交互。
文本框、按纽、标签等GUI部件
♣
第1步创建窗体方法1:
Framef=newFrame("标题")方法2:classMyFrameextendsFrame….Framef=newMyFrame("标题")让窗体可见f.setSize(200,300);f.setVisible(true);♣
第2步创建GUI部件创建按钮、标签Buttonb=newButton(“计数”);Labeldis=newLabel(“…0…”);…0…♣
第3步将部件加入窗体容器布局设置
setLayout(newFlowLayout())
加入部件add(b);add(dis);…0…♣
第4步
处理事件事件处理
委托事件处理模型事件源将事件委托给事件监听者处理事件监听者负责处理事件
符合相应接口要求事件源发生事件单击事件委托处理—图button.addActionListener(ActionListenera
);
12单击3(1)事件源对象的容器类作为监听者
addActionListener(this);
(2)用内嵌类实现
addActionListener(newProcess());♣
谁作为监听者合适?
要其actionPerformed方法中方便访问事件处理相关对象(3)用匿名内嵌类实现
addActionListener(newActionListener(){…..});表11-1AWT事件接口及处理方法描述信息接口名称方法(事件)点击按钮、点击菜单项、文本框按回车等动作ActionListeneractionPerformed(ActionEvent)选择了可选项的项目ItemListeneritemStateChanged(ItemEvent)文本部件内容改变TextListenertextValueChanged(TextEvent)移动了滚动条等部件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠标移动MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠标点击等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)键盘输入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)部件收到或失去焦点FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)部件移动、缩放、显示/隐藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)窗口事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)容器增加/删除部件ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)♣
区分事件源
编写一个窗体应用程序,在窗体中安排两个文本框,一个标签,两个标记为“+”和“*”的按钮,从两个文本框输入两个数,点击“+”按钮将文本框中两个数进行加法运算,结果显示在标签中;点击“*”按钮将文本框中两个数进行乘法运算,结果显示在标签中。♣
在动作事件处理代码中区分事件源
getSource()
用来获取事件源对象。
getActionCommand()结果为字符串,用来获取按钮事件对象的命令名
ActionEvent对象提供方法♥
关键代码publicvoidactionPerformed(ActionEvente){intx1=Integer.parseInt(f1.getText());intx2=Integer.parseInt(f2.getText());if(e.getActionCommand().equals("+"))
res.setText(""+(x1+x2));elseres.setText(""+(x1*x2));}♥
或者publicvoidactionPerformed(ActionEvente){intx1=Integer.parseInt(f1.getText());intx2=Integer.parseInt(f2.getText());if(e.getSource()==b1)
res.setText(""+(x1+x2));elseres.setText(""+(x1*x2));}假设,将b1定为实例变量b1=newButton(“+”);♣关于事件适配器类
Java中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter,在该类中以空方法体实现了相应接口的所有方法程序员设计可通过继承适配器类来编写监听者类,在类中只需给出关心的方法。
例
处理窗体的关闭classMyFrameextendsFrameimplementsActionListener{
public
MyFrame(){
super("测试窗体关闭");
Buttonbtn=newButton("关闭");
setLayout(newFlowLayout());
add(btn);
btn.addActionListener(this);
addWindowListener(newcloseWin());
setSize(300,200);
setVisible(true);}
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("关闭")){
dispose();
}
}
}classcloseWinextendsWindowAdapter{
publicvoidwindowClosing(WindowEvente){
Windoww=e.getWindow();
w.dispose();
}
}只要写自己关心的方法♣
项目1.编写一个窗体应用,窗体中安排1个按钮,点击按钮让按钮的背景颜色随机变化。2.设有一批英文单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。FlowLayout(流式布局)
BorderLayout(边缘或方位布局)
GridLayout(网格布局)
CardLayout(卡片式布局)
GridBagLayout(网格块布局)
容器与布局管理FlowLayout(流式布局)
是Panel的默认布局
从上到下、左到右排放,放不下再换至下一行
不会改变控件的大小。
按照参数要求安排部件间的纵横间隔和对齐方式
publicFlowLayout()居中对齐方式,组件纵横间隔5个像素。publicFlowLayout(intalign,inthgap,intvgap)3个参数分别指定对齐方式、纵、横间距publicFlowLayout(intalign)
参数规定对齐方式,组件纵横间距默认5个像素。【例】大小不断递增的9个按钮放入窗体中publicFlowLayoutExample(){ setLayout(newFlowLayout(FlowLayout.LEFT,10,10)); Stringspaces="";//用来使按钮的大小变化 for(inti=1;i<=9;i++){ add(newButton("B#"+i+spaces)); spaces+=""; } }放大窗体后BorderLayout(边缘或方位布局)
是Frame的默认布局将容器内部空间分为东(East)、南(South)、西(West)、北(North)、中(Center)五个区域
控件的大小随容器大小改变。
按照参数要求安排部件间的纵横间隔和对齐方式
publicBorderLayout()各组件之间的纵横间距为0publicBorderLayout(inthgap,intvgap)2个参数分别指定纵、横间距加入组件add(方位名字符串,组件)
String[]borders={"North","East","South","West","Center"};
setLayout(newBorderLayout(10,10));
for(inti=0;i<5;i++){
add(borders[i],newButton(borders[i]));
}
【例
】实现一个简单的图像浏览窗体,部署“上一张”、“下一张”两个按钮,单击按钮可前后翻阅图片。importjava.awt.*;importjava.awt.event.*;publicclassShowAnimatorextendsFrameimplementsActionListener{Image[]m_Images; //保存图片序列的Image数组inttotalImages=18;//图片序列中的图片总数为18intpos=0;//当前显示图片的序号Buttonb1,b2;publicShowAnimator(){m_Images=newImage[totalImages];Toolkitt=getToolkit();for(inti=0;i<totalImages;i++)m_Images[i]=t.getImage("images\\image"+i+".gif");用Tookit对象的getImage方法获取图像图像路径相对Java应用程序位置b1=newButton("上一张");b2=newButton("下一张");//setLayout(newBorderLayout());Paneloperate=newPanel();operate.setLayout(newFlowLayout(FlowLayout.CENTER));operate.add(b1);operate.add(b2);add("South",operate); //操作控制面板安排在底部b1.addActionListener(this);b2.addActionListener(this);}publicvoidpaint(Graphicsg){g.drawImage(m_Images[pos],50,50,this);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==b1) //区分事件源{if(pos>0)pos=--pos; //上一张}else
pos=++pos%totalImages; //下一张repaint();}publicstaticvoidmain(Stringa[]){Framem=newShowAnimator();m.setSize(200,200);m.setVisible(true);}}GridLayout布局
把容器的空间分为若干行乘若干列的网格区域组件按从左向右,从上到下的次序被加到各单元格中组件的大小将调整为与单元格大小相同。♣
GridLayout构造方法publicGridLayout()
所有组件在一行中。
publicGridLayout(introws,intcols)通过参数指定布局的行和列数。
publicGridLayout(introws,intcols,inthgaps,intvgaps)指定划分的行列数以及组件间的水平和垂直间距。add(组件名)
♣
GridLayout布局—加入组件
setLayout(newGridLayout(3,3,10,10));
for(inti=1;i<=9;i++)
add(newButton("Button#"+i));【例】布局修改
思考:如何布局?CardLayout布局
加入的部件叠成卡片的形式
组件加入
add(字符串,组件名)其中,字符串用来标识卡片名称。构造方法publicCardLayout()
显示组件将占满整个容器,不留边界。
publicCardLayout(inthgap,intvgap)容器边界分别留出水平和垂直间隔,组件占中央。♣
CardLayout布局---卡片翻动show(容器,字符串):显示指定名称的卡片
first(容器)
:显示第一块卡片
last(容器)
:显示最后一块卡片next(容器)
:显示下一块卡片常用GUI部件♣
Component类(抽象类)ColorgetBackground():
获取部件的背景色FontgetFont():
获取部件的显示字体GraphicsgetGraphics():获取部件的Graphics属性对象voidrepaint(intx,inty,intwidth,intheight):对部件的特定区域进行重新绘图voidsetBackground(Colorc):设置部件的背景voidsetEnabled(booleanb):
是否让部件功能有效
voidsetFont(Fontf):
设置部件的显示字体voidsetSize(intwidth,intheight):
设置部件大小voidsetVisible(booleanb):
设置部件是否可见voidsetForeground(Colorc):
设置部件的前景色voidrequestFocus():让部件得到焦点
voidadd(PopupMenupopup):给部件加入弹出菜单1.文本框只能编辑一行数据构造方法有四种:
TextField():构造一个单行文本输入框。
TextField(int):指定长度的单行文本输入框。TextField(String):指定初始内容的单行文本输入框。
TextField(String,int):指定长度、指定初始内容。
tf1=newTextField();
tf2=newTextField("",20);
tf3=newTextField("Hello!");
tf4=newTextField("Hello",30);
文本框与文本域2.文本域(TextArea)特点1:可以编辑多行文字
构造方法有四种:
TextArea():构造一个文本域。
TextArea(int,int):构造一个指定长度和宽度的文本域。TextArea(String):构造一个显示指定文字的文本域。TextArea(String,int,int):按指定长度、宽度和默认值构造文本域。常用方法:setEchoChar(‘*’)
设置回显字符
getText()
:获取输入框中的数据
setText()
:往输入框写入数据isEditable():判断输入框是否可编辑。
voidselect(intstart,intend):选定由开始和结束位置指定的文本。voidselectAll():选定所有文本。3.文本部件的常用方法以下方法只限于文本域append(Strings):将字符串添加到文本域的末尾insert(Strings,intindex):将字符串插入到文本域的指定位置4.文本框(TextField)事件
ActionEvent事件在文本框按回车键时引发注册:addActionListener();接口:ActionListener
方法:publicvoidactionPerformed(ActionEvente)
TextEvent事件对文本输入部件数据更改操作
(添加、修改、删除)注册:addTextListener()接口:TextListener方法:
publicvoidtextValueChanged(TextEvente)
♣
练习:验证密码域只能输入数字字符
publicvoidtextValueChanged(TextEvente){
Strings=pass.getText();
charlast=s.charAt(s.length()-1);
if(!Character.isDigit(last)){
hint.setText("只能是数字,重输:");
pass.setText("");
}
}
【例】在图形界面中,安排一个文本框和文本域。将文本框键入字符同时显示在文本域中。
importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassTextInextendsFrameimplementsTextListener,ActionListener{TextFieldtf;TextAreata;Stringpre=""; //记录文本域的先前内容publicTextIn(){tf=newTextField(20);ta=newTextArea(8,20);add("South",tf);add("Center",ta);
tf.addTextListener(this); tf.addActionListener(this);}publicvoidtextValueChanged(TextEvente){Strings=tf.getText();ta.setText(pre+s);//更新文本域内容}publicvoidactionPerformed(ActionEvente){tf.setText(""); //清空文本框ta.append("\n"); //添加一个换行符pre=ta.getText();}publicstaticvoidmain(Stringa[]){...//创建窗体并可见}}鼠标事件
共有7种情形,用MouseEvent类的同名静态整型常量标志,分别是:MOUSE_DRAGGEDMOUSE_ENTEREDMOUSE_EXITEDMOUSE_MOVEDMOUSE_PRESSEDMOUSE_RELEASEDMOUSE_CLICKED♣鼠标事件的处理接口MouseListener
负责接收和处理鼠标的press(按下)、release(释放)、click(点击)、enter(移入)和exit(移出)动作触发的事件;MouseMotionListener
负责接收和处理鼠标的move(移动)和drag(拖动)动作触发的事件。
♣
MouseEvent类publicintgetX():返回发生鼠标事件的X坐标。
publicintgetY():返回发生鼠标事件的Y坐标。
publicPointgetPoint():返回Point对象,也即鼠标事件发生的坐标点。
publicintgetClickCount():返回鼠标点击事件的连击次数。高级语义事件和低级语义事件常见的低级语义事件有:组件事件(ComponentEvent):组件尺寸的变化,移动;容器事件(ContainerEvent):容器中组件增加,移除;窗口事件(WindowEvent):关闭窗口,图标化;焦点事件(FocusEvent):焦点的获得和丢失;键盘事件(KeyEvent):键按下、释放;鼠标事件(MouseEvent):鼠标单击,移动等。高级语义事件以组件为基础;例如:按钮上动作事件。低级语义事件具有更广泛性:例如:按钮上鼠标移动、点击、进入等。低级语义事件先于高级语义事件发生。例
围棋对弈界面设计#01importjava.awt.*;#02importjava.awt.event.*;#03publicclasschessGameextendsFrame{#04 chessBoardb=newchessBoard();#05
#06 publicchessGame(){#07 setBackground(Color.lightGray);#08 setLayout(newBorderLayout());#09 add(“Center”,b);//棋盘#10 Panelp=newPanel();#11 Buttonpass=newButton("放弃一手");#12 Buttoncolor=newButton("变棋盘背景");#13 Buttonfail=newButton("认输");#14 Buttonback=newButton("悔棋");#15 p.setLayout(newGridLayout(8,1,10,10));部署界面 p.add(newLabel());//插入一个空标签 p.add(pass); p.add(color); p.add(fail); p.add(back); add(“East”,p); setSize(500,450); setVisible(true); } publicstaticvoidmain(String[]args){ newchessGame(); }}部署界面classchessBoardextendsCanvas{ intchess[][]=newint[19][19];//存放棋盘子的状态 intsx=20,sy=20;//棋盘左上角位置 intw=20;//棋盘每个格子宽度 intcx=50;//下棋位置游标的初值,对应鼠标移动位置 intcy=50; intplayer=1;//1表示轮黑下子,0表示轮白下子 publicchessBoard(){ this.addMouseMotionListener(newMouseMotionAdapter(){鼠标移动则红色小方框跟随 publicvoidmouseMoved(MouseEvente){ Graphicsg=getGraphics();
g.setXORMode(chessBoard.this.getBackground()); g.setColor(Color.red);
g.fillRect(cx-w/4,cy-w/4,w/2,w/2);
cx=sx+(e.getX()-sx+w/2)/w*w; cy=sy+(e.getY()-sy+w/2)/w*w;
g.fillRect(cx-w/4,cy-w/4,w/2,w/2); } }); this.addMouseListener(newMouseAdapter(){ publicvoidmouseClicked(MouseEvente){//鼠标点击表示下子 Graphicsg=getGraphics();鼠标移动则红色小方框标记跟随
if(chess[(cx-sx)/w][(cy-sy)/w]==0) if(player==1){ g.setColor(Color.black);//黑棋 chess[(cx-sx)/w][(cy-sy)/w]=1; }else{ g.setColor(Color.white);//白棋 chess[(cx-sx)/w][(cy-sy)/w]=2; } g.fillOval(cx-w/2+1,cy-w/2+1,w-2,w-2); player=(player+1)%2;//黑白方轮流下子 g.setXORMode(chessBoard.this.getBackground()); g.setColor(Color.red);//用异或方式绘制小游标 g.fillRect(cx-w/4,cy-w/4,w/2,w/2); }} });}绘制刚下的棋子 publicvoidpaint(Graphicsg){ for(intk=0;k<19;k++)//绘制棋盘 g.drawLine(sx,sy+k*w,sx+w*18,sy+k*w); for(intk=0;k<19;k++) g.drawLine(sx+k*w,sy,sx+k*w,sy+w*18);
for(inti=0;i<chess.length;i++)
for(intj=0;j<chess[0].length;j++){ if(chess[i][j]==1){ g.setColor(Color.black); g.fillOval(sx+i*w-w/2+1,sx+j*w-w/2+1,w-2,w-2);二重循环控制绘制所有棋子 }elseif(chess[i][j]==2){ g.setColor(Color.white); g.fillOval(sx+i*w-w/2+1,sx+j*w-w/2+1, w-2,w-2); } }
g.setXORMode(this.getBackground()); g.setColor(Color.red); g.fillRect(cx-w/4,cy-w/4,w/2,w/2); }}键盘事件
包含3个,分别对应KeyEvent类的几个同名的静态整型常量KEY_PRESSED、KEY_RELEASED、KEY_TYPED。监听者接口是KeyListenerpublicvoidkeyPressed(KeyEvente)
某个键按下时执行。publicvoidkeyReleased(KeyEvente)
某键被释放时执行。
publicvoidkeyTyped(KeyEvente)
按键被敲击。
KeyTyped包含keyPressed和KeyRelased两个动作
♣如何获取击键值getKeyChar()获取输入字符(对字符键)getKeyCode()获取键的编码(对控制键)键编码常量KeyEvent.VK_LEFT)按键为左箭头KeyEvent.VK_RIGHT)右箭头KeyEvent.VK_UP)向上箭头KeyEvent.VK_DOWN)向下箭头
例
小方框变色和移动importjava.awt.*;importjava.awt.event.*;publicclassKeyboardDemoextendsFrameimplementsKeyListener{staticfinalintSQUARE_SIZE=20; //小方框的边长ColorsquareColor; //小方框的颜色intsquareTop,squareLeft; //小方框的左上角坐标publicKeyboardDemo(){squareTop=100; //初始小方框位置squareLeft=100;squareColor=Color.red; //初始颜色设置为红色addKeyListener(this); //注册键盘事件监听repaint();}publicvoidpaint(Graphicsg){g.setColor(squareColor);g.fillRect(squareLeft,squareTop,SQUARE_SIZE,SQUARE_SIZE);}
/*用键盘控制小方块颜色的改变*/publicvoidkeyTyped(KeyEventevt){charch=evt.getKeyChar(); //获取输入字符if(ch=='B'||ch=='b'){squareColor=Color.blue;
repaint();}elseif(ch=='G'||ch=='g'){squareColor=Color.green;
repaint();}}/*用键盘控制小方块的移动*/publicvoidkeyPressed(KeyEventevt){
intkey=evt.getKeyCode(); //获取按键的编码if(key==KeyEvent.VK_LEFT){ //按键为左箭头squareLeft-=8;if(squareLeft<3)squareLeft=3;
repaint();}elseif(key==KeyEvent.VK_RIGHT){//按键为右箭头squareLeft+=8;if(squareLeft>getSize().width-3-SQUARE_SIZE)squareLeft=getSize().width-3-SQUARE_SIZE;
repaint();}elseif(key==KeyEvent.VK_UP){//按键为向上箭头squareTop-=8;if(squareTop<23)squareTop=23;
repaint();}elseif(ke
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔健康牙齿护理课件
- 小学生祈使句课件
- 基于大数据的2025年城市污水处理厂智能化改造水质预测报告
- 小学生知宪法课件
- 丽江公共安全管理办法
- 临停车位收费管理办法
- 企业产权处置管理办法
- 中铁质量检查管理办法
- 乡镇农村厨师管理办法
- 京东开发流程管理办法
- 2025至2030中国热成型钢(PHS)市场销售模式及未来投资风险评估报告
- oracle考试试题及答案
- 2025年浙江省中考数学试卷真题(含官方标准答案)
- 实验室留样管理制度
- 二造考试试题及答案
- T/CI 202-2023TBM 隧道工程智慧工地系统接口和集成技术规范
- 儿童疼痛课件
- 统编版 高中语文 高三第二轮复习诗词部分《八读法鉴赏诗词》教案
- 军事医学与战场救护试题及答案
- 制砂场管理制度
- 2025年全国中小学生天文知识竞赛试题库(共八套)
评论
0/150
提交评论