用java的java swing漂亮的界面做界面,想通过在同一个窗口进行面板的切换来达到跳转界面的目的,可行不?

今天看啥 热点:
JAVA简单Swing图形界面应用示例,javaswing图形界面
JAVA简单Swing图形界面应用示例
package org.rui.
import javax.swing.JF
* 简单的swing窗口
* @author lenovo
public class HelloSwing {
public static void main(String[] args) {
JFrame frame=new JFrame(&hello Swing&);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setVisible(true);
package org.rui.
import java.util.concurrent.TimeU
import javax.swing.JF
import javax.swing.JL
* JFream 中添加 一个JLabel来使事情变得更有趣
* @author lenovo
public class HelloLabel {
public static void main(String[] args) throws InterruptedException {
JFrame frame=new JFrame(&hello swing&);
JLabel label=new JLabel(&A label&);
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,100);
frame.setVisible(true);
TimeUnit.SECONDS.sleep(1);
label.setText(&Hey! this is Different!&);
package org.rui.
import java.util.concurrent.TimeU
import javax.swing.JF
import javax.swing.JL
import javax.swing.SwingU
* swing 有它自已的专用线程来接收UI事件并更新屏幕
* @author lenovo
public class SubmitLabelManipulationTask {
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame(&Hello Swing&);
final JLabel label = new JLabel(&A Label&);
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 100);
frame.setVisible(true);
TimeUnit.SECONDS.sleep(1);
//专用线程
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText(&hey! this is different&);
package org.rui.
import java.util.concurrent.TimeU
import javax.swing.JF
import javax.swing.JL
import javax.swing.SwingU
public class SubmitSwingProgram extends JFrame {
public SubmitSwingProgram() {
super(&hello swing&);
label = new JLabel(&A Label&);
add(label);
setSize(300, 100);
setVisible(true);
static SubmitSwingP
public static void main(String[] args) throws InterruptedException {
//实例对象
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ssp = new SubmitSwingProgram();
TimeUnit.SECONDS.sleep(1);
//设置改变文字
SwingUtilities.invokeLater(new Runnable(){
public void run(){
ssp.label.setText(&hey! this is different!&);
package org.rui.
import javax.swing.JF
import javax.swing.SwingU
* 这可能是一个你想要自已使用的工具,
* 要想使用它,你的应用就必须位于一个JFrame中
* 静态的run方法可以将视窗的标题设置为类的简单名
* @author lenovo
public class SwingConsole {
public static void run(final JFrame f, final int width, final int height) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
f.setTitle(f.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(width,height);
f.setVisible(true);
如果你对Java GUI编程感兴趣,你自己都会去学的。界面开发重不重要要看你开发的软件情况,如果你是做产品,那么就很重要,因为一套设计良好的界面能为用户带来更好的体验从而加深用户对你产品的好感;如果你只是做企业内部应用,那么界面就不是那么重要了。关于Java界面编程方面的书有很多,我推荐你看看《Java用户界面编程指南》,虽然是本很早的书了,但是它会让你学会很多,包括界面设计思路,编程方法,还有不少通用的界面编程方法。祝你好运 :)
在编程语言中的事件就是当某组件的状态发生改变的时候通知其它对象发生了这件事,我们在这里只讨论图形界面的组件,有可能是按钮、文本框、菜单、多选等等。对于通知其它对象的方法一般有两种模式:1)推模式:状态改变的对象通知其它对象;2)拉模式:其他对象不停的查看该对象状态是否发生改变。例如我去小卖部买烟,要一包红塔山,结果小卖部没货了,如果我把我得电话给小卖部老板,烟如果到了请给我打电话,这就是推模式。如果我每隔5分钟来小卖部看一看烟是否到了,这就是拉模式。Java采用的是推模式,所有监听事件都基于观察者设计模式,所以我们也可以自己给予观察者开发出专用的监听器。我们JavaGUI程序开发,会经常使用到监听事件,比如一个小计算器的程序,当我们点击“计算”按钮后,希望程序将两个文本框中的数字相加,那么就必需给这个按钮添加事件:1)按钮的动作触发事件接口是ActionListener接口(不同组件要实现不同功能需要有不同的接口),我们需要写一个事件类,实现ActionListener接口,接口中需要我们实现的方法actionPerformed(ActionEvent e)代表了当按钮事件被触发后需要程序做些什么,比如在这里用System.out.println(&你好&)在控制台打印你好,这一步就相当于我把电话写在纸上。2)调用JButton组件实例的addActionListener(ActionListener al)方法(其它事件也有相应的方法)将上面写的事件类注册到这个按钮上,这就相当于我把写着电话的纸条交给小卖部的老板。上述两部工作完成后,这个按钮的事件就添加完成了,程序运行,点击按钮,动作事件被触发,控制台显示“你好”。实例:import java.awt.event.ActionEimport java.awt.event.ActionLimport javax.swing.JBimport javax.swing.JF/** * 一个简单的按钮事件教学实例 * @author 米强 * */public class Test extends JFrame {public Test() {super(&简单的按钮事件实例&);// 一个按钮的实例化对象JButton button = new JButton(&按钮&);// 构造一个事件类,该类实现了ActionListener动作接口MyActionListener action = new MyActionListener();// 为这个按钮添加动作事件(匿名类等写法在这里不做讨论)button.addActionListener(action);// 将按钮添加到窗体中getContentPane().add(button);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 200);setLocationRelativeTo(null);setVisible(true);}public static void main(String[] args) {new Test();}}......余下全文>>
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
WEB编程教程最近更新温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3811)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'使用NetBeans IDE设计一个Swing GUI程序(转)',
blogAbstract:'创建项目
因为在IDE中所有的Java开发工作都以项目进行的,所以我们先创建一个新的ContactEditor项目,用于保存源代码及其它的项目文件。 一个IDE项目是一组Java源代码文件和与其相关联的元数据资料构成,它包括特定于项目的属性文件,一个用于控制构建及运行设置的Ant构建脚本,和将Ant目标映射为IDE命令的project.xml文件。 尽管Java应用程序经常由多个IDE的项目组成,但在本教程中,为了简单起见,我们将构建一个全部存储在单个项目中的简单应用程序。
开始创建一个新的ContactEditor应用程序项目的步骤:
选择 File & New Project。或者您可以点击IDE工具栏上的 New Project 图示。
在 Categories 窗格中,选择 Java 节点,再从 Projects 窗格中,选择 Java Application。单击 Next。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:6,
publishTime:6,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}谁帮我用java swing完成个界面视图 不是很复杂的界面布局 有奖赏 联系_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
谁帮我用java swing完成个界面视图 不是很复杂的界面布局 有奖赏 联系
。。。。。急。。。。。。。。。。。。。。。。。
我有更好的答案
swing布局基本是纯体力活。。。
布局这块我不太懂。。。刚看了一下,一时也学不会。。。。。请问你会吗?不是很复杂的布局
多年没搞swing编程了
确实不会布局就全部用坐标布局
这个我应该可以。。。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包当前位置: >>
java中 基于Swing的图形用户界面设计
第10章基于Swing的图形用户界面设计?本章导读 ☆ AWT组件与SWING组件 ☆ JFrame窗体、菜单组件、布局设计 ☆ 中间容器、文本组件 ☆ 按钮与标签组件、复选框与单选按钮组件 ☆ 列表组件、表格组件、树组件和进度条组件 ☆ 窗口事件、鼠标事件、焦点事件和键盘事件 ☆ 对话框 ☆ AWT线程与计时器 ☆ MVC设计模式 ☆ 发布应用程序 1 10.1 AWT组件与SWING组件概述Java早期进行用户界面设计时,使用java.awt包中提供的类。 “AWT”就是Abstrac Window Toolkit(抽象窗口工具包)的缩写。 Java 2(JDK1.2)推出之后,增加了一个新的javax.swing包,该包提供了 功能更为强大的用来设计GUI界面的类。 Java早期的java.awt包中的类创建的组件习惯上称为重组件。例如,当用 java.awt包中的Button类创建一个按钮组件时,都有一个相应的本地组件在为它 工作(称为它的同位体)。 javax.swing包为我们提供了更加丰富的、功能强大的组件,称为SWING组 件,其中大部分组件是轻组件,没有同位体。 SWING组件的轻组件在设计上和AWT完全不同,轻组件把与显示组件有关 的许多工作和处理组件事件的工作交给相应的UI代表来完成。这些UI代表是用 Java语言编写的类,这些类被增加到Java的运行环境中,因此组件的外观不依赖 平台,不仅在不同平台上的外观是相同的,而且较组件有更高的性能。如果 Java运行环境低于1.2版本,就不能运行含有SWING组件的程序。 2 图10.1 JComponent类的部分子类以及JFrame类和JDialog 类3 容器类(Container)和组件类(Component)Java把由Component类的子类或间接子类创建的对象称为一个组件;把由 Container的子类或间接子类创建的对象称为一个容器。 ◆ 可以向容器添加组件。Container类提供了一个public方法add(),一个容 器可以调用这个方法将组件添加到该容器中。 ◆ 调 用 removeAll() 方 法 可 以 移 掉 容 器 中 的 全 部 组 件 , 调 用 remove(Component c)方法可以移掉容器中参数指定的组件。 ◆ 每当容器添加新的组件或移掉组件时,应该让容器调用validate()方法, 以保证容器中的组件能正确显示出来。 容器本身也是一个组件,因此可以把一个容器添加到另一个容器中实现容器的 嵌套。 javax.swing 包 中 有 4 个 最 重 要 的 类 JApplet , JFrame , JDialog 和 JComponent。 注:JComponent类的子类都是轻组件,JComponent类是java.awt包中Container类的子类,因此所有的轻组件也都是容器。 而 JFrame 、 JApplet 、 JDialog 都 是 重 组 件 , 即 有 同 位 体 的 组 件 , 这 样 窗 口 (JFrame)、对话框(JDialog)、小应用程序(Java Applet)可以和操作系统交互 信息。轻组件必须在这些容器中绘制自己,习惯上称这些容器为SWING的底层容器。 4 10.2 JFrame窗体javax.swing包中的JFrame类是java.awt包中Frame类的子类,因此 JFrame类其子类创建的对象是窗体。 当应用程序需要一个窗口时,可使用JFrame或其子类创建一个对象。 窗口默认地被系统添加到显示器屏幕上,因此不允许将一个窗口添加到 另一个容器中。Frame类常用方法如下:◆JFrame() 创建一个无标题的窗口。 ◆JFrame(String s) 创建一个标题为s的窗口。 ◆ public void setBounds(int a,int b,int width,int height)设置出现在屏幕上时的初始位置为(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。 ◆public void setSize(int width,int height) 设置窗口的大小,在屏幕出现默认位置是(0,0)。 ◆public void setVisible(boolean b) 设置窗口是可见还是不可见,窗口默认是不可见的。 ◆public void setResizable(boolean b) 设置窗口是否可调整大小,窗口默认是可调整大小的。 ◆public void setDefaultCloseOperation(int operation) 该方法用来设置单击窗体右上角的 关闭图标后,程序会做出怎样的处理。其中的参数operation取下列有效值: 1) DO_NOTHING_ON_CLOSE 什么也不做 2)HIDE_ON_CLOSE 隐藏当前窗口 3)DISPOSE_ON_CLOSE 隐 藏当前窗口,并释放窗体占有的其他资源 4)EXIT_ON_CLOSE 结束窗体所在的应用程序这4个常量都是JFrame类中的static常量,单击关闭图标后,程序根据 operation取值做出不同的处理。例子10-1用JFrame创建了两个窗口,程序运行效果如图10.2。 5 例子10-1 运行效果图10.26 10.3 菜单组件 窗口中的菜单条、菜单、菜单项是我们所熟悉的界面,菜单 条、菜单、菜单项是窗口常用的组件,菜单放在菜单条里,菜单 项放在菜单里。 1.JMenuBar菜单条 JComponent 类 的 子 类 JMenuBar 是 负 责 创 建 菜 单 条 的 , 即 JMenuBar的一个实例就是一个菜单条。 JFrame类有一个将菜单条放置到窗口中的方法:public void setJMenuBar(JMenuBar menubar);该方法将菜单条添加到窗口的菜单条区域(注意:只能向窗 口添加一个菜单条)。7 2. JMenu菜单 JComponent类的子类JMenu类是负责创建菜单的,即JMenu 的一个实例就是一个菜单。JMenu类的主要方法有以下几种: ◆ JMenu(String s) 建立一个指定标题菜单,标题由参数s确定 ◆ public void add(MenuItem item) 向菜单增加由参数item指定的 菜单选项对象。 ◆ public void add(String s) 向菜单增加指定的选项。 ◆ public JMenuItem getItem(int n) 得到指定索引处的菜单选项。 ◆ public int getItemCount() 得到菜单选项数目。8 3. JMenuItem菜单项 JMenuItem是JMenu的父类,该类是负责创建菜单项的,即 JMenuItem的一个实例就是一个菜单项。菜单项放在菜单里。 JMenuItem类的主要方法有以下几种:构造有标题的菜单项。 ◆ JMenuItem(String text, Icon icon) 构造有标题和图标的菜单项 ◆ public void setEnabled(boolean b)设置当前菜单项是否可被选择。 ◆ public String getLabel() 得到菜单项的名字。 ◆ public void setAccelerator(KeyStroke keyStroke) 为菜单项设置 快捷键。 为了向该方法的参数传递一个KeyStroke对象,可以使用KeyStroke 类的类方法 public static KeyStroke getKeyStroke(char keyChar) 返回 一个KeyStroke对象;也可以使用KeyStroke类的类方法 public static KeyStroke getKeyStroke(int keyCode,int modifiers) 返 回 一 个 KeyStroke 对 象 , 其 中 参 数 keyCode 取 值 范 围 为 KeyEvent.VK_A~ KeyEvent.VK_Z , modifiers 的 取 值 如 下 : InputEvent.ALT_MASK ,◆ JMenuItem(String s) InputEvent.CTRL_MASK和InputEvent.SHIFT_MASK。 9 4. 嵌入子菜单 JMenu是JMenuItem的子类,因此菜单项本身还可以是一个菜 单,这样的菜单项称为子菜单。 为了使得菜单项有一个图标,可以用图标类Icon声明一个图 标,然后使用其子类ImageIcon类创建一个图标,如Icon icon=new ImageIcon(&dog.gif &);下面的例10-2中有一个含有菜单的窗口(效果如图10.3所示)。10 10.4 布局设计当把组件添加到容器中时,希望控制组件在容器 中的位置,这就需要学习布局设计的知识。 本 节 将 介 绍 java.awt 包 中 的 FlowLayout 、 BorderLayout 、 CardLayout 、 GridLayout 布 局 类 和 java.swing.border包中的BoxLayout布局类。 容器可以使用方法setLayout(布局对象);来设置自己的布局。 对于JFrame窗口,默认布局是BorderLayout布局。11 1.FlowLayout布局 FlowLayout类的对象称为FlowLayout布局。FlowLayout类 的一个常用构造方法如下:◆ FlowLayout();构造方法可以创建一个居中对齐的布局对象,如:FlowLayout flow=new FlowLayout();◆ con.setLayout(flow); 容器con使用flow这个布局对象 ◆ 容器con可以使用Container类提供的add()方法将组件顺序地添加到容器中。 ◆ FlowLayout布局对象调用 setAlignment(int aligin)方法可以重新设置布局 的对齐方式,其中aligin可以取值FlowLayout.LEFT、FlowLayout.CENTER或 FlowLayout.RIGHT。 ◆ FlowLayout布局对象调用 setHgap(int hgap)方法 和 setVgap(int vgap)方法 可以重新设置布局的水平间隙和垂直间隙。 ◆如果需要改变最佳大小,组件需调用:public void setPreferredSize(Dimension preferredSize) 设置大小,例如:button.setPreferredSize(new Dimension(20,20));注:对于添加到使用FlowLayout布局的容器中的组件,组件调用setSize(int x,int y)设置的大小无效。 例10-3中,JFrame使用FlowLayout布局放置10个组件(效果如图10.4所示)。 12 例子10-3 运行效果图10.413 2.BorderLayout布局BorderLayout布局是Window容器的默认布局。 JFrame、JDialog都是Window类的间接子类,它们的内容面板 的默认布局都是BorderLayout布局。 如果一个容器使用这种布局,那么容器空间简单地划分为东、 西、南、北、中五个区域。每加入一个组件都应该指明把这个组 件添加在哪个区域中,区域由BorderLayout中的静态常量CENTER、 NORTH、SOUTH、WEST、EAST表示。例如, 一个使用BorderLayout布局的容器con,可以使用add()方法将一个组 件b添加到中心区域:con.add(b,BorderLayout.CENTER); 或 con.add(BorderLayour.CENTER,b); 注: 添加到某个区域的组件将占据整个这个区域.每个区域只能放置一个组 件,如果向某个已放置了组件的区域再放置一个组件,那么先前的组件将被后 者替换。 注: 使用BorderLayout布局的容器最多能添加5个组件,如果容器中需要添 加的组件超过5个,就必须使用容器的嵌套或改用其他布局策略。 14 例10-4使用了BorderLayout布局(效果如图10.5所示)。
例子10-4 运行效果图10.515 3.CardLayout 布局使用CardLayout容器可以容纳多个组件,但同一时刻容器只能 从这些组件中选出一个来显示,就像一叠“扑克牌”每次只能显示 最上面的一张一样,这个被显示的组件将占据所有的容器空间。 JTabbedPane窗格的默认布局是CardLayout布局,并且自带 一些选项卡,这些选项卡与用户添加到JTabbedPane窗格中的组件 相对应,单击该选项卡,JTabbedPane窗格将显示对应的组件。选 项卡窗格自带的选项卡默认地在该选项卡窗格的顶部,从左向右 依次排列,选项卡的顺序和所对应的组件的顺序相同。JTabbedPane窗格可以使用add(String text,Component c);方法将组件c 添加到JTabbedPane窗格中,并指定和组件c对应的选项卡的文本提示是text。 使用JTabbedPane窗格的构造方法 public JTabbedPane(int tabPlacement)创建的选项卡窗格的选项卡的 位 置 由 参 数 tabPlacement 指 定 , 该 参 数 的 有 效 值 为 JTabbedPane.TOP 、 JTtabbedPane.BOTTOM、JTabbedPane.LEFT 和JTabbedPane.RIGHT。 例10-5在选项卡窗格中添加了5个按钮(带有图标),并设置了相对应的 选项卡的文本提示,然后将选项卡窗格添加到窗体的内容面板中(效果如图 16 例子10-5 运行效果图10.617 4.GridLayout布局GridLayout是使用较多的布局编辑器,其基本布局策略是把容器划分成若 干行若干列的网格区域,组件就位于这些划分出来的小格中。GridLayout比较 灵活,划分多少网格由程序自由控制,而且组件定位也比较精确,使用 GridLayout布局编辑器的一般步骤如下: (1)使用GridLayout的构造方法GridLayout(int m,int n)创建布局对象,指 定划分网格的行数m和列数n,如 GridLayout grid=new GridLayout(10,8); (2)使用GridLayout布局的容器调用方法add()将组件加入容器,组件进入容 器的顺序将按照第一行第一个、第一行第二个?第一行最后一个、第二行第一 个?最后一行第一个?最后一行最后一个。 使用GridLayout布局的容器最多可添加m×n个组件。GridLayout布局中每 个网格都是相同大小,并且强制组件与网格的大小相同。 由于GridLayout布局中每个网格都是相同大小并且强制组件与网格的大小 相同,使得容器中的每个组件也都是相同的大小,显得很不自然。为了克服这 个缺点,可以使用容器嵌套。例如,一个容器使用GridLayout布局,将容器分 为三行一列的网格,那么可以把另一个容器添加到某个网格中,而添加的这个 容器又可以设置为GridLayout布局、FlowLayout布局、CarderLayout布局或 BorderLayout布局等。利用这种嵌套方法,可以设计出符合一定需要的布局. 18 5.BoxLayout布局用 BoxLayout 类 可 以 创 建 一 个 布 局 对 象 , 称 为 盒 式 布 局 。 BoxLayout 在 java.swing.border包中。java swing包提供了Box类,该类也是Container类的 一个子类,创建的容器称为一个盒式容器。盒式容器的默认布局是盒式布局, 而且不允许更改盒式容器的布局。因此,在策划程序的布局时,可以利用容器 的嵌套,将某个容器嵌入几个盒式容器,达到布局目的。 BoxLayou的构造方法BoxLayout(Container con,int axis)可以创建一 个 盒 式 布 局 对 象 , 并 指 定 容 器 con 使 用 该 布 局 对 象 , 参 数 axis 的 有 效 值 是 BoxLayout.X_AXIS和BoxLayout.Y_AXIS。 Box类的类(静态)方法createHorizontalBox()可以获得一个具有行型盒 式布局的盒式容器;Box类的类(静态)方法createVerticalBox()可以获得一 个具有列型盒式布局的盒式容器。 控制盒式布局容器中组件之间的距离,需要使用水平支撑或垂直支撑。 Box类调用静态方法createHorizontalStrut(int width)可以得到一个不 可见的水平Struct类型对象.称为水平支撑.该水平支撑的高度为0,宽度是width。 Box类调用静态方法createVertialStrut(int height)可以得到一个不可 见的垂直Struct类型对象,称为垂直支撑.参数height决定垂直支撑的高度,垂 直支撑的宽度为0。 例10-6中(效果如图10.7所示),有两个列型盒式容器boxV1、boxV2和一 个行型盒式容器baseBox。在列型盒式容器的组件之间添加垂直支撑,控制组件 之间的距离,将boxV1、boxV2添加到baseBox中,并在它们之间添加水平支撑。 19 例子10-6 运行效果图10.720 6.null布局 可以把一个容器的布局设置为null布局(空布局)。 空布局容器可以准确地定位组件在容器的位置和大小。 setBounds(int a,int b,int width,int height)方法 是所有组件都拥有 的一个方法,组件调用该方法可以设置本身的大小和在容器中的 位置。例如,p是某个容器: p.setLayout(null);把p的布局设置为空布局。 向空布局的容器p添加一个组件c需要两个步骤。 首先使用add(c)方法向容器添加组件, 然后组件c再调用setBounds(int a,int b,int width,int height)方 法设置该组件在容器中的位置和本身的大小。 组件都是一个矩形结构,方法中的参数a和b是被添加的组件c 的左上角在容器中的位置坐标,即该组件距容器左面a个像素,距 容器上方b个像素;weidth和height是组件c的宽和高。 21 10.5 中间容器_1JPanel面板,2JScrollPane窗格,3JSplitPane窗格轻组件都是容器,但仍有一些经常用来添加组件的轻容器,相对于底层重 容器而言,我们习惯上称这些轻容器为中间容器。SWING提供了许多功能各异的 中间容器,而且容易学习掌握。本节将简单介绍JPanel面板、JScrollPane滚动 窗格、JSplitPane拆分窗格和JLayeredPane分层窗格。 1.JPanel面板 可以使用JPanel创建一个面板,再向这个面板添加组件,然后把这个面板添 加到底层容器或其他中间容器中。JPanel面板的默认布局是FlowLayout布局。 JPanel类构造方法Jpanel()可以构造一个面板容器对象。 2.JScrollPane窗格 可以把一个组件放到一个滚动窗格中,然后通过滚动条来观察这个组件。 JScorollPane的构造方法JScorollPane(component c)可以构造一个滚动窗格。 3.JSplitPane窗格 拆分窗格有两种类型水平拆分和垂直拆分。水平拆分窗口用一条拆分线把 容器分成左右两部分,左面放一个组件,右面放一个组件,拆分线可以水平移动。 垂直拆分窗格由一条拆分线分成上下两部分,上面放一个组件,下面放一个组件, 拆分线可以垂直移动。 JSplitPane的构造方法JSplitPane(int a,Component b,Component c)可 以构造一个拆分窗格,参数a取JSplitPane的静态常量 HORIZONTAL_SPLIT或 VERTICAL_SPLIT,以决定是水平还是垂直拆分。后两个参数决定要放置的组件。 拆分窗格调用setDividerLocation(double 22 position)设置拆分线的位置。 4.JLayeredPane分层窗格 如果添加到容器中的组件经常需要处理重叠问题,就可以考虑 将组件添加到JLayeredPane容器。JLayeredPane容器将容器分成5 个层,容器使用add(Jcomponent com, int layer);添加组件com,并指定 com所在的层,其中参数layer取值JLayeredPane类中的类常量:DEFAULT_LAYER、PALETTE_LAYER、MODAL_LAYER、POPUP_LAYER、DRAG_LAYER。DEFAULT_LAYER 是最底层,添加到 DEFAULT_LAYER层 的组件如果和其 他层的组件发生重叠时,将被其他组件遮挡。DRAG_LAYER层是最上面的层,如果JLayeredPane中添加了许多组件,鼠标移动一组件时, 可以把移动的组件放到DRAG_LAYER层。这样,组件在移动过程中,就 不会被其他组件遮挡。添加到同一层上的组件,如果发生重叠,先 添加的会遮挡后添加的组件。JLayeredPane对象调用 public void setLayer(Component c,int layer)可以重新设置组件c所在的层,调用publicint getLayer(Component c)可以获取组件c所在的层数。 例10-7在JLayeredPane容器中添加了5个组件,分别位于不同的层上(效果如 图10.8所示) 23 例子10-7 运行效果图10.824 10.6 文本组件_ 1 JTextField文本框,2 JPasswordField密码框1.JTextField文本框 JComponent的子类JTextField是专门用来建立文本框的,即JTextField创建 的一个对象就是一个文本框。用户可以在文本框输入单行的文本。 JTextField类的主要方法如下:◆ JTextField(int x) 创建文本框对象,可以在文本框中输入若干个字符,文本框的 可见字符个数由参数 x指定。 ◆ JTextField(String s) 创建文本框对象,则文本框的初始字符串为s,可以在文本 框中输入若干个字符。 ◆ public void setText(String s) 设置文本框中的文本为参数s指定的文本,文本框 中先前的文本将被清除。 ◆ public String getText() 获取文本框中的文本。 ◆ public void setEditable(boolean b) 指定文本框的可编辑性。创建的文本框默认 是可编辑的。 ◆ public void setHorizontalAlignment(int alignment) 设置文本在文本框中的对 齐 方 式 , alignment 的 有 效 值 为 JTextField.LEFT 、 JTextField.CENTER 和 JTextField.RIGHT。2.JPasswordField密码框 使用JTextField的子类JPasswordField可以建立一个密码框对象。密码框可 以使用setEchoChar(char c)设置回显字符(默认的回显字符是'*'), char[] getPassword()方法返回密码框中的密码。 25 3.ActionEvent事件 当用户在有输入焦点的文本框中按回车键、单击按钮、在一个 下拉式列表中选择一个条目等操作时,都发生界面事件。程序有时 要对发生的事件做出反应,来实现特定的任务。 在学习处理事件时,读者必须很好地掌握事件源、监视器、 处理事件的接口这三个概念。 JTextField和JPasswordField触发ActionEvent事件,通过处 理文本框这个具体的组件上的事件,来掌握处理事件的基本原理。26 3.ActionEvent事件_处理事件的基本原理1)事件源: 能够产生事件的对象都可以称为事件源,如文本框、按钮、下拉式列 表等。也就是说,事件源必须是一个对象,而且这个对象必须是Java认为能够发生 事件的对象。 2)监视器: 我们需要一个对象对事件源进行监视,以便对发生的事件做出处理。 事件源通过调用相应的方法将某个对象作为自己的监视器。例如,对于文本框,这 个方法是:addActionListener(ActioListener listener) 对于获取了监视器的文本框对象,在文本框获得输入焦点之后,如果用户按回 车 键 ,Java 运 行 系 统 就 自 动 用 ActionEvent 类 创 建 了 一 个 对 象 , 即 发 生 了 ActionEvent事件。也就是说,事件源获得监视器之后,相应的操作就会导致事件 的发生,并通知监视器,监视器就会做出相应的处理。 3)处理事件的接口: 发生ActionEvent事件的事件源对象获得监视器方法是: addActionListener(ActionListener listener); 该方法中的参数是ActionListener 类型的接口,因此必须将一个实现ActionListener接口的类创建的对象传递给该 方法的参数,使得该对象成为事件源的监视器。 监视器负责调用特定的方法处理事件,创建监视器的类必须提供处理事件的 特定方法,即实现接口方法。Java采用接口回调技术来处理事件,当事件源发生事 件时,接口立刻通知监视器自动调用实现的某个接口方法,接口方法规定了怎样处 理事件的操作。 27 3.ActionEvent事件_事件处理模式图10.9接口回调这一过程对程序是不可见的,Java在设计组件事件时已经设置好了 这一回调过程,程序只需让事件源获得正确的监视器,即将实现了正确接口的对 象 的 引 用 传 递 给 方 法 addActionListener(ActionListener listener) 中 的 参 数 listener。 我们称文本框和密码框事 件 源 可 以 发 生 ActionEvent 类 型事件。为了能监视到这种类 型的事件,事件源必须使用 addActionListener() 方 法 获 得 监视器;创建监视器的类必须 实现接口ActionListener。 事件 处理 模 式 如 图 10.9 所示.28 3.ActionEvent事件_ ActionEvent类中的方法4)ActionEvent类中的方法 ActionEvent 事 件 对 象 调 用 方 法 public Object getSource() 可 以 返 回 发 生 ActionEvent事件的对象的引用。 ActionEvent事件对象调用方法 public String getActionCommand() 获取发生 ActionEvent事件时,和该事件相关的一个命令字符串,对于文本框,当发生 ActionEvent事件时,用户在文本框中输入的文本字符串就是和该事件相关的一 个命令字符串。 例10-8中,窗口中有一个文本框text,text的事件监视器由PoliceStation 类负责创建。当用户在text中输入字符串回车后,监视器负责在命令输出该字符 串以及它的长度(效果如图10.10所示)。 例10-9中,titleText和passwordText有监视器。当在titleText中输入字符串回车 后,监视器负责将窗体的标题更改为当前titleText中的文本。当在passwordText中 输入密码回车后,监视器负责将密码显示在titleText中(效果如图10.11所示)。 例10-10使用匿名对象作为inputText的监视器,当在inputText中输入一个 数字字符串后,监视器负责计算这个数的平方,并将结果放入showText中(效果 如图10.12所示) 。 29 例子10-8,9,10 运行效果图10.10,10.11,10.1230 4.菜单项上的ActionEvent事件单击某个菜单项可以发生ActionEvent事件。菜单项 使用addActionListener(ActionListener listner)方法获得监视器。31 5.JTextArea文本区_1 JTextArea常用方法JTextArea类专门用来建立文本区,用户可以在文本区输入多行的文本.JTextArea(int rows, int columns) 构造一个可见行和可见列分别是rows和columns的文本区。 文本区对象可以使用下列方法: ◆setLineWrap(boolean b) 决定输入的文本能否在文本区的右边界自动换行; ◆setWrapStyleWord(boolean b)决定是以单词为界或以字符为界进行换行(b取true/false) 。 ◆getText()和setText(String s)获取并替换文本区的文本 ◆ append(String s) 尾加文本 ◆ insert(String s,int x) 在文本区的指定位置处插入文本 ◆ replaceRange(String newString,int start,int end) 将文本区start至end处的文本替换为新文本newString ◆ getCaretPosition() 获取文本区中输入光标的位置 ◆ setCaretPosition(int position) 设置文本区中输入光标的置(position不能大于文本区中 字符的个数) ◆ copy()和cut()方法 将文本区中选中的内容复制或剪切到系统的剪贴板 ◆ paste() 将系统剪贴板上的文本数据粘贴在文本区中。 ◆ setSelectionStart(int selectionStart)和setSelectionEnd(int selectionEnd)方 法设置选中的文本 ◆select(int selectionStart,int selectionEnd)和selectAll()选中部分或全部文本例10-11中,单击菜单“编辑”中的相应菜单项将文本区中选中的内容剪切、 复制到系统剪贴板或将系统剪贴板的内容粘贴到文本区,效果如图10.13所示. 32 例子10-11 运行效果图10.1333 5.JTextArea文本区_2 文本区的DucumentEvent事件文本区可以触发DucumentEvent事件,DucumentEven类在javax.swing.event 包中。用户在文本区组件的UI代表的视图中进行文本编辑操作,使得文本区中的 文本内容发生变化,将导致该文本区所维护的文档模型中的数据发生变化,从而 导致DucumentEvent事件的发生。文本区调用◆ addDucumentListener(DucumentListener listener)向文本区维护的文档注册监视器。监 视器需实现DucumentListener接口,该接口中有3个方法:public void public void public void ◆ getDocument()changedUpdate(DocumentEvent e) removeUpdate(DocumentEvent e) insertUpdate(DocumentEvent e)返回维护的文档,该文档是实现了Document接口类的一个实例。例10-12中,有两个文本区和一个文本框。 当用户在文本区inputText进行编辑操作时, 文本区showText将显示第一个文本区中所有 和指定模式匹配的字符串。用户可以事先在 一个文本框patternText中输入指定的模式, 比如,输入:[^\s\d\p{Punct}]+,即通过 该模式获得文本区inputText中的全部单词, 效果如图10.14所示。 34 事件处理模式图10.935 10.7 按钮与标签组件_1.JButton按钮JButton类是专门用来建立按钮的,即JButton类创建的一个对象就是一个按钮。 JButton类常用的方法如下: ◆Button(String text) 创建名字是text的按钮。 ◆public JButton(Icon icon) 创建带有图标icon的按钮。 ◆public JButton(String text, Icon icon) 创建名字是text且带有图标icon的按钮 ◆public void setText(String text) 重新设置当前按钮的名字,名字由参数text指定。 ◆public String getText() 获取当前按钮上的名字。 ◆public void setIcon(Icon icon) 重新设置当前按钮上的图标。 ◆public Icon getIcon() 获取当前按钮上的图标 ◆public void setHorizontalTextPosition(int textPosition) 设置按钮名字相对按钮上图标的水平位置。 ◆public void setVerticalTextPosition(int textPosition) 设置按钮上名字相对按钮上 图标的垂直位置。 ◆public void setMnemonic(char mnemonic) 设置按钮的键盘激活方式,mnemonic的有效值 为'a'~'z'。如果按钮用此方法设置了键盘激活方式,如参数mnemonic取值'o',那么在键盘操作 ALT+O就可激活按钮。 ◆public void addActionListener(ActionListener) 向按钮增加动作监视器。 ◆public void removeActionListener(ActionListener) 移去按钮上的动作监视器。 按钮可以发生ActionEvent事件,当按钮获得监视器之后,用鼠标单击按钮或按钮获得焦点时按下空 格键(Space键),就发生ActionEven事件,即java.awt.envent包中的ActionEvent类自动创建了一 个事件对象。例10-13中,单击按钮切换按钮上的图标,效果如图10.15所示。 36 例子10-13 运行效果图10.1537 2.JLabel标签JLabel类负责创建标签对象,标签用来显示信息,但没有编辑功能。 JLabel类的构造方法如下: ◆ public JLabel() 创建没有名字的标签。 ◆ public JLabel (String s) 创建名字是s的标签,s在标签中靠左对齐。 ◆ public JLabel (String s,int aligment) 参数aligment决定标签中的文字在标签中的水平对齐方式。aligment的取值是JLabel.CENTER、JLabel.LEFT或JLabel.RIGHT。 ◆ public JLabel (Icon icon) 创建具有图标icon的标签,icon在标签中靠左对齐。 ◆ public JLabel (String s,Icon icon,int aligment) 创建名字是s,具有图标icon 的标签。参数aligment决定标签中的文字和图标作为一个整体在标签中的水平对齐方式(名字总 是在图标的右面)。JLabel类的常用实例方法如下: ◆ String getText() 获取标签的名字。 ◆ void setText(String s) 设置标签的名字是s。 ◆ Icon getIcon() 获取标签的图标。 ◆ void setIcon(Icon icon) 设置标签的图标是icon。 ◆ void setHorizontalTextPosition(int a) 参数a确定名字相对于标签上的图标的位置。a的取值是JLabel.LEFT或JLabel.RIGHT。 ◆ void setVerticalTextPosition(int a) 参数a取值是JLabel.BOTTOM或JLabel.TOP。参数a确定名字相对于JLabel上的图标的位置。38 10.8 复选框与单选按钮组件_ 1.JCheckBox复选框复选框提供两种状态一种是选中,另一种是未选中,用户通过单击该组件切换状态。 JCheckBox类常用方法如下: ◆ public JCheckBox() 创建一个没有名字的复选框,初始状态是未选中。 ◆ public JCheckBox(String text) 创建一个名字是text的复选框,初始状态是未 选中。 ◆ public JCheckBox(Icon icon) 创建一个带有默认图标icon但没有名字的复选框, 初始状态是未选中。 ◆public JCheckBox(String text, Icon icon) 创建一个带有默认图标和名字text 的复选框,初始状态是未选中。 ◆ public void setIcon(Icon defaultIcon) 设置复选框上的默认图标。 ◆ public void setSelectedIcon(Icon selectedIcon) 设置复选框选中状态下的图 标。该方法可能经常被使用,因为如果不明显地设置选中状态时的图标,复选框无论是 选中状态还是未选种状态总是显示复选框上的默认图标,用户很难知道复选框是处于怎 样的状态。 ◆ public boolean isSelected() 如果复选框处于选中状态该方法返回true,否则 返回false。如果复选框没有指定默认图标,复选框就显示为一个“小方框”,如果是 选中状态,“小方框”里面就有个小对号。39 复选框与单选按钮组件_ItemEvent事件当复选框获得监视器之后,复选框从未选中状态变成选中状态或从选中 状态变成未选中状态时就发生ItemEvent事件,ItemEvent类将自动创建一个事 件对象。 ◆发生ItemEvent事件的事件源获得监视器的方法是◆ 处 理 ItemEvent 事 件 的 接 口 是 ItemListener , 创 建 监 视 器 的 类 必 须 实 现 ItemListener接口,该接口中只有一个的方法。当在复选框发生ItemEvent事 件时,监视器将自动调用接口方法public void itemStateChanged(ItemEvent e) 对发生的事件做出处理。 ◆ItemEvent事件对象除了可以使用getSource()方法返回发生Itemevent事件的事件源外,也可以使用getItemSelectable()方法返回发生Itemevent事件的事件源。addItemListener(ItemListener listener) 由于复选框可以发生ItemEvent事件,JCheckBox类提供了addItemListener()方法。例10-14处理了复选框上的ItemEvent事 件,当复选框被选中时,窗口中心显示 一个带图标的标签,否则隐藏这个带图 标的标签,效果如图10.16所示。 40 10.8 复选框与单选按钮组件_ 2.JRadioButton单选按钮单选按钮和复选框很类似,所不同的是在若干个复选框中我们可以同时选 中多个,而一组单选按钮同一时刻只能有一个被选中。 当创建了若干个单选按钮后,应使用ButtonGroup类再创建一个对象,然 后利用这个对象把这若干个单选按钮归组。归到同一组的单选按钮每一时刻只 能选一。 单选按钮和复选框一样,也触发ItemEvent事件。ButtonGroup fruit =new ButtonGroup(); JRadioButton button1=new JRadioButton(&小学&), button2=new JRadioButton(&中学&), button3=new JRadioButton(&大学&); fruit.add(button1); fruit.add(button2); fruit.add(button3);41 10.9 列表组件下拉列表是用户十分熟悉的一个组件。用户可以在下拉列表看到第一个选 项和它旁边的箭头按钮,当用户单击箭头按钮时,选项列表打开。 下拉列表的常用方法如下:◆ public JComboBox() 创建一个没有选项下拉列表。 ◆ public void addItem(Object anObject) 增加选项。 ◆ public int getSelectedIndex() 返回当前下拉列表中被选中的选项的索引,索引 的起始值是0。 ◆ public Object getSelectedItem() 返回当前下拉列表中被选中的选项。 ◆ public void removeItemAt(int anIndex) 从 下 拉 列 表 的 选 项 中 删 除 索 引 值 是 anIndex 的选项。 ◆ public void removeAllItems() 删除全部选项。 ◆ public void addItemListener(ItemListener) 向下拉列表增加ItemEvent事件的 监视器。下拉式列表事件源可以发生ItemEvent事件。当下拉列表获得监视器后, 用户在下拉列表的选项中选中某个选项时就发生ItemEvent事件,ItemEvent类 将自动创建一个事件对象。 例10-15中,列表的选项是Java源文件的名字。当选择一个选项后,程序在 一个文本区里显示所选择的Java源文件的全部内容,效果如图10.17所示。 42 例子10-15 运行效果图10.1743 10.10 表格组件使用JTable可以创建一个表格对象。可以使用JTable的下列构造方法 JTable(Object data[ ][ ],Object columnName[ ]) 创建表格。 表格的视图将以行和列的形式显示数组data每个单元中对象的字符串表示, 也就是说,表格视图中对应着data单元中对象的字符串表示。参数columnName 用来指定表格的列名。 用户在表格单元中输入的数据都被认为是一个Object对象,用户通过表格 视图对表格单元中的数据进行编辑,以修改二维数组data中对应的数据,在表 格视图中输入或修改数据后,需按回车键或用鼠标单击表格的单元格确定所输 入或修改的结果。当表格需要刷新显示时,调用repaint()方法。 例10-16是一个商品销售核算录入程序,客户 通过一个表格视图的单元格输入每件商品的名称、 单价和销售量。单击“每件商品销售额”按钮, 表格视图每行的最后一个单元将显示该商品的总 销售额;单击“总销售额”按钮,表格视图将计 算最后一列值的和,同时表格增加一行,该行的 最后一个单元显示总销售额,效果如图10.18所示。 44 10.11 树组件_1.树与节点JTree类的实例称为树组件。树组件也是常用的组件之一,它由节点构成。 树组件的外观远比按钮要复杂得多。要想构造一个树组件,必须事先创建出称 为节点的对象。 任何实现MutableTreeNode接口的类创建的对象都可以成为树上的节点,树 中最基本的对象是节点,它表示在给定层次结构中的数据项。树以垂直方式显示 数据,每行显示一个节点。树中只有一个根节点,所有其他节点从这里引出。除 根节点外,其他节点分为两类一类是带子节点的分支节点,另一类是不带子节点 的叶节点。每一个节点关联着一个描述该节点的文本标签和图像图标。文本标 签是节点中对象的字符串表示,图标指明该节点是否是叶节点。 树组件的节 点中可以存放对象,javax.swing.tree包提供的DefaultMutableTreeNode类是实 现 了 MutableTreeNode 接 口 的 类 , 可 以 使 用 这 个 类 创 建 树 上 的 节 点 。 DefaultMutableTreeNode类的两个常用的构造方法是:DefaultMutableTreeNode(Object userObject)创建的节点默认可以有子节点 DefaultMutableTreeNode(Object userObject,boolean allowChildren) add()添加其他节点作为它的子节点。 setAllowsChildren(boolean b)方法 设置是否允许有子节点。 getUserObject()方法 得到节点中存放的对象。 JTree(TreeNode root) JTree的构造方法创建根节点是 root的树。 45 10.11 树组件_2.树上的TreeSelectionEvent事件◆ 树组件可以触发TreeSelectionEvent事件,树使用addTreeSelectionListener(TreeSelectionListener listener)方法获得一个监视器。 ◆当用鼠标单击树上的节点时,系统将自动用TreeSelectionEvent类创建一个 事件对象,通知树的监视器,监视器将自动调用TreeSelectionListener接口中 的方法。 ◆创建监视器的类必须实现TreeSelectionListener接口,此接口中的方法是:public void valueChanged(TreeSelectionEvent e) ◆getLastSelectedPathComponent()树使用该方法获取选中的节点。例10-17中,节点中存放的对 象由Student类创建,当用户选中节 点时,窗口中的文本区显示节点中 存放的对象的有关信息,效果如图 10.19所示。46 10.12 进度条组件_1.JProgressBar类JProgressBar类可以创建进度条组件。该组件能用一种颜色动态地填充自 己 , 以 便 显 示 某 任 务 完 成 的 百 分 比 。 三 个 常 用 的 构 造 函 数 JProgessBar() 、JProgressBar(int min,int max)和JProgressBar(int orient ,int min,int max)。 参数orient取值为JProgressBar.HORIZONTAL或JProgressBar.VERTICAL,决定进度条是 水平填充还是垂直填充。进度条可调用方法◆ pulic void set setValue(int n) 进度条默认用一种颜色水平填充自己 ◆ setMinimum(int min)和setMaximum(int max)可以改变最大和最小这两个值。 ◆ setSize() 设置进度条大。 注:进度条的最大值max是指将进度条平均分成max份。如果进度条的最小值是min,那么 使用setValue(int n)方法时,n不能小于min。 ◆ setStringPainted(boolean a) 设置是否使用百分数或字符串来表示进度条的进度情况 ◆ intgetValue() 获取进度值例10-18(效果如图10.20所示)用 进度条模拟显示线程的计算速度,一个线 程用递归算法输出Fibinacci序列的前50 项,另一个线程使用循环输出Fibinacci 序列的前100项(Fibinacci序列的前两 项是1,以后每项是前两项的和)。47 10.12 进度条组件_2.带进度条的输入流我们最熟悉进度条的一种用法是读取文件时出现一个表示读取进度的进度 条。这也是进度条的用武之地。如果读取文件时希望看见文件的读取进度,可 以使用javax.swing包提供的输入流类ProgressMonitorInputStream。它的构 造方法是:ProgressMonitorInputStream(Conmponent c,String s,InputStream); 它创建的输入流在读取文件时会弹出一个显示读取速度的进度条,进度条在参 数 c 指定的组件的正前方显示,若该参数取null,则在屏幕的正前方显示。 例10-19使用带进度条的输入流读取文件的内容,效果如图10.21所示。48 10.13组件的常见方法 JComponent类是所有组件的父类,本节介绍JComponent类的 几个常用方法。 组件都是矩形形状,组件本身有一个默认的坐标系,组件的 左上角的坐标值是(0,0)。如果一个组件的宽是20,高是10,那么 该坐标系中,x坐标的最大值是20,y坐标的最大值是10,如图 10.22所示。49 10.13组件的常见方法_1.组件的颜色public void setBackground(Color c) 设置组件的背景色。 public void setForeground(Color c) 设置组件的前景色。 public Color getBackground() 获取组件的背景色。 public Color getForeground() 获取组件的前景色。 上述方法中都涉及到Color类。Color类是java.awt包中的类,该类创建的 对象称为颜色对象。 ◆public Color(int red,int green,ing blue) Color类的构造方法,可以创建 一个颜色对象,其中red、green、blue的取值在0~255之间。另外,Color类中 还有red、blue、green、orange、cyan、yellow、pink等静态常量,都是颜色 对象。◆ ◆ ◆ ◆50 10.13组件的常见方法_2.组件透明组件默认是不透明的。 ◆ public void setOpaque(boolean isOpaque) 设置组件是否不透明,当参 数isOpaque取false时组件被设置为透明,取true时组件被设置为不透明。 ◆ public boolean isOpaque() 当组件不透明时该方法返回true,否则返回 false。51 10.13组件的常见方法_3.组件的边框组件默认边框是一个黑边的矩形。 ◆ public void setBorder(Border border) 设置组件的边框。 ◆ public Border getBorder() 返回边框。 组件调用setBorder()方法来设置边框,该方法的参数是一个接口,因此必 须向该参数传递一个实现接口Border类的实例,如果传递一个null,组件将取 消边框。 可以使用BorderFactory类的类方法返回一个实现接口Border类的实例,如 BorderFactory类的类方法 createBevelBorder(int type,Color highlight,Color shadow) 将会得到一个具有“斜角”的边框,参数type取值为BevelBorder.LOWERED或 BevelBorder.RAISED。52 10.13组件的常见方法_4.组件的字体◆ public void setFont(Font f) 组件调用该方法设置组件上的字体。 ◆ public Font getFont() 组件调用该方法获取组件上的字体。 ◆ java.awt包中的Font类创建的对象称为字体对象。Font类的构造方法是: public Font(String name,int style,int size);创建字体对象 其中name是字体的名字,如果系统不支持字体的名字,将取默认的名字创建字体对 象 。 style 决 定 字 体 的 样 式 , 是 一 个 整 数 , 有 效 取 值 是 : Font.BOLD 、 Font.PLAIN 、 Font.ITALIC、Font.ROMAN_BASELINE、Font.CENTER_BASELINE、Font.HANGING_BASELINE 或Font.TRUETYPE_FONT。 ◆ String [] getAvailableFontFamilyNames() GraphicsEnvironment对象调用该方法 获取计算机上所有可用的字体名称,并存放到字符串数组中。 ◆ GraphicsEnviroment类是java.awt包中的抽象类,不能用构造方法创建对象,Java运 行环境准备好了这个对象,只需让GraphicsEnvironment类调用它的类方法 public GraphicsEnvironment static getLocalGraphicsEnvironment() 获取这个对象的引用即可,如下所示: GraphicsEnvironment ge= GraphicsEnvironment.getLocalGraphicsEnvironment(); String fontName[]=ge.getAvailableFontFamilyNames(); 例10-20中,下拉列表listFont中列出全部可用字体名字,在下拉列表listFont中选 择字体名字后,文本区用相应的字体显示特定的文本“北京奥运”(效果如图10.23所 示)。 53 例子10-20 运行效果图10.2354 10.13组件的常见方法_5.组件的大小与位置◆ public void setSize(int width,int height) 设置组件的大小,参数width指定 组件的宽度,height指定组件的高度。 ◆ public void setLocation(int x,int y) 设置组件在容器中的位置,包含该组件的 容器都有默认的坐标系,容器的坐标系的左上角的坐标是(0,0),参数x和y指定该组件的 左上角在容器的坐标系中的坐标,即组件距容器的左边界 x个像素,距容器的上边界 y 个像素。 ◆ public Dimension getSize() 返回一个Dimension对象的引用,该对象实体中含有 名字是width 和height的成员变量,方法返回的Dimmension 对象的width的值就是组件 的宽度、height的值就是当前组件的高度。 ◆ public Point getLocation(int x,int y) 返回一个Point对象的引用,该对象实体 中含有名字是x 和y的成员变量,方法返回的Point对象x和y的值就是组件的左上角在容 器的坐标系中的x坐标和y坐标。 ◆ public void setBounds(int x,int y,int width,int height) 设置组件在容器中 的位置和组件的大小。该方法相当于setSize()方法和setLocation()方法的组合。 ◆ public Rectangle getBounds() 返回一个Rectangle对象的引用,该对象实体中含 有名字是x、y、width 和height的成员变量,方法返回的Rectangle对象x和y的值就是当 前组件左上角在容器坐标系中的x坐标和y坐标,width和height的值就是当前组件的宽度 和高度。 55 10.13组件的常见方法_6.组件的激活与可见性◆ public void setEnabled(boolean b) 设置组件是否可被激活。当参数b取值true 时,组件可以被激活,当参数b取值false时,组件不可激活。默认情况下,组件是可 以被激活的。 ◆ public void setVisible(boolean) 设置组件在该容器中的可见性。当参数b取 值true时,组件在容器中可见,当参数b取值false 时,组件在容器中不可见。除了 Window组件外,其他类型组件默认是可见的。56 10.14 窗口事件_1.WindowListener接口Frame类是Window类的子类,Window对象都能触发WindowEvent事件。当一个JFrame 窗口被激活、撤销激活、打开、关闭、图标化或撤销图标化时,就引发了窗口事件,即 WindowEvent创建一个窗口事件对象。窗口使用addWindowlistener()方法获得监视器, 创建监视器对象的类必须实现WindowListener接口,该接口中有7个不同的方法: ◆ public void WindowActivated(WindowEvent e) 当窗口从非激活状态到激活时,窗 口的监视器调用该方法。 ◆ public void WindowDeactivated(WindowEvent e) 当窗口激活状态到非激活状态时, 窗口的监视器调用该方法。 ◆ public void WindowClosing(WindowEvent e)窗口正在被关闭时,窗口监视器调用该 方法。 ◆ public void WindowClosed(WindowEvent e) 当窗口关闭时,窗口的监视器调用该 方法。 ◆ public void WindowIconified(WindowEvent e)窗口图标化时,窗口的监视器调用该 方法。 ◆ public void WindowDeiconified(WindowEvent e)当窗口撤销图标化时,窗口的监 视器调用该方法。 ◆ public void WindowOpened(WindowEvent e) 当窗口打开时,窗口的监视器调用该 方法。 57 10.14 窗口事件_几个特别的方法WindowEvent创建的事件对象调用getWindow()方法可以获取发生窗口事件的窗口。 当单击窗口上的关闭图标时,监视器首先调用WindowClosing()方法,然后执行窗 口初始化时用setDefaultCloseOperation(int n) 方 法 设定的关闭操作 , 最 后 再执行 WindowClosed()方法。 如果在WindowClosing()方法执行了System.exit(0);或setDefaultCloseOperation 设定的关闭操作是EXITON_ON_CLOSE或DO_NOTHING_ON_CLOSE,那么监视器就没有机会再 调用WindowClosed()方法。 当单击窗口的图标化按钮时,监视器调用WindowIconified()方法后,还将调用 windowDeactivated()方法。当撤销窗口图标化时,监视器调用windowDeiconified()方 法后还会调用windowActivated()方法。58 10.14 窗口事件_2.WindowAdapter适配器接口中如果有多个方法会给使用者带来诸多不便,因为实现这 个接口的类必须实现接口中的全部方法,否则这个类必须是一个 abstract类。 为了给编程人员提供方便,对于Java提供的接口,如果其中的 方法多于一个,就提供一个相关的称为适配器的类,这个适配器是 已经实现了相应接口的类。 例 如 , Java 在 提 供 WindowListener 接 口 的 同 时 , 又 提 供 了 WindowAdapter类,WindowAdapter类实现了WindowListener接口。 因此,可以使用WindowAdapter的子类创建的对象作为监视器,在 子类中重写所需要的接口方法即可。例10-21使用WindowAdapter的匿名类(匿名类就是WindowAdapter的一个 子类)作为窗口的监视器。59 10.15 鼠标事件_1.鼠标事件的触发 组件是可以触发鼠标事件的事件源。怎样才能导 致组件触发鼠标事件呢?用户的下列7种操作都可以使 得组件触发鼠标事件: ◆鼠标指针从组件之外进入。 ◆鼠标指针从组件内退出。 ◆鼠标指针停留在组件上时,按下鼠标。 ◆鼠标指针停留在组件上时,释放鼠标。 ◆鼠标指针停留在组件上时,单击鼠标。 ◆在组件上拖动鼠标指针。 ◆在组件上运动鼠标指针。 鼠标事件的类型是MouseEvent,即组件触发鼠标 事件时,MouseEvent类自动创建一个事件对象。 60 10.15 鼠标事件_2. MouseListener接口Java分别使用MouseListener接口与MouseMotionListener接口 两个接口来处理鼠标事件。 如果事件源使用addMouseListener(MouseListener listener)获取监 视器,那么用户的下列5种操作可使得事件源触发鼠标事件:◆鼠标指针从组件之外进入。 ◆鼠标指针从组件内退出。 ◆鼠标指针停留在组件上面时,按下鼠标。 ◆鼠标指针停留在组件上面时,释放鼠标。 ◆鼠标指针停留在组件上面时,单击或连续单击鼠标。创建监视器的类必须实现MouseListener接口,该接口有5个方法:◆ ◆ ◆ ◆ ◆ mousePressed(MouseEvent) 负责处理鼠标按下触发的鼠标事件。 mouseReleased(MouseEvent e) 负责处理鼠标释放触发的鼠标事件。 mouseEntered(MouseEvent e) 负责处理鼠标进入组件触发的鼠标事件。 mouseExited(MouseEvent e) 负责处理鼠标退出组件触发的鼠标事件。 mouseClicked(MouseEvent e) 负责处理鼠标单击或连击触发的鼠标事件。61 10.15 鼠标事件_2. MouseMotionListener接口Java分别使用MouseListener接口与MouseMotionListener接口两个接口来 处理鼠标事件。 如果事件源使用 addMouseMotionListener(MouseMotionListener listener)获取监视器, 那么用户的下列两种操作可使得事件源触发鼠标事件:◆在组件上拖动鼠标指针。 ◆在组件上运动鼠标指针。创建监视器的类必须实现MouseMotionListener接口,该接口有两个方法:◆ mouseDragged(MouseEvent e) 负责处理鼠标拖动事件,即在事件源上拖动鼠标时, 监视器将自动调用接口中的这个方法对事件做出处理。 ◆ mouseMoved(MouseEvent e) 负责处理鼠标移动事件,即在事件源上运动鼠标时, 监视器将自动调用接口中的这个方法对事件做出处理。由于处理鼠标事件的接口中的方法多于一个,Java提供了相应的适配器类, 分 别 是 MouseAdapter 和 MouseMotionAdapter, 这 两 个 类 分 别 实 现 了 MouseListener接口和MouseMotionListener接口。62 10.15 鼠标事件_3.MouseEvent 类 在处理鼠标事件时,程序经常关心鼠标在当前组件坐标系中的 位置, 以及触发鼠标事件使用的是鼠标的左键或右键等信息 。 MouseEvent类中有下列几个重要的方法:◆ getX() 返回触发当前鼠标事件时,鼠标指针在事件源坐标系中的x坐标。 ◆ getY() 返回触发当前鼠标事件时,鼠标指针在事件源坐标系中的y坐标。 ◆ getModifiers() 返回一个整数值,如果是通过鼠标左键触发的鼠标事件,该方法返 回的值等于InputEvent类中的类常量BUTTON1_MASK;如果是右键,返回的是InputEvent 类中的类常量BUTTON3_MASK。 ◆ getClickCount() 返回鼠标被连续单击的次数。 ◆ getSource() 返回触发当前鼠标事件的事件源。例10-22使用MouseListener接口 处理鼠标事件。在程序中,分别监视 按钮、标签和窗体上的鼠标事件,当 发生鼠标事件时,获取鼠标的坐标值, 效果如图10.24所示。注意:事件源的 坐标系的左上角是原点。 63 10.15 鼠标事件_4.用鼠标拖动组件 可以使用坐标变换来实现组件的拖动。当我们用鼠标拖动容器 中的组件时,可以先获取鼠标指针在组件坐标系中的坐标x,y,以 及组件的左上角在容器坐标系中的坐标a,b;如果在拖动组件时, 想让鼠标指针的位置相对于拖动的组件保持静止,那么,组件左上 角在容器坐标系中的位置应当是a+x-x0,a+y-y0,其中x0,y0是最 初在组件上按下鼠标时,鼠标指针在组件坐标系中的位置坐标。例10-23中,窗体中添加了一个分层 窗格,分层窗格中添加了一些组件。该例 子使用MouseListener接口 和 MouseMotionListener接口处理鼠标事件, 可以用鼠标拖动分层窗格中的组件,效果 如图10.25所示。 使用分层窗格是为了保证被拖动的组 件不会被其他组件遮挡。 64 10.15 鼠标事件_5.弹出式菜单 单击鼠标右键出现弹出式菜单是用户熟悉和常用的操作,这是 通过处理鼠标事件实现的。弹出式菜单由JPopupMenu类负责创建, 可以用下列构造方法创建弹出式菜单:◆ public JPopupMenu() 构造无标题弹出式菜单。 ◆ public JPopupMenu(String label) 构造由参数label指定标题的弹出式菜单。弹出式菜单需要在某个组件的正前方弹出可见,通过调用 public void show(Component invoker, int x, int y)方法设置弹出式菜单在 组件invoker上的弹出的位置,位置坐标(x,y)按invoker的坐标系。 例10-24中,在文本区上单击右键时, 在鼠标位置处弹出菜单,用户选择相应的 菜单项可以将文本区中选中的内容复制、 剪切到系统的剪贴板中或将剪贴板中的文 本内容粘贴到文本区,效果如图10.26所 示。 65 10.16 焦点事件 组件可以触发焦点事件。组件可以使用public void addFocusListener(FocusListener listener)增加焦点事件监视器。当组件具有焦点监视器后,如果组件从无输 入焦点变成有输入焦点或从有输入焦点变成无输入焦点都会触发 FocusEvent事件。创建监视器的类必须实现FocusListener接口, 该接口有两个方法:◆ public void focusGained(FocusEvent e) ◆ public void focusLost(FocusEvent e)当组件从无输入焦点变成有输入焦点触发FocusEvent事件时, 监视器调用类实现的接口方法 focusGained(FocusEvent e); 当组件从 有输入焦点变成无输入焦点触发FocusEvent事件时,监视器调用 类实现的接口方法focusLost(FocusEvent e)。 一个组件调用 public boolean requestFocusInWindow() 方法可以获 得输入焦点。 66 10.17 键盘事件_ 1.使用KeyListener接口处理键盘事件当一个组件处于激活状态时,组件可以成为触发KeyEvent事件的事件源。 当某个组件处于激活状态时,如果用户敲击键盘上一个键就导致这个组件触发 KeyEvent事件。 组件使用addKeyListener()方法获得监视器。监视器是一个对象,创建该对 象的类必须实现接口KeyListener。接口KeyListener中有3个方法:◆ public void keyPressed(KeyEvent e) ◆ public void keyTyped(KeyEvent e) ◆ public void KeyReleased(KeyEvent e)。当按下键盘上某个键时,监视器就会发现,然后方法keyPressed()会自动执行, 并且KeyEvent类自动创建一个对象传递给 方法keyPressed() 中的参数e。方法 keyTyped()是Pressedkey()和keyReleased()方法的组合。 用KeyEvent类的public int getKeyCode()方法可以判断哪个键被按下、敲击 或释放,该方法返回一个键码值(如表10.1所示)。KeyEvent类的 public char getKeyChar()判断哪个键被按下、敲击或释放,该方法返回键的字符。 例10-25通过处理焦点实践和键盘事件来实现软件序列号的输入。当文本框 获得输入焦点后,用户敲击键盘将使得当前文本框触发KeyEvent事件,在处理事 件时,程序检查文本框中光标的位置,如果光标已经到达指定位置,就将输入焦点 转移到下一个文本框,效果如图10.27所示。 67 表10.1 键码表68 例子10-25 运行效果图10.2769 10.17 键盘事件_ 2.处理复合键◆ public void keyPressed(KeyEvent e) ◆ public void keyTyped(KeyEvent e) ◆ public void KeyReleased(KeyEvent e)。当按下键盘上某个键时,监视器就会发现,然后方法keyPressed()会自动执行, 并且KeyEvent类自动创建一个对象传递给 方法keyPressed() 中的参数e。方法 keyTyped()是Pressedkey()和keyReleased()方法的组合。 键盘事件KeyEvent对象调用getModifiers()方法,可以返回下列整数值,它 们分别是InputEvent类的类常量: ALT_MASK、CTRL_MASK、SHIFT_MASK 。 程序可以根据 getModifiers()方法 返回的值处理复合键事件。例如,对于 KeyEvent对象e,当使用CTRL+X复合键时,下面的逻辑表达式为true:e.getModifiers()==InputEvent.CTRL_MASK&&e.getKeyCode()==KeyEvent.VK_X例10-26中,用户通过CTRL+C、CTRL+X和CTRL+V实现文本区内容的复制、剪 切和粘贴。70 10.18 AWT 线程Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会 自 动 启 动 更 多 的 线 程 , 其 中 有 两 个 重 要 的 线 程 : AWT-EventQuecue 和 AWTWindows。 AWT-EventQuecue线程负责处理GUI事件,AWT-Windows线程负责将窗体或 组件绘制到桌面。 当程序中发生GUI界面事件时,AWT-EventQuecue线程就会来处理这个事件。 例如,单击了程序中的按钮,将触发ActionEvent事件,AWT-EventQuecue线程 就立刻排队等候执行处理事件的代码。Java虚拟机在各个线程之间快速切换, 保证程序中的窗口始终能显示在桌面上,同时也保证程序中的GUI事件以及其 他线程的任务得到处理和执行。 我们可以通过GUI界面事件,即在AWT-EventQuecue线程中,通知其他线程 开始运行、挂起、恢复或死亡(有关线程的知识参见8.9)。 例10-27中,单击“开始”按钮启动线程(该线程负责移动一个红色的标 签),单击“挂起”按钮暂时中断线程的执行,单击“恢复”按钮恢复线程, 单击“终止”按钮终止线程。71 10.19 计时器javax.swing包提供了一个很方便的Timer类,该类创建的对象称作计时器。 当某些操作需要周期性地执行,就可以使用计时器。我们可以使用Timer类的构 造方法Timer(int a, Object b)创建一个计时器,其中的参数a的单位是豪秒,确 定计时器每隔a 毫秒“震铃”一次,参数b是计时器的监视器。 计时器发生的震铃事件是ActinEvent类型事件。当震铃事件发生时,监视 器 就 会 监 视 到 这 个 事 件 , 监 视 器 就 回 调 ActionListener 接 口 中 的 actionPerformed方法 。因此当震铃每隔a毫秒发生一次时,方法 actionPerformed 就被执行一次。当我们想让计时器只震铃一次时,可以让计时器调用 setReapeats(boolean b)方法,参数b的值取false即可。 当我们使用Timer(int a, Object b)创建计时器,对象 b就自动地成了计时 器的监视器。如果使用 Timer(int a) 创建计时器,计时器必须再明显地调用 addActionListener(ActionListener listener)方法 获得监视器。另外,计时器也 还可以调用setInitialDelay(int depay)设置首次震铃的延时,如果没有使用该 方法进行设置,首次震铃的延时为a。 计时器通过调用方法start()启动计时器,调用方法stop()停止计时器、调 用restart()重新启动计时器。 例10-28中使用了计时器,使得标签每隔一秒钟显示一个汉字。单击“开 始”按钮启动计时器,每隔一秒标签显示一个汉字;单击“暂停”按钮暂停计 时器,标签不再显示下一个汉字;单击“继续”按钮重新启动计时器,效果如 图10.28所示。 72 例子10-28 运行效果图10.2873 10.20 MVC设计模式模型-视图-控制器(Model-View-Controller),简称为MVC。MVC是一种先进 的设计模式, 是Trygve Reenskaug 教授于1978年最早开发的一个设计模板或 基本结构,其目的是以会话形式提供方便的GUI支持。 MVC是一种通过三个不同部分构造一个软件或组件的理想办法: ※ 模型(model) 用于存储数据的对象。 ※ 视图(view) 为模型提供数据显示的对象。 ※ 控制器(controller)处理用户的交互操作,对于用户的操作作出响应,让 模型和视图进行必要的交互,即通过视图修改、获取模型中的数据;当模型中的 数据变化时,让视图更新显示。 从面向对象的角度看,MVC结构可以使程序更具有对象化特性,也更容易维 护。在设计程序时,可以将某个对象看作“模型”,然后为“模型”提供恰当的 显示组件,即“视图”。为了对用户的操作作出响应,我们可以选择某个组件 做“控制器”,当发生组件事件时,通过“视图”修改或得到“模型”中维护 着的数据,并让“视图”更新显示。 例10-29中,首先编写一个封装三角梯形的类,然后再编写一个窗口。要 求窗口使用三个文本框和一个文本区为三角形对象中的数据提供视图,其中三 个文本框用来显示和更新梯形对象的上底、下底和高的长度;文本区对象用来 显示梯形的面积。窗口中用一个按钮作为控制器,用户单击该按钮后,程序用 3个文本框中的数据分别作为梯形的上底、下底和高的长度,并将计算出的三 角形的面积显示在文本区中,效果如图10.29所示。 74 例子10-29 运行效果图10.2975 10.21 播放音频用Java可以编写播放.au、.aiff、.Wav、.Midi、.rfm格式的音频。假设 音频文件hello.au位于应用程序当前目录中,播放音频的步骤如下: 1.创建File对象: File musicFile=new File(&hello.au&); 2.获取URI对象:URI(Uniform Resource Identifier) 类是java.net包中的类,URI对 象中封装着一个资源的字符串表示。File对象调用public URI toURI()返回一个 URI对象: URI uri=musicFile.toURI(); 3.获取URL对象: URL(Uniform Resource Locator)类是java.net包中的类,URL对象 中封装着一个资源的字符串表示,URI对象调用public URL toURL()返回一个URL 对象: URL url=uri.toURL(); 4.创建音频对象:为了播放音频,必须首先获得一个AudioClip对象,AudioClip 类是java.applet包中的类。 可以使用Applet的一个静态的方法 newAudioClip(java.net.URL url) 根据参 数url封装的音频获得一个可用于播放的音频对象clip, clip对象可以使用下 列方法来处理声音文件: ◆ play() 开始播放, ◆ loop() 循环播放, ◆ stop() 停止播放。 例10-30中有7个按钮,按钮上的名字依次是&1&、&2&?&7&。将7个名字依 次为&1.au&?&7.au&的音频文件存放在应用程序当前目录中。单击名字是&1& 的按钮,程序就播放&1.au&音频文件,依次类推。效果如图10.30所示。 76 例子10-30 运行效果图10.3077 10.22按钮绑定到键盘_1.AbstractAction类与特殊的监视器按钮绑定到键盘通常被理解为用户直接敲击某个键代替用鼠标单击该按钮 所产生的效果 。 1.AbstractAction类与特殊的监视器 如果按钮通过addActionListener()方法注册的监视器和程序为按钮的键盘 操作指定的监视器是同一个监视器,用户直接敲击某个键(按钮的键盘操作)就 可代替用鼠标单击该按钮所产生的效果,这也就是人们通常理解的按钮的键盘 绑定。 抽象类 javax.swing.AbstractAction类 已经实现了 Action接口 ,因为大部分 应用不需要实现Action中的其他方法,因此编写AbstractAction类的子类时,只 要重写public void actionPerformed(ActionEvent e)即可,该方法是ActionListener接口中的方法。 为按钮的键盘操作指定了监视器后,用户只要敲击相应的键,监视器就执行 actionPerformed()方法。78 10.22按钮绑定到键盘_2.指定监视器的步骤以下假设按钮是button,listener是AbstractAction类的子类的实例。 ( 1 ) 获 取 输 入 映 射 : 按 钮 首 先 调 用 public final InputMap getInputMap(int condition)方法 返回一个InputMap对象,其中参数condition取值JCompent类的 下列static常量:WHEN_FOCUSED,WHEN_IN_FOCUSED_WINDOW,WHEN_ANCESTOR_OF_FOCUSED_COMPONENT。例如:InputMap inputmap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); (2)绑定按钮的键盘操作:步骤(1)返回的输入映射首先调用方法 public void put(KeyStroke keyStroke,Object actionMapKey)将敲击键盘上的某键指定为按钮的 键 盘 操 作 , 并 为 该 操 作 指 定 一 个 Object 类 型 的 映 射 关 键 字 , 例 如 :inputmap.put(KeyStroke.getKeyStroke(&A&),&dog&);(3)为按钮的键盘操作指定监视器:按钮调用方法 public final ActionMap getActionMap()返回一个ActionMap对象: ActionMap actionmap = button.getActionMap();然后,该对象actionmap调用方法 public void put(Object key,Action action) 为按钮的键盘操作指定监视器(实 现单击键盘上的键通知监视器的过程)。例如:actionmap.put(&dog&,listener);例10-31中为按钮绑定了键盘操作:为名字是& 1& 、& 2& ?& 7& 的按钮绑定的键 盘操作依次是键盘上名字为& 1& ,& 2& ?& 7& 的键。程序实现的功能是用户敲击键 盘上名字是& 1& 的键,程序播放& 1.au& 音频文件,依次类推。 79 10.23 对话框_1.JDialog类JDialog类和JFrame都是Window的子类,对话框必须依赖于某个窗口或组件, 当它所依赖的窗口或组件消失,对话框也将消失;而当它所依赖的窗口或组件可 见时,对话框又会自动恢复。需要注意的是,对话框可见时,默认地被系统添加 到显示器屏幕上,因此不允许将一个对话框添加到另一个容器中。 通过建立JDialog的子类来建立一个对话框类,然后这个类的一个实例(即 这个子类创建的一个对象)就是一个对话框。JDialog类的主要方法◆ JDialog() 构造一个无有标题的初始不可见的对话框,对话框依赖一个默认的不可 见的窗口,该窗口由Java运行环境提供。 ◆ JDialog(JFrame owner) 构造一个无标题的初始不可见的无模式的对话框,owner 是对话框所依赖的窗口,如果owner取null , 对话框依赖一个默认的不可见的窗口,该 窗口由Java运行环境提供。 ◆ JDialog(JFrame owner, String title) 构造一个具有标题的初始不可见的无模式 的对话框,参数title是对话框的标题的名字,owner是对话框所依赖的窗口,如果 owner取null , 对话框依赖一个默认的不可见的窗口,该窗口由Java运行环境提供。 ◆ JDialog(JFrame owner, String title,boolean modal) 构造一个具有标题title 的初始不可见的对话框。参数modal决定对话框是否为有模式或无模式,参数owner是对 话框所依赖的窗口,如果owner取null , 对话框依赖一个默认的不可见的窗口,该窗口 由Java运行环境提供。 ◆ setModal(boolean b) 设置对话框的模式,b取true时为有模式,取false为无模式。 ◆ setVisible(boolean b) 显示或隐藏对话框。 ◆ public void setJMenuBar(JMenuBar menu) 对话框添加菜单条。 80 10.23 对话框_2.对话框的模式对话框分为无模式和有模式两种。 如果一个对话框是有模式的对话框,那么当这个对话框处于激活状态时,只 让程序响应对话框内部的事件,程序不能再激活它所依赖的窗口或组件,而且它 将堵塞当前线程的执行,直到该对话框消失不可见。也就是说,某个线程执行了 使模式对话框dialog可见的代码,如 dialog.setVisible(true); 那么,该线程将进入堵塞状态。当单击对话框上的关闭图标或通过处理对话框 中的其他GUI事件,使得该对话框消失不可见,该线程才结束堵塞,重新排队等 待CUP资源。单击对话框上的关闭图标或对话框中的其他GUI事件的处理是由 Java虚拟机启动的AWT-EventQuecue线程帮助完成的。 在进行一个重要的操作动作之前,最好能弹出一个有模式的对话框。 无模式对话框处于激活状态时,程序仍能激活它所依赖的窗口或组件, 它也不堵塞线程的执行。 例10-32中,当对话框处于激活状态时,命令行无法输出信息,当对话框 消失时,再根据对话框消失的原因,命令行输出信息:“你单击了对话框的 Yes按钮”或“你单击了对话框的No按钮”。81 10.23 对话框_3.输入对话框输入对话框含有供用户输入文本的文本框、一个确认和取消按钮,是有模式 对话框。当输入对话框可见时,要求用户输入一个字符串。javax.swing包中的 JOptionPane类的静态方法: public static String showInputDialog(Component parentComponent, Object message, String title, int messageType) 可以创建一个输入对话框,其中参数parentComponent指定消息对话框所依赖的 组件,确认对话框会在该组件的正前方显示出来,参数message指定对话框上的 提示信息,参数title指定对话框上的标题,参数messageType可取的有效值是 JoptionPane 中 的 类 常 量 ERROR_MESSAGE,INFORMATION_MESSAGE, WARNING_MESSAGE,QUESTION_MESSAGE,或PLAIN_MESSAGE,这些值可以确定对话框 的外观,如取值WARNING_MESSAGE时,对话框的外观上会有一个明显的“!”符号。 单击输入对话框上的确认按钮、取消按钮或关闭图标,都可以使输入对话框 消失不可见,如果单击的是确认按钮,输入对话框将返回用户在对话框的文本框 中输入的字符串,否则返回null。 82 10.23 对话框_4.消息对话框消息对话框是有模式对话框,进行一个重要的操作动作之前,最好能弹出 一个消息对话框。javax.swing包中的JOptionPane类的静态方法: public static void showMessageDialog(Component parentComponent, String message, String title, int messageType) 可以创建一个消息对话框,其中参数parentComponent指定消息对话框所依赖的 组件,消息对话框会在该组件的正前方显示出来;message指定对话框上显示的消 息;title指定对话框的标题;messageType可取的有效值是JOptionPane的类常量 WARNING_MESSAGE,INFORMATION_MESSAGE,ERROR_MESSAGE,QUESTION_MESSAGE 或 PLAIN_MESSAGE。 这些值可以确定对话框的外观,如取值WARNING_MESSAGE时,对话框的外观 上会有一个明显的“!”符号。 ShowMessageDialog方法是void类型,消息对话框的作用就是提示用户,不返回 值给用户。 83 10.23 对话框_5.确认对话框public static int showConfirmDialog(Component parentComponent, Object message, String title,int optionType)确认对话框是有模式对话框,javax.swing包中的JOptionPane类的静态方法:可以创建一个确认对话框,其中参数parentComponent指定消息对话框所依赖的 组件,确认对话框会在该组件的正前方显示出来;message指定对话框上显示的消 息;title指定对话框的标题;messageType可取的有效值是JOptionPane的类常量: YES_NO_CANCEL_OPTION,YES_NO_OPTION或OK_CANCEL_OPTION。这些值可以确定 对话框的外观,如取值YES_NO_OPTION时,对话框的外观上会有“Yes”和“No” 两个按钮。 确认对话框消失后,showConfirmDialog方法会返回JOptionPane的类常量: YES_OPTION,JOptionPane.NO_OPTION、CANCEL_OPTION, OK_OPTION或CLOSED_OPTION 。 返回的具体值依赖于用户单击了确认对话框上的哪个按钮以及对话框上的关闭 图标。 例10-33中,用户在输入对话框中输入数字字符,如果输入的字符中有非数字 字符将弹出一个消息对话框,提示用户输入了非法字符,该对话框消失后,将清除 用户输入的非法字符;如果用户的输入没有非法字符,将弹出一个确认对话框,让 用户确认,如果单击“确认”对话框上的“是(Y)”按钮,就在数字放入文本区。 84 效果如图10.31所示。 例子10-33 运行效果图10.3185 10.23 对话框_6.颜色对话框可以用javax.swing包中的JColorChooser类的静态方法:public static Color showDialog(Component component, String title, Color initialColor)创建一个有模式的颜色对话框,其中参数component指定颜色对话框可见时的位 置 , 颜 色 对 话 框 在 参 数 component 指 定 的 组 件 的 正 前 方 显 示 出 来 ; 如 果 component为null, 颜色对话框在屏幕的正前方显示出来。title指定对话框的 标题;initialColor 指定颜色对话框返回的初始颜色。 用户通过颜色对话框选择颜色后,如果单击“确定”按钮,那么颜色对话 框将消失、showDialog方法返回对话框所选择的颜色对象;如果单击“撤消” 按钮或关闭图标,那么颜色对话框将消失、showDialog方法返回null。 例10-34中,当用户单击buttonOpen按钮时,弹出一个颜色对话框,然后根 据用户选择的颜色来改变按钮showColor的颜色。86 10.23 对话框_7.文件对话框文件对话框提供从文件系统中进行文件选择的界面。JFileChooser对象调用showDialog(Component parent,String s) showOpenDialog(Component parent) showSaveDialog(Component parent)方法都可以创建一个有模式的文件对话框。文件对话框将在参数指定的组件 parent的正前方显示,如果parent为null,则在系统桌面的正前方显示。 当 文 件 对 话 框 消 失 后 , 上 述 方 法 返 回 JFileChooser 的 类 常 量 APPROVE_OPTION或CANCEL_OPTION。返回的值依赖于单击了对话框上的“确认” 按钮还是“取消”按钮。当上面的某个方法返回APPROVE_OPTION时,我们可以 使用JFileChooser类的getSelecedFile()得到被选择的文件。 JFileChooser类的构造方法如下:◆ public JFileChooser() 调用showDialog返回的对话框中显示的初始目录是本地系 统的默认目录。 ◆ public JFileChooser(File currentDirectory) 调用showDialog返回的对话框中 显示的初始目录是参数currentDirectory指定的目录。例10-35中,单击“打开文件”按钮,系统将弹出一个文件对话框,用户可 以把选择的文件的内容显示在一个文本区中。 87 10.24多文档界面_1 概述Java实现多文档界面(MDI)常用的方式是在一个JFrame窗口中添加若干个 内部窗体。内部窗体由JInternalFrame类负责创建,这些内部窗体被限制在 JFrame窗口中。在使用内部窗体时,需要将内部窗体事先添加到JDesktopPane 桌面容器中,然后把桌面容器添加到JFrame窗口即可。 桌面容器使用方法add(JInternalFrame e, int layer);添加内部窗体,并指定 内部窗体所在的层次,其中参数layer取值JLayeredPane类中的类常量(该类是 JDesktopPane 的 父 类 )DEFAULT_LAYER 、 PALETTE_LAYER 、 MODAL_LAYER 、 POPUP_LAYER或DRAG_LAYER。 JDesktopPane桌面对象调用下面方法◆public void setLayer(JInternalFrame c,int layer)可以重新设置内部窗体c所在的层 ◆public int getLayer(JInternalFrame c)可以获取内部窗体c所在的层数。内部窗体也可以自己调用◆ public void setLayer(int layer) 重新设置内部窗体所在的层。桌面容器经常使用下列方法和它里面的内部窗体发生联系:◆public JInternalFrame[ ] getAllFrames() 返回桌面中所有层次中的内部窗体。 ◆public JInternalFrame[ ] getAllFramesInLayer(int layer)返回桌面中指定层次 上的全部内部窗体。 ◆public JInternalFrame getSelectedFrame()返回桌面中处于活动状态的内部窗体。 88 10.}

我要回帖

更多关于 java swing 登录界面 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信