java课件 第10章01 GUI程序设计与Applet(共十套)_第1页
java课件 第10章01 GUI程序设计与Applet(共十套)_第2页
java课件 第10章01 GUI程序设计与Applet(共十套)_第3页
java课件 第10章01 GUI程序设计与Applet(共十套)_第4页
java课件 第10章01 GUI程序设计与Applet(共十套)_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章GUI程序设计与Applet(一)主要内容10.1GUI程序设计简介10.2基于Swing的界面设计10.3界面布局10.4Swing常用组件10.5Java的事件处理机制10.6键盘事件、鼠标事件处理GUI程序可以带给用户一种更直观、友好的界面;提供了用户一种更友好的交互方式,用户可以通过鼠标点击、拖动、键盘控制等更灵活的方式进行应用操作。

10.1GUI程序设计简介GUI包和简单GUI程序1.java.awt包Java语言在java.awt包中提供了大量地进行GUI设计所使用的类和接口,包括绘制图形、设置字体和颜色、控制组件、处理事件等内容,AWT是Java语言进行GUI程序设计的基础。2.javax.swing包Swing包是Java基础类库(JavaFoundationClasses,JFC)的一部分。Swing提供了从按钮到可分拆面板和表格的所有组件。Swing组件是Java提供的第二代GUI设计工具包,它以AWT为基础,在AWT内容的基础上新增或改进了一些GUI组件,使得GUI程序功能更强大,设计更容易、更方便。AWT组件和对应的Swing组件,从名称上很容易记忆和区别。例如,AWT的框架类、面板类、按钮类和菜单类,被命名为Frame、Panel、Button和Menu,而Swing对应的组件类被命名为JFrame、JPanel、JButton和JMenu。与AWT组件相比,Swing组件的名前多一个“J”。另外,AWT组件在java.awt包中,而Swing组件在javax.swing包中。GUI包和简单GUI程序一个简单的图形用户界面

在Java中,顶层窗口称为框架。在AWT库中,对应于框架的类是Frame,在Swing库中,相应的类是JFrame。JFrame类扩展了Frame类。框架是一个容器,我们可以在这个容器中放入其他一些图形用户界面组件,如按钮、菜单等,从而组成一个功能完善的程序。

【例】显示一个空框架importjavax.swing.*;

publicclassFirstFrame{ publicstaticvoidmain(String[]args) {

SimpleFrameframe=newSimpleFrame();

//设置用户关闭框架时的响应动作

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//显示该框架frame.setVisible(true); }}

classSimpleFrameextendsJFrame{ publicSimpleFrame() {

//设置框架大小

setSize(WIDTH,HEIGHT); } publicstaticfinalintWIDTH=300; publicstaticfinalintHEIGHT=200; }

一个简单的图形用户界面

主要内容10.1GUI程序设计简介10.2基于Swing的界面设计10.3界面布局10.4Swing常用组件10.5Java的事件处理机制10.6键盘事件、鼠标事件处理10.2JFrame的继承结构

JFrame类的继承层次图

java.lang.Object

java.awt.Component

java.awt.Container

java.awt.Window

java.awt.Frame

javax.swing.JFrame

类JFrameJFrame是带有标题、边界、菜单的顶层windows窗口,JFrame的默认布局为BorderLayout。对JFrame添加组件有两种方式:

通过add()方法直接添加组件到JFrame使用getContentPane()方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(组件)类JFrame主要方法

getContentPane()返回此窗体的contentPane对象(内容面板,组件要添加到此)getJMenuBar()

返回此窗体上设置的菜单栏。setIconImage(Image

image)设置要作为此窗口图标显示的图像。setJMenuBar(JMenuBar

menubar)设置此窗体的菜单栏。publicvoidsetBounds(inta,intb,intwidth,intheigth)publicvoidsetSize(intwidth,intheigth)publicvoidsetLocation(intx,inty)publicvoidsetVisible(booleanb)publicvoidsetResizable(booleanb)//是否允许调大小

类JFrame其它方法

【例】创建一个swing外观的并居中的窗体importjavax.swing.*;importjava.awt.*;publicclassmainFrameextendsJFrame{publicmainFrame(StringsTitle,intiWidth,intiHeight){Dimensiondim=Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕尺寸

ImageIconii=newImageIcon("images/middle.gif");setTitle(sTitle);//设置窗体标题

setIconImage(ii.getImage());//设置窗体的图标

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置关闭窗体时退出程序

功能增强的的图形用户界面

setSize(iWidth,iHeight);//设置窗体大小

intw=getSize().width;//获取窗体宽度

inth=getSize().height;//获取窗体高度

System.out.println("窗体宽:"+w+"窗体高:"+h);intx=(dim.width-w)/2;inty=(dim.height-h)/2;setLocation(x,y);//将窗体移到屏幕中间

setVisible(true);//显示窗体

}publicstaticvoidmain(String[]args){//JFrame.setDefaultLookAndFeelDecorated(true);//使用最新SWING外观mainFramemF=newmainFrame("mainFrameDemo",400,300);}}功能增强的的图形用户界面

setDefaultCloseOperation()方法的参数DO_NOTHING_ON_CLOSE:不执行任何操作。HIDE_ON_CLOSE:调用后自动隐藏该窗体。DISPOSE_ON_CLOSE:调用后自动隐藏并关闭该窗体。EXIT_ON_CLOSE:使用Systemexit方法退出应用程序。除JFrame外的其它顶层容器JDialog:和JFrame类似,只不过JDialog是用来设计对话框。JApplet:用来设计可以在嵌入在网页中的Java小程序。JWindow:不带修饰的窗体,无最大、最小按钮和标题栏功能增强的的图形用户界面

【例】在一个框架窗口中显示两个标签和一个按钮:上面的标签显示一串固定的文字信息,选择按钮后在下面的标签上显示系统现在的时间。示例程序一个完整的JavaGUI程序(1)引入合适的包和类一般的SwingGUI程序应包含三个import语句,分别表示引入awt包、awt.event包和swing包。(2)设置一个顶层的容器(3)根据需要,使用缺省的布局管理器或设置其它的布局管理器(5)定义组件并将它们添加到容器(6)对组件或事件编码基于Swing的界面设计流程主要内容10.1GUI程序设计简介10.2基于Swing的界面设计10.3界面布局10.4Swing常用组件10.5Java的事件处理机制10.6键盘事件、鼠标事件处理10.3布局管理器在容器中所有组件的布局(位置和大小)由布局管理器来控制。Java语言中提供了FlowLayout、BorderLayout、GridLayout、CardLayout和GridBagLayout等多种布局管理器。每种容器都有自己缺省的布局管理器,JFrame的缺省布局管理器是BorderLayout,如果不希望使用缺省的布局管理器,则可使用setLayout()方法来改变缺省的布局管理器。FlowLayoutFlowLayout组件的放置规律是从上到下、从左到右进行放置,如果当前行已放置不下该组件,则放置到下一行的最左边。

FlowLayout布局模式:

setLayout(new

FlowLayout());//默认居中setLayout(newFlowLayout(FlowLayout.RIGHT));//右对齐BorderLayout

BorderLayout布局把界面分成5个区域:North,South,East,West和Center,每个区域只能放置一个组件。当界面的大小发生变化时,其变化规律为:组件的相对位置不变,大小发生变化。

BorderLayout布局示例public

class

BorderLayoutDemo

extendsJFrame{

publicBorderLayoutDemo(){

super("网格布局");

this.setSize(300,200);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(newBorderLayout());JButtonbtnEast=newJButton("东");JButtonbtnSouth=newJButton("南");JButtonbtnWest=newJButton("西");JButtonbtnNorth=newJButton("北");JButtonbtnCenter=newJButton("中");add(btnEast,BorderLayout.EAST);add(btnCenter,BorderLayout.CENTER);add(btnWest,BorderLayout.WEST);add(btnSouth,BorderLayout.SOUTH);add(btnNorth,BorderLayout.NORTH);}

public

static

voidmain(String[]args){BorderLayoutDemoBorderFrame=newBorderLayoutDemo();BorderFrame.setVisible(true);}}GridLayoutGridLayout布局管理器将整个界面划分成N行,M列的网格,每个网格的大小相同。布局时,按照组件加入的顺序优先考虑按行布局,当一行布局满之后再布局下一行Framef=newFrame("GridLayoutDemo");

f.setLayout(newGridLayout(2,3));

//容器平均分成2行3列共6格GridLayout布局模式 publicstaticvoidmain(String[]args) { ch52f=newch52(); ContainercontentPane=f.getContentPane();

contentPane.setLayout(newGridLayout(4,5)); for(inti=1;i<=4;i++) { for(intj=1;j<=5;j++) { contentPane.add(newJButton(i+"行"+j+"列")); } } f.setVisible(true); }}GridBagLayoutGridBagLayout同GridLayout一样,在容器中以网格形式来管理组件,但GridBagLayout功能要来得强大得多。1、GridBagLayout管理的所有行和列都可以是大小不同的;2、GridLayout把每个组件限制到一个单元格,而GridBagLayout并不这样:组件在容器中可以占据任意大小的矩形区域。GridBagLayout通常由一个专用类来对他布局行为进行约束,该类叫GridBagConstraints。示例CardLayout将容器中的每个组件看作一张卡片。一次只能看到一张卡片,容器则充当卡片的堆栈。当容器第一次显示时,第一个添加到CardLayout对象的组件为可见组件。add(Component

comp):添加组件到容器first(Container

parent)翻转到容器的第一张卡片。last(Container

parent)翻转到容器的最后一张卡片。next(Container

parent)翻转到容器的下一张卡片。previous(Container

parent)翻转到前一张卡片。show(Container

parent,String

name)翻转到具有指定name的组件。NULL布局控件指定位置显示,利用如下方法输出PublicvoidsetBounds(intx,inty,intwidth,intheight)即自行设定窗体和控件的大小和位置publicclassch9_54extendsJFrameimplementsActionListener{ JLabell1; JButtonb1; JTextFieldt1,t2,t3; publicch9_54(){ super("布局模式"); setBounds(20,20,500,300);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ContainercontentPane=getContentPane();

contentPane.setLayout(null); b1=newJButton("="); l1=newJLabel("+"); t1=newJTextField(20); t2=newJTextField(20); t3=newJTextField(20); t1.setForeground(Color.red); t1.setBackground(Color.cyan); t1.setBounds(20,100,100,40); contentPane.add(t1); NULL布局示例l1.setBounds(120,100,40,40); contentPane.add(l1); t2.setBounds(160,100,100,40); contentPane.add(t2); b1.setBounds(260,100,80,40); contentPane.add(b1); t3.setBounds(340,100,100,40); contentPane.add(t3); b1.addActionListener(this); setVisible(true); }publicstaticvoidmain(String[]args){ ch9_54f=newch9_54(); }publicvoidactionPerformed(ActionEvente) { //自行实现加法代码

}}NULL布局示例主要内容10.1GUI程序设计简介10.2基于Swing的界面设计10.3界面布局10.4Swing常用组件10.5Java的事件处理机制10.6键盘事件、鼠标事件处理10.4Swing常用组件(1)顶层容器JFrame、JApplet、JDialog、JWindows(2)JPanel面板容器JPanel是一种添加到其他容器使用的容器组件,可将组件添加到JPanel,然后再将JPanel添加到某个容器。默认是FlowLayout布局管理器有效的利用Panel可以使版面管理更为容易。参见P204例10.7(3)JTabbedPaneJTabbedPane继承于javax.swing.JComponent,它是一组带标签的面板,每个面板可以存放组件,因此JTabbedPane是一容器组件。addTab(String

title,Component

component)添加一个由title表示,且没有图标的component。getSelectedIndex()返回当前选择的此选项卡窗格的索引。10.4Swing常用组件importjava.awt.BorderLayout;importjavax.swing.*;publicclassJtabTest{staticvoidaddIt(JTabbedPanetabbedPane,Stringtext){JLabellabel=newJLabel(text);JButtonbutton=newJButton(text);JPanelpanel=newJPanel();panel.add(label);panel.add(button);tabbedPane.addTab(text,panel);}JTabbedPane使用

publicstaticvoidmain(Stringargs[]){JFramef=newJFrame("JTabbedPaneSample");f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JTabbedPanetabbedPane=newJTabbedPane();addIt(tabbedPane,"TabOne");addIt(tabbedPane,"TabTwo");addIt(tabbedPane,"TabThree");f.add(tabbedPane,BorderLayout.CENTER);f.setSize(300,200);f.setVisible(true);}}(4)其它组件a)JLabelb)JButtonc)JTextFieldd)JTextAreae)JPasswordFieldf)JRadioButtong)JCheckButton

h)JSlider滚动条i)JListJ)JFileChooserk)JScollBarl)JMenuBar,JMenu,JMenuItem,JCheckMeunItem,JRadioMenuItem,JPopupMenum)JOptionPane模式对话框10.4Swing常用组件Swing组件示例程序JFileChooser,JMenuBar案例JCheckBox,JRadioButton案例主要内容10.1GUI程序设计简介10.2基于Swing的界面设计10.3界面布局10.4Swing常用组件10.5Java的事件处理机制10.6键盘事件、鼠标事件处理10.5什么是事件Event(事件)事件,就是发生在用户界面上的用户交互行为所产生的一种效果。EventSource(事件源)产生事件的对象。Eventhandler/Listener(事件处理器)接收事件对象并对其进行处理的方法。图示说明importjava.awt.*;importjava.awt.event.*;publicclassTestButton{

publicstaticvoidmain(Stringargs[]) {Framef=newFrame("Test");Buttonb=newButton("PressMe!");b.addActionListener(newButtonHandler());f.setLayout(newFlowLayout());f.add(b); f.setSize(200,100);f.setVisible(true);}}事件处理示例classButtonHandlerimplementsActionListener{ publicvoidactionPerformed(ActionEvente) { System.out.println("Actionoccurred"); }}事件处理示例(1)对于某种类型的事件XXXEvent,定义相应的事件监听器类,该类需要实现针对特定事件的特定接口XXXListener;例如:ActionEventActionListener(2)事件源中产生事件后,必须注册相应于该类事件的监听器,使用addXXXListener(XXXListener)来注册监听器。(3)事件发生后,产生表示特定事件的事件对象,事件对象被传递给已经注册的事件监听器,调用监听器中的特定方法处理事件进行事件处理的一般方法事件体系结构FocusEventAWTEventActionEventAdjustmentEventComponentEventTextEventItemEventContainerEventInputEventWindowEventPaintEventKeyEventMouseEventEventObject事件类与对应的监听器接口

事件类型接口名要实现方法ActionEventActionListeneractionPerformed(ActionEvent)ItemEventItemListeneritemStateChanged(ItemEvent)MouseEventMouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)MouseEventMouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)KeyEventKeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)FocusEventFocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)AdjustmentEventAdjustmentListeneradjustmentValueChanged(AdjustmentEvent)ComponentEventComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)事件类与对应的监听器接口

WindowEventWindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)WindowDeiconified(WindowEvent)WindowClosed(WindowEvent)WindowActivated(WindowEvent)WindowDeactivated(WindowEvent)ContainerEventContainerListenercomponentAdded(ContainerEvent)ComponentRemoved(ContainerEvent)TextEventTextListenerTextValueChanged(TextEvent)事件类与对应的监听器接口

事件处理方式事件处理中最关键的是通过addXXXListener(XXXListener)来注册监听器,这可以通过三种方式实现:(1)利用监听器类实现事件处理先定义监听器类,然后对要求发生动作的组件再注册到这个监听器类的对象中publicclass自定义监听类名implements事件监听器(或extends事件适配器){

……publicvoid监听器接口说明的方法1(){……}……publicvoid监听器接口说明的方法n(){……}}publicclass事件发生类名{…

组件.addXXXListener(new自定义监听类名());//注册组件到监听器对象

…}示例程序通过监听器类实现事件监听通过implements实现事件监听接口的问题在于:每次必须实现该接口中所有方法,不论是否需要。事件适配器是实现了不同监听接口的类,它最主要的作用,就是可以简化监听器接口不必要的事件处理。比如,MouseListener接口有5个方法,如果在某应用中只需要其中的一个方法,那么就可以定义一个事件适配器来实现这个特定的方法即可。通过事件适配器实现事件监听事件适配器(EventAdapters)事件适配器事件监听器ComponentListenerComponentAdapterContainerListenerContainerAdapterFocusListenerFocusAdapterKeyListenerKeyAdapterMouseListenerMouseAdapterMouseMotionListenerMouseMotionAdapterWindowFocusListenerWindowAdapter(2)利用内部类实现事件处理这种方法就是将独立的监听器类定义成事件发生类的内部类。publicclass外部类{……组件.addXXXListener(new自定义监听类名());…class自定义监听类名extends事件适配器(或implements事件监听器){//定义内部监听器类

……publicvoid监听器接口说明的方法1(){……}publicvoid监听器接口说明的方法n(){……}}//结束内部类}}//结束外部类事件处理方式(3)利用匿名内部类实现事件处理组件对象.addXXXListener(new事件监听器(){//定义匿名内部类

publicvoid监听器接口说明的方法1(){……}publicvoid监听器接口说明的方法n(){……} });//结束匿名类定义事件处理方式利用匿名内部类实现事件处理示例classMyPanelextendsPanel{

publicMyPanel(){

ButtonbButton=newButton("蓝色");

add(bButton);bButton.addMouseListener(newMouseAdapter(){

publicvoidmouseClicked(MouseEventmevent){setBackground(Color.blue);repaint();

}

});}主要内容10.1GUI程序设计简介10.2基于Swing的界面设计10.3界面布局10.4Swing常用组件10.5Java的事件处理机制10.6键盘事件、鼠标事件处理在按下或释放键盘上的一个键时,将生成键盘事件。keyEvent

类包含用来表示按下或点击的键的常量。生成keyEvent

时将调用keyListener。如果程序需要处理特殊的键,如方向键,需要通过调用keyPressed()方法来处理。键盘事件publicvoidkeypressed(keyEventk){intkeyCode=k.getKeyCode();if(keyCode==k.VK_RIGHT&&k.isShiftDown()){...}}检测用户是否按下了Shift+右箭头键

键盘事件示例classMyPanelextendsPanel{publicMyPanel(){TextFieldtField=newTextField(20);add(tField);

MyKeyAdapterbAction=newMyKeyAdapter();tField.addKeyListener(bAction);}

privateclassMyKeyAdapterext

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论