Java语言程序设计基础教程(中)ppt.ppt_第1页
Java语言程序设计基础教程(中)ppt.ppt_第2页
Java语言程序设计基础教程(中)ppt.ppt_第3页
Java语言程序设计基础教程(中)ppt.ppt_第4页
Java语言程序设计基础教程(中)ppt.ppt_第5页
已阅读5页,还剩218页未读 继续免费阅读

下载本文档

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

文档简介

Java程序设计基础教程 第1章Java程序设计概述第2章Java基本的程序设计结构第3章类和对象第4章继承 接口和内部类第5章JavaAPI第6章Java程序设计概述第7章多线程第8章文件和流第9章异常处理第10章Java网络编程第11章JavaApplet基础第12章常见数据结构的Java实现第13章Java数据库连接 JDBC第14章Java多媒体编程 图形 图像和声音 第6章Java程序设计概述 6 1Java的GUI6 2用AWT生成图形化用户界面6 3常用容器6 4布局管理器6 5AWT事件处理模型6 6AWT常用组件 6 1Java的GUI 图形用户界面 Graphicsuserinterface GUI 是指用图形的方式 借助菜单 按钮等标准界面元素和鼠标操作 帮助用户方便地向计算机系统发出指令 启动操作 并将系统运行的结果以图形方式显示给用户的技术 目前Java主要提供了两个处理图形用户界面的类库 java awt和javax swing AWT 抽象窗口工具集 AbstractWindowsToolkit 由于Java代码可以在不同的系统平台运行 而不同平台的图形界面外观设计各有差异 所以Java程序的图形用户界面在不同的平台上可能出现不同的运行效果 其外观取决于具体的平台 所以称AWT是一个抽象的工具集 Swing Swing是在AWT的基础上构建的 提供了比标准AWT组件更强大和灵活的功能 与AWT组件不同的是 Swing组件不是由特定的平台代码实现 而是纯粹的Java代码 因此能够实现与平台的无关 此类组件一般被称为轻量级组件 利用GUI类库设计和实现图形用户界面的工作主要有两个 一是应用的外观设计 即创建组成图形界面的各部件 指定其位置和属性关系 根据需要进行排列 从而构成完整的图形用户界面的物理外观 二是与用户的交互处理 包括定义图形用户界面的事件以及各部件对不同时间的响应处理 6 2用AWT生成图形化用户界面 抽象窗口工具包AWT AbstractWindowToolkit 是API为Java程序提供的建立图形用户界面GUI GraphicsUserInterface 工具集 AWT可用于Java的applet和applications中 它支持图形用户界面编程的功能包括 用户界面组件 事件处理模型 图形和图像工具 包括形状 颜色和字体类 布局管理器 可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关 数据传送类 可以通过本地平台的剪贴板来进行剪切和粘贴 6 2 1java awt包 AWT类包含在java awt包中 主要包括用户界面组件 事件处理模型 图形和图像工具 布局管理器等 Java awt包中的主要类及组件类的继承关系如图6 1所示 6 2 2组件 Java的图形用户界面的最基本组成部分是组件 Component 组件是一个以图形化的方式显示在屏幕上并能与用户进行交互的对象 例如一个按钮 一个标签等 组件不能独立地显示出来 必须将组件放在一定的容器中才可以显示出来 类java awt Component是许多组件类的父类 Component类中封装了组件通用的方法和属性 如图形的组件对象 大小 显示位置 前景色和背景色 边界 可见性等 因此许多组件类也就继承了Component类的成员方法和成员变量 相应的成员方法如表6 1所示 表6 1Component类常用方法 6 3常用容器 容器java awt Container也是一个类 实际上是Component的子类 因此容器本身也是一个组件 具有组件的所有性质 但是它的主要功能是容纳其它组件和容器 一个容器可以容纳多个组件 并使它们成为一个整体 容器可以简化图形化界面的设计 以整体结构来布置界面 所有的容器都可以通过add 方法向容器中添加组件 有三种类型的常用容器 Frame Panel ScrollPane 6 3 1Frame Frame类是Container类的间接子类 当需要一个窗口时 可使用Frame或其子类创建一个对象 窗口也是一个容器 可以向窗口添加组件 窗口默认地被系统添加到显示器屏幕上 因此 不允许将一个窗口添加到另一个容器中 Frame是顶级窗口 可以显示标题 重置大小 当Frame被关闭 将产生WindowEvent事件 Frame无法直接监听键盘输入事件 例6 1 使用Frame容器的例子 importjava awt publicclassep6 1extendsFrame publicstaticvoidmain Stringargs ep6 1fr newep6 1 HelloOutThere 构造方法fr setSize 200 200 设置Frame的大小 缺省为 0 0 fr setBackground Color red 设置Frame的背景 缺省为红色fr setVisible true 设置Frame为可见 缺省为不可见 publicep6 1 Stringstr super str 调用父类的构造方法 一般要生成一个窗口 通常是用Window的子类Frame来进行实例化 而不是直接用到Window类 Frame的外观就像我们平常在windows系统下见到的窗口 有标题 边框 菜单 大小等等 每个Frame的对象实例化以后 都是没有大小和不可见的 因此必须调用setSize 来设置大小 调用setVisible true 来设置该窗口为可见的 另外 AWT在实际的运行过程中是调用所在平台的图形系统 因此同样的AWT程序在不同的操作系统平台下运行所看到的图形系统是不一样的 例如在windows下运行 则显示的窗口是windows风格的窗口 而在UNIX下运行时 则显示的是UNIX风格的窗口 6 3 2Panel java awt包的Panel类是Container 容器 的子类 因此Panel类及其子类的实例也是一个容器 Panel型容器的默认布局是FlowLayout布局 Panel类创建的对象称为面板 经常在一个面板内添加若干个组件后 再把面板放到另一个容器里 下面的例子6 2中有一个窗口 背景色设置为红色 取消默认布局管理器 一个面板 设置面板的背景颜色为黄色 每个面板里添加两个按钮 再把面板添加到窗口中 例6 2 一个使用Panel容器的简单例子 importjava awt publicclassep6 2extendsFrame publicep6 2 Stringstr super str publicstaticvoidmain Stringargs ep6 2fr newep6 2 FramewithPanel Panelpan newPanel fr setSize 200 200 fr setBackground Color red 框架fr的背景颜色设置为红色fr setLayout null 取消布局管理器pan setSize 100 100 pan setBackground Color yellow 设置面板pan的背景颜色为黄色fr add pan 用add方法把面板pan添加到框架fr中fr setVisible true 6 3 3ScrollPane java awt包的ScrollPane类也是Container类的子类 因此该类创建的对象也是一个容器 称为滚动面板 可以把一个组件放到一个滚动面板中 然后通过滚动挑来观察着个组件 与Panel创建的容器不同在于 ScrollPane带有滚动条 而且只能向滚动面板添加一个组件 所以 经常将一些组件添加到一个面板中 然后再把这个面板添加到滚动面板中 ScrollPane有两个构造方法 ScrollPane 创建一个具有滚动条面板 滚动条初始不可见 当添加的组件的可见范围大于滚动面板时 滚动条自动出现 ScrollPane inta 创建新的滚动面板容器 参数a指定滚动条的初始状态 a有以下取值 SCROLLBARS ALWAYS指定无论滚动窗格和子组件各自大小如何 总是显示水平 垂直滚动条 SCROLLBARS AS NEEDED指定只在子组件的大小超过了滚动窗格水平 垂直尺寸时显示水平 垂直滚动条 SCROLLBARS NEVER指定无论滚动窗格和子组件各自大小如何 永不显示水平 垂直滚动条 例6 3 一个使用ScrollPane容器的例子 importjava awt importjava awt event classWindoTenextendsFrameimplementsActionListener Panelp ScrollPanescrollpane WindoTen setLayout newFlowLayout p newPanel scrollpane newScrollPane ScrollPane SCROLLBARS ALWAYS p add newButton one p add newButton two p add newButton three p add newButton four scrollpane add p add scrollpane setBounds 60 60 200 200 setVisible true validate publicvoidactionPerformed ActionEvente System exit 0 publicclassep6 3 publicstaticvoidmain Stringargs newWindoTen 6 4布局管理器 为了使我们生成的图形用户界面具有良好的平台无关性 实现跨平台的特性并且获得动态的布局效果 Java语言中 提供了布局管理器 LayoutManager 这个工具来管理组件在容器中的布局 如 排列顺序 组件的大小 位置 当窗口移动或调整大小后组件如何变化等 而不使用直接设置组件位置和大小的方式 每个容器都有一个布局管理器 不同的布局管理器使用不同算法和策略 当容器需要对某个组件进行定位或判断其大小尺寸时 就会调用其对应的布局管理器 容器可以通过选择不同的布局管理器来决定布局 在程序中安排组件的位置和大小时 应该注意以下两点 1 容器中的布局管理器负责各个组件的大小和位置 因此用户无法在这种情况下设置组件的这些属性 如果试图使用Java语言提供的setLocation setSize setBounds 等方法 则都会被布局管理器覆盖 2 如果用户确实需要亲自设置组件大小或位置 则应调用setLayout null 方法取消该容器的布局管理器 布局管理器主要包括 FlowLayout BorderLayout GridLayout CardLayout GridBagLayout 例6 4 一个设置布局管理器的例子 importjava awt publicclassep6 4 privateFramef privateButtonb1 privateButtonb2 publicstaticvoidmain Stringargs ep6 4that newep6 4 that go publicvoidgo f newFrame GUIexample f setLayout newFlowLayout 设置布局管理器为FlowLayoutb1 newButton PressMe 按钮上显示字符 PressMe b2 newButton Don tPressMe f add b1 f add b2 f pack 紧凑排列 让窗口尽量小 小到刚刚能够包容住b1 b2两个按钮f setVisible true 6 4 1FlowLayout布局 FlowLayout是容器Panel和Applet的缺省布局管理器 在其中组件的放置规律是从上到下 从左到右进行放置 如果容器足够宽 第一个组件先添加到容器中第一行的最左边 后续的组件依次添加到上一个组件的右边 如果当前行已放置不下该组件 则放置到下一行的最左边 构造方法主要下面几种 1 FlowLayout FlowLayout RIGHT 20 40 第一个参数FlowLayout RIGHT 表示组件的对齐方式 指明组件在这一行中的位置是居中对齐 居右对齐还是居左对齐 第二个参数是组件之间的横向间隔 第三个参数是组件之间的纵向间隔 单位是像素 2 FlowLayout FlowLayout LEFT 居左对齐 横向间隔和纵向间隔都是缺省值5个像素 3 FlowLayout 缺省的对齐方式居中对齐 横向间隔和纵向间隔都是缺省值5个像素 例6 5 FlowLayout布局管理器例子 importjava awt publicclassep6 5 publicstaticvoidmain Stringargs Framef newFrame f setLayout newFlowLayout Buttonbutton1 newButton Ok Buttonbutton2 newButton Open Buttonbutton3 newButton Close f add button1 f add button2 f add button3 f setSize 300 100 f setVisible true 当容器的大小发生变化时 用FlowLayout管理的组件会发生变化 其变化规律是 组件的大小不变 但是相对位置会发生变化 例如例子6 5中有三个按钮都处于同一行 但是如果把该窗口变窄 窄到刚好能够放下一个按钮 则第二个按钮将折到第二行 第三个按钮将折到第三行 按钮 Open 本来在按钮 OK 的右边 但是现在跑到了下面 所以说 组件的大小不变 但是相对位置会发生变化 6 4 2BorderLayout布局 BorderLayout是容器Window Frame和Dialog的缺省布局管理器 BorderLayout布局管理器把容器分成5个区域 North South East West和Center 每个区域只能放置一个组件 例6 7 一个BorderLayout布局管理器的应用 importjava awt publicclassep6 7 publicstaticvoidmain Stringargs Framef newFrame BorderLayout f setLayout newBorderLayout f add North newButton North 第一个参数表示把按钮添加到容器的North区域f add South newButton South 第一个参数表示把按钮添加到容器的South区域f add East newButton East 第一个参数表示把按钮添加到容器的East区域f add West newButton West 第一个参数表示把按钮添加到容器的West区域f add Center newButton Center 第一个参数表示把按钮添加到容器的Center区域f setSize 200 200 f setVisible true 在使用BorderLayout的时候 如果容器的大小发生变化 其变化规律为 组件的相对位置不变 大小发生变化 例如容器变高了 则North South区域不变 West Center East区域变高 如果容器变宽了 West East区域不变 North Center South区域变宽 不一定所有的区域都有组件 如果四周的区域 West East North South区域 没有组件 则由Center区域去补充 但是如果Center区域没有组件 则保持空白 6 4 3GridLayout布局 GridLayout布局使容器中各个组件呈网格状布局 每个组件平均占据容器的空间 importjava awt publicclassep6 8 publicstaticvoidmain Stringargs Framef newFrame GridLayout f setLayout newGridLayout 3 2 容器平均分成3行2列共6格f add newButton 1 添加到第一行的第一格f add newButton 2 添加到第一行的下一格f add newButton 3 添加到第二行的第一格f add newButton 4 添加到第二行的下一格f add newButton 5 添加到第三行的第一格f add newButton 6 添加到第三行的下一格f setSize 200 200 f setVisible true 6 4 4CardLayout布局 CardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间 它把容器分成许多层 每层的显示空间占据整个容器的大小 但是每层只允许放置一个组件 当然每层都可以利用Panel来实现复杂的用户界面 牌布局管理器 CardLayout 就象一副叠得整整齐齐的扑克牌一样 有54张牌 但是你只能看见最上面的一张牌 每一张牌就相当于牌布局管理器中的每一层 importjava awt importjava awt event 事件处理机制 下一节的内容publicclassep6 9implementsMouseListener CardLayoutlayout newCardLayout 实例化一个牌布局管理器对象Framef newFrame CardLayout Buttonpage1Button Labelpage2Label Label是标签 实际上是一行字符串TextAreapage3Text 多行多列的文本区域Buttonpage3Top Buttonpage3Bottom publicstaticvoidmain Stringargs newep6 9 go publicvoidgo f setLayout layout 设置为牌布局管理器layoutf add page1Button newButton Buttonpage page1Button 第二个参数 page1Button 表示的是你对这层牌所取的名字page1Button addMouseListener this 注册监听器f add page2Label newLabel Labelpage page2Label page2Label addMouseListener this 注册监听器Panelpanel newPanel panel setLayout newBorderLayout panel add page3Text newTextArea Compositepage Center page3Text addMouseListener this panel add page3Top newButton Topbutton North page3Top addMouseListener this panel add page3Bottom newButton Bottombutton South page3Bottom addMouseListener this f add panel panel f setSize 200 200 f setVisible true publicvoidmouseClicked MouseEventarg0 publicvoidmouseEntered MouseEventarg0 publicvoidmouseExited MouseEventarg0 publicvoidmousePressed MouseEventarg0 publicvoidmouseReleased MouseEventarg0 6 4 5容器的嵌套 在复杂的图形用户界面设计中 为了使布局更加易于管理 具有简洁的整体风格 一个包含了多个组件的容器本身也可以作为一个组件加到另一个容器中去 容器中再添加容器 这样就形成了容器的嵌套 6 4 6总结 1 Frame是一个顶级窗口 Frame的缺省布局管理器为BorderLayout 2 Panel无法单独显示 必须添加到某个容器中 Panel的缺省布局管理器为FlowLayout 3 当把Panel作为一个组件添加到某个容器中后 该Panel仍然可以有自己的布局管理器 因此 可以利用Panel使得BorderLayout中某个区域显示多个组件 达到设计复杂用户界面的目的 4 如果采用无布局管理器setLayout null 则必须使用setLocation setSize setBounds 等方法手工设置组件的大小和位置 但是此方法会导致平台相关 不鼓励使用 6 5AWT事件处理模型 前面的主要内容是如何放置各种组件 使图形界面更加丰富多彩 但是还不能响应用户的任何操作 要能够让图形界面接收用户的操作 就必须给各个组件加上事件处理机制 6 5 1事件处理机制 在事件处理的过程中 主要涉及三类对象 事件 用户对界面操作在java语言上的描述 以类的形式出现 例如键盘操作对应的事件类是KeyEvent 事件源 事件发生的场所 通常就是各个组件 例如按钮Button 事件处理者 接收事件对象并对其进行处理的对象 例如 如果用户用鼠标单击了按钮对象button 则该按钮button就是事件源 而Java运行时系统会生成ActionEvent类的对象actionE 该对象中描述了该单击事件发生时的一些信息 然后 事件处理者对象将接收由Java运行时系统传递过来的事件对象actionE并进行相应的处理 importjava awt importjava awt event publicclassep6 11 publicstaticvoidmain Stringargs Framef newFrame Test Buttonb newButton PressMe b addActionListener newButtonHandler 注册监听器进行授权 该方法的参数是事件处理者对象 本方法授权处理ActionEvent 因为方法名是addActionListenerf setLayout newFlowLayout 设置布局管理器f add b f setSize 200 100 f setVisible true classButtonHandlerimplementsActionListener 实现接口ActionListener才能做事件ActionEvent的处理者publicvoidactionPerformed ActionEvente 系统产生的ActionEvent事件对象被当作参数传递给该方法 System out println Actionoccurred 本接口只有一个方法 因此事件发生时 系统会自动调用本方法 需要做的操作就把代码写在则个方法里 使用授权处理模型进行事件处理的一般方法归纳如下 1 对于某种类型的事件XXXEvent 要想接收并处理这类事件 必须定义相应的事件监听器类 该类需要实现与该事件相对应的接口XXXListener 2 事件源实例化以后 必须进行授权 注册该类事件的监听器 使用addXXXListener XXXListener 方法来注册监听器 6 5 2事件类 java util EventObject类是所有事件对象的基础父类 所有事件都是由它派生出来的 AWT的相关事件继承于java awt AWTEvent类 这些AWT事件分为两大类 低级事件和高级事件 低级事件是指基于组件和容器的事件 当一个组件上发生事件 如 鼠标的进入 点击 拖放等 或组件的窗口开关等 触发了组件事件 高级事件是基于语义的事件 它可以不和特定的动作相关联 而依赖于触发此事件的类 如在TextField中按Enter键会触发ActionEvent事件 滑动滚动条会触发AdjustmentEvent事件 或是选中项目列表的某一条就会触发ItemEvent事件 1 低级事件 组件事件 ComponentEvent 组件尺寸的变化 移动 容器事件 ContainerEvent 组件增加 移动 窗口事件 WindowEvent 关闭窗口 窗口闭合 图标化 焦点事件 FocusEvent 焦点的获得和丢失 键盘事件 KeyEvent 键按下 释放 鼠标事件 MouseEvent 鼠标单击 移动 2 高级事件 语义事件 动作事件 ActionEvent 按钮按下 TextField中按Enter键 调节事件 AdjustmentEvent 在滚动条上移动滑块以调节数值 项目事件 ItemEvent 选中项目 文本事件 TextEvent 文本对象的内容发生改变 6 5 3事件监听器 每类事件都有对应的事件监听器 监听器是接口 根据动作来定义方法 例如 与键盘事件KeyEvent相对应的接口是 publicinterfaceKeyListenerextendsEventListener publicvoidkeyPressed KeyEventev publicvoidkeyReleased KeyEventev publicvoidkeyTyped KeyEventev 本接口中有三个方法 根据这三个方法的方法名就能够知道应该是什么时候调用哪个方法执行了 当键盘刚按下去时 将调用keyPressed 方法执行 当键盘抬起来时 将调用keyReleased 方法执行 当键盘敲击一次时 将调用keyTyped 方法执行 与窗口有关的事件接口 publicinterfaceWindowListenerextendsEventListener publicvoidwindowClosing WindowEvente 把退出窗口的语句写在本方法中publicvoidwindowOpened WindowEvente 窗口打开时调用publicvoidwindowIconified WindowEvente 窗口图标化时调用publicvoidwindowDeiconified WindowEvente 窗口非图标化时调用publicvoidwindowClosed WindowEvente 窗口关闭时调用publicvoidwindowActivated WindowEvente 窗口激活时调用publicvoidwindowDeactivated WindowEvente 窗口非激活时调用 AWT的组件类中提供注册和注销监听器的方法 注册监听器 publicvoidadd listener 注销监听器 publicvoidremove listener 6 5 4AWT事件及其相应的监听器接口 Java语言类的层次非常分明 因而只支持单继承 为了实现多重继承的能力 Java用接口来实现 一个类可以实现多个接口 这种机制比多重继承具有更简单 灵活 更强的功能 在AWT中就经常用到声明和实现多个接口 无论实现了几个接口 接口中已定义的方法必须一一实现 如果对某事件不感兴趣 可以不具体实现其方法 而用空的方法体来代替 但却必须所有方法都要写上 6 5 5事件适配器 Java语言为一些Listener接口提供了适配器 Adapter 类 可以通过继承事件所对应的Adapter类 重写需要方法 无关方法不用实现 事件适配器为我们提供了一种简单的实现监听器的手段 可以缩短程序代码 但是 由于Java的单一继承机制 当需要多种监听器或此类已有父类时 就无法采用事件适配器了 java awt event包中定义的事件适配器类包括以下几个 ComponentAdapter 组件适配器 ContainerAdapter 容器适配器 FocusAdapter 焦点适配器 KeyAdapter 键盘适配器 MouseAdapter 鼠标适配器 MouseMotionAdapter 鼠标运动适配器 WindowAdapter 窗口适配器 6 6AWT组件库 本节从应用的角度进一步介绍AWT的一些常用组件 目的是加深对AWT的理解 掌握如何用各种组件构造图形化用户界面 学会控制组件的颜色和字体 6 6 1按钮 按钮是最常用的一个组件 Java awt包中的Button类是专门用来建立按钮的 其构造方法有2个 Button 使用这个构造方法创建按钮 没有名称Button Strings 使用这个构造方法创建按钮 按钮的名称是字符串s 例如 Buttonb newButton Quit 当按钮被点击后 会产生ActionEvent事件 需ActionListener接口进行监听和处理事件 ActionEvent的对象调用getActionCommand 方法可以得到按钮的标识名 缺省按钮名为label 用setActionCommand 可以为按钮设置组件标识符 例6 13 一个包含两个按钮组件的猜数字小游戏程序 importjava awt importjava awt event classWindowButtonextendsFrameimplementsActionListener intnumber Label提示条 TextField输入框 ButtonbuttonGetNumber buttonEnter WindowButton Strings super s setLayout newFlowLayout buttonGetNumber newButton 得到一个随机数 add buttonGetNumber 提示条 newLabel 输入你的猜测 Label CENTER 提示条 setBackground Color cyan 输入框 newTextField 0 10 add 提示条 add 输入框 buttonEnter newButton 确定 add buttonEnter buttonEnter addActionListener this buttonGetNumber addActionListener this setBounds 100 100 150 150 setVisible true validate publicvoidactionPerformed ActionEvente if e getSource buttonGetNumber number int Math random 100 1 提示条 setText 输入你的猜测 elseif e getSource buttonEnter intguess 0 try guess Integer parseInt 输入框 getText if guess number 提示条 setText 猜对了 elseif guess number 提示条 setText 猜大了 输入框 setText null elseif guess number 提示条 setText 猜小了 输入框 setText null catch NumberFormatExceptionevent 提示条 setText 请输入数字字符 publicclassep6 13 publicstaticvoidmain Stringargs WindowButtonwin newWindowButton 窗口 程序编译运行后的结果如下所示 6 6 2单行文本输入框 java awt包中的TextField类是专门用来创建文本框的 即TextField类创建的一个对象就是一个文本框 用户可以在文本框输入单行的文本 这个组件只能显示一行 当回车键被按下时 会发生ActionEvent事件 可以通过ActionListener中的actionPerformed 方法对事件进行相应处理 可以使用setEditable boolean 方法设置为只读属性 单行文本输入区构造方法如下 TextFieldtf1 tf2 tf3 tf4 tf1 newTextField tf2 newTextField 20 显示区域为20列tf3 newTextField Hello 按文本区域大小显示tf4 newTextField Hello 30 初始文本为Hello 显示区域为30列 6 6 3文本输入区 java awt包中的TextArea可以显示多行多列的文本 使用setEditable boolean 方法 可以将其设置为只读的 在TextArea中可以显示水平或垂直的滚动条 要判断文本是否输入完毕 可以在TextArea旁边设置一个按钮 通过按钮点击产生的ActionEvent对输入的文本进行处理 TextArea构造方法如下表6 1所示 TextArea常用方法如下表6 2所示 对于文本区事件源 可以发生TextEvent事件 TextArea类提供了addTextListener方法获得监视器 处理发生TextEvent事件的接口是TextListener 该接口中只有一个方法 textValueChanged TextEvente 6 6 4选择框和选择框组 选择框提供两种状态 一种是选中 另一种是未选中 java awt包中的Checkbox用来建立选择框 Checkbox构造方法如下表6 1所示 常用方法如下表6 2所示 选择框用ItemListener来监听ItemEvent事件 当选择框状态改变时用getStateChange 获取当前状态 使用getItem 获得被修改选择框的字符串对象 使用选择框组CheckboxGroup组件 可以实现单选框的功能 方法如下 setLayout newGridLayout 3 1 CheckboxGroupcbg newCheckboxGroup add newCheckbox one cbg true add newCheckbox two cbg false add newCheckbox three cbg false 6 6 5下拉式列表 下拉式列表Choice组件 每次只能选择其中的一项 它能够节省显示空间 适用于大量选项 ChoiceColorchooser newChoice Colorchooser add Green Colorchooser add Red Colorchooser add Blue Choice用ItemListener接口来进行监听 6 6 6滚动列表 java awt包中的List类是专门用来建立滚动列表的 滚动列表中提供了多个文本选项 列表支持滚动条 可以浏览多项 Listlst newList 4 false 两个参数分别表示显示的行数 是否允许多选lst add Venus lst add Earth lst add JavaSoft lst add Mars cnt add lst 6 6 7画布 java awt包中的Canvas类负责创建画布对象 创建画布对象的常用方法是用Canvas的子类来创建画布对象 如果想在画布上完成一些图形处理 则Canvas类中的paint 方法必须被重写 当重写这个方法时 参数g是自动实例化的 这样就可以在子类中使用对象g调用相应方法 画布没有默认的最佳大小 如果添加画布的容器的布局是FlowLayout布局 画布必须调用setSize方法设置大笑 Canvas组件监听各种鼠标 键盘事件 当在Canvas组件中输入字符时 必须先调用requestFocus 方法 6 6 8对话框 java awt Dialog类是对话框类 和窗口类 Frame类 都是Window类的子类 对话框和一般窗口的区别在于它必须依赖于其它窗口 对话框是一个带标题和边界的顶层窗口 边界一般用于从用户处获得某种形式的输入 对话框的大小包括边界所指定的任何区域 对话框也是一个容器 它的默认布局是BorderLayout 1 Dialog类的主要方法Dialog Dialogowner 构造一个初始时不可见 无模式的Dialog 带有空标题和指定的所有者框架 owner指的是对话框的所有者 Dialog Dialogowner Stringtitle 构造一个初始时不可见 无模式的Dialog 带有指定的所有者owner和标题 Dialog Dialogowner Stringtitle booleanmodal 构造一个初始时不可见的Dialog 带有指定的所有者owner 标题和模式 getTitle 获得dialog的标题 isModal 指出dialog是否为有模式的 setModal booleanb 指定此dialog是否应该是有模式的 2 对话框的模式对话框分为无模式 non modal 和有模式 modal 两种 无模式对话框处于激活状态时 程序仍然能激活所依赖的窗体 不堵塞线程的执行 有模式对话框相反 如果当前对话框处于激活状态时 程序只能响应对话框内部的事件 不能再激活它所依赖的窗体 6 6 9菜单栏 菜单和菜单项 菜单栏 MenuBar 只能被添加到Frame对象中 作为整个菜单树的根基 例如 Framefr newFrame MenuBar MenuBarmb newMenuBar fr setMenuBar mb fr setSize 150 100 fr setVisible true 菜单 Menu 无法直接添加到容器的某一位置 也无法使用布局管理器对其加以控制 菜单只能被添加到菜单栏 MenuBar 或其它菜单中 例如 Framefr newFrame MenuBar MenuBarmb newMenuBar fr setMenuBar mb Menum1 newMenu File Menum2 newMenu Edit Menum3 newMenu Help mb add m1 mb add m2 mb setHelpMenu m3 fr setSize 200 200 fr setVisible true 菜单项 MenuItem 是菜单树中的 叶子节点 MenuItem通常被添加到一个Menu中 对于MenuItem对象可以添加ActionListener 使其能够完成相应的操作 MenuBar和Menu都没有必要注册监听器 只需要对MenuItem添加监听器ActionListener 完成相应操作 Menum1 newMenu File MenuItemmi1 newMenuItem Save MenuItemmi2 newMenuItem Load MenuItemmi3 newMenuItem Quit m1 add mi1 m1 add mi2 m1 addSeparator m1 add mi3 单击某个菜单项可以发生ActionEvent事件 因此 可以通过处理ActionEvent事件来完成想要进行的操作 6 7练习思考题 1 什么是GUI 功能是什么 2 Java中GUI工具包有 和 3 通过调用方法 可以改变当前容器的布局方式 4 通过 方法向容器中添加组件 5 AWT布局管理器有 和 6 JavaGUI编程中常用的JButton是 A 对象B 组件C 变量D 接口 第7章多线程 线程简介Thread类的子类创建线程实现Runnable接口基本的线程控制线程的调度多线程的互斥与同步Daemon线程 7 1线程简介 到目前为止所介绍过的各种范例都是单线程程序 也就是启动的Java程序在 同一时间 内只会做一件事 文本模式下最常进行的就是单线程程序 有时需要程序 同时 可以作很多事 即所谓多线程 Multi thread 程序 在窗口程序 网络程序中常使用多线程功能 了解多线程概念与注意事项是非常重要的 7 1 1进程与线程 程序是一段静态的代码 它是应用软件执行的蓝本 进程是程序的一次动态执行过程 它对应了从代码加载 执行至执行完毕的一个完整过程 这个过程也是进程本身从产生 发展至消亡的过程 线程是比进程更小的执行单位 一个进程在其执行过程中 可以产生多个线程 形成多条执行线索 每条线索 即每个线程也有它自身的产生 存在和消亡的过程 也是一个动态的概念 Java的多线程就是在操作系统每次分时给Java程序一个时间片的CPU时间内 在若干个独立的可控制的线程之间切换 7 1 2线程的状态 Java使用Thread类及其子类的对象来表示线程 线程在它的一个完整的生命周期中通常要经历如下的4种状态 1 创建状态 newThread 2 可运行状态 Runnable 3 不可运行状态 NotRunnable 4 死亡状态 Dead 7 2Thread类的子类创建线程 用Thread类或子类创建线程对象 编写Thread类的子类时 需要重写父类的run方法 其目的是规定线程的具体操作 否则线程就什么也不做 因为父类的run方法中没有任何操作语句 当JVM将CPU使用权切换给线程时 如果线程是Thread的子类创建的 该类中的run方法就立刻执行 7 3实现Runnable接口 创建线程的另一个途径就是用Thread类直接创建线程对象 使用Thread类创建线程对象时 常用的构造方法是 Thread Runnabletarget 该构造方法中的参数是一个Runnable类型的接口 因此 在创建线程对象时 必须向构造方法的参数传递一个实现Runnable接口类的实例 该实例对象称为所创线程的目标对象 例7 3 通过接口构造线程体 importjava awt Graphics importjava util Date publicclassep7 3extendsjava applet AppletimplementsRunnable 实现接口ThreadclockThread publicvoidstart if clockThread null clockThread newThread this Clock clockThread start 启动线程 publicvoidrun run 方法中是线程执行的内容while clockThread null repaint 刷新显示画面try clockThread sleep 1000 睡眠1秒 即每隔1秒执行一次 catch InterruptedExceptione publicvoidpaint Graphicsg Datenow newDate 获得当前的时间对象g drawString now getHours now getMinutes now getSeconds 5 10 显示当前时间 publicvoidstop clockThread stop clockThread null 本程序是Applet 要运行Applet程序 必须定义一个html文件 ep7 3 html文件内容如下 上面这个例子是通过每隔1秒种就执行线程的刷新画面功能 显示当前的时间 看起来的效果就是一个时钟 每隔1秒就变化一次 由于采用的是实现接口Runnable的方式 所以该类Clock还继承了Applet Clock就可以Applet的方式运行 构造线程体的两种方法的比较 1 使

温馨提示

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

评论

0/150

提交评论