网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java 图形用户界面设计(上)     
  文章作者:未知  文章来源:水木森林  
  查看:106次  录入:管理员--2007-11-17  
 
  作为一个 java 程序员,从论坛上感受到使用 java 开发程序的人越来多,心中不免欣慰。但是,同样是从论坛中,看到多数人提到 java 就以为是网络开发——不是这样的,java 也可以开发应用程序,而且可以开发出漂亮的图形用户界面的应用程序,也就是 windows/xwindow 应用程序。因此,我写下这篇文章,希望能带你进入java 图形用户界面设计之门。
  一. awt 和 swing
  awt 和 swing 是 java 设计 gui 用户界面的基础。与 awt 的重量级组件不同,swing 中大部分是轻量级组件。正是这个原因,swing 几乎无所不能,不但有各式各样先进的组件,而且更为美观易用。所以一开始使用 awt 的程序员很快就转向使用 swing 了。
  那为什么 awt 组件没有消亡呢?因为 swing 是架构在 awt 之上的,没有 awt 就没有 swing。所以程序员可以根据自己的习惯选择使用 awt 或者是 swing。但是,最好不要二者混用——除开显示风格不同不说,还很可能造成层次 (z-order) 错乱,比如下例:
  /**
  * testpanels.java
  * @author fancy
  */
  import javax.swing.*;
  import java.awt.*;
  public class testpanels extends jframe {
  public testpanels() {
  setdefaultcloseoperation(exit_on_close);
  jpanel panel = new jpanel();
  for (int i = 0; i < 2; i++) {
  panel.add(new jbutton("button 00" + i));
  }
  jtextarea textarea = new jtextarea(5, 15);
  textarea.setlinewrap(true);
  jscrollpane scrollpane = new jscrollpane(textarea);
  getcontentpane().add(panel, borderlayout.north);
  getcontentpane().add(scrollpane, borderlayout.center);
  pack();
  }
  public static void main(string[] args) {
  testpanels tp = new testpanels();
  tp.show();
  }
  }
  运行这个程序,并用鼠标拖动那个名为“cover”的子窗口,我们会发现一个非常有趣的现象,如图:
   java 图形用户界面设计(上)(图一)
  显然 cover 子窗口是在 controls 子窗口之上的,但是它只罩盖住了 swing button,没有罩盖住 awt button。再看一会儿,你是不是有这样一种感觉:swing button 是“画”上去的,而 awt button 则是“贴”上去的。这就是二者混用造成层次错乱的一个例子。
  swing 组件有美观、易用、组件量大等特点,也有缺点——使用 swing 组件的程序通常会比使用 awt 组件的程序运行更慢。但是大家都还是更喜欢用 swing 组件,原因何在?因为随着计算机硬件的升级,一点点速度已经不是问题。相反的,用户更需要美观的用户界面,开发人员则更需要易用的开发组件。
  ——好,我这就来教你使用 swing 组件开发图形用户界面的 java 应用程序。
  二. 框架、监听器和事件
  框架 (frame) 是 java 图形用户界面的基础,它就是我们通常所说的窗口,是 windows/xwindow 应用程序的典型特征。说到 windows/xwindow,大家很容易联想到“事件 (event) 驱动”。java 的图形用户界面正是事件驱动的,并且由各种各样的监听器 (listener) 负责捕捉各种事件。
  如果我们需要对某一个组件的某种事件进行捕捉和处理时,就需要为其添加监听器。比如,我们要在一个窗口 (jframe) 激活时改变它的标题,我们就需要为这个窗口 (jframe 对象) 添加一个可以监听到“激活窗口”这一事件的监听器——windowlistener。
  怎么添加监听器呢?这通常由组件类提供的一个 addxxxxxlistener 的方法来完成。比如 jframe 就提供有 addwindowlistener 方法添加窗口监听器 (windowlistener)。
  一个监听器常常不只监听一个事件,而是可以监听相关的多个事件。比如 windowlistener 除了监听窗口激活事件 (windowactivate) 之外,还可以监听窗口关闭事件 (windowclosing) 等。那么这些事件怎么区分呢?就靠重载监听器类 (class) 的多个方法 (method) 了,监听器监听到某个事件后,会自动调用相关的方法。我们只要重载这个方法,就可以处理相应的事件了。
  不妨先看一个例子:
  /**
  * testframe.java
  * @author fancy
  */
  import javax.swing.*;
  import java.awt.event.*;
  public class testframe extends jframe {
  private int counter = 0;
  public testframe(){
  /* 使用匿名类添加一个窗口监听器 */
  addwindowlistener(new windowadapter() {
  public void windowclosing(windowevent e) {
  system.out.println("exit when closed event");
  system.exit(0); //退出应用程序
  }
  public void windowactivated(windowevent e){settitle("test frame " + counter++); // 改变窗口标题
  }
  });
  setresizable(false); // 设置窗口为固定大小
  setsize(200, 150);
  }
  public static void main(string[] args) {
  testframe tf = new testframe();
  tf.show();
  }
  }
  这个例子中,我们设计了一个窗口类(public class testframe extends jframe { ...),并且为这个窗口添加了一个窗口监听器 (addwindowlistener(new windowadapter() ...)。而我们添加的这个窗口监听器主要监听了两个事件:窗口关闭 (public void windowclosing(windowevent e) ...) 和窗口激活 (public void windowactivated(windowevent e) ...)。在窗口关闭事件中我们退出了整个应用程序(system.exit(0);),而在窗口激活事件中,我们改变了窗口的标题 (settitle("test frame " + counter++);)。最后,我们在 main 方法中显示了这窗口类的一个实例,运行得到下图所示的结果:
   java 图形用户界面设计(上)(图二)
  这个程序的运行结果就是一个什么东西都没有加的框架,也就是一个空窗口。那么,你知道显示一个窗口最主要的几句代码吗?不知道没关系,我来告诉你,显示一个窗口只需要做三件事:生成实例(对象) -> 设置大小 -> 显示,相应的,就是下面的三句代码:
  jframe frame = new jframe("frame's title");
  frame.setsize(400, 300);
  frame.show();
  也许你会说:第一句的意思我清楚,第三句的意思我也明白,为什么一定要第二句呢?其实想想也就明白了,叫你画一个没法有大小的矩形你能画出来吗?不能。同样,没有大小的窗口,怎么显示?所以我们需要用 setsize(int width, int height) 方法为其设置大小。我们还有另一种方法:用 jframe 的 pack() 方法让它自己适配一个大小。pack() 在多数时候是令人满意的,但有时,它也会让你哭笑不得——多试试就知道了。
  在 jframe 中,我们使用 addwindowlistener 方法加入一个监听器 windowlistener (addwindowlistener(new windowadapter() ...) 去监听发生在 jframe 上的窗口事件。windowlistener 是一个接口,在 java.awt.event 这个包中,但是上例中好象并没有使用 windowlistener,而是使用的 windowsadapter 吧,这是怎么回事?
  windowadapter 是 windowslistener 接口的一个最简单的实现,也在包 java.awt.event 中。如果我们直接使用 windowlistener 产生一个匿名类,需要实现它的每一个方法 (一共 7 个)。但 windowadapter 作为 windowlistener 最简单的实现,已经实现了它的每一个方法为空方法 (即只包含空语句,或者说没有语句的方法)。用 windowadapter 就只需要重载可能用到的方法 (上例中只有 2 个) 就行了,而不需要再去实现每一个方法。优点显而易见——减少代码量。
  在 jframe 上发生的窗口事件 (windowevent) 包括:
  windowactivated(windowevent e) 窗口得到焦点时触发
  windowclosed(windowevent e) 窗口关闭之后触发
  windowclosing(windowevent e) 窗口关闭时触发
  windowdeactivated(windowevent e) 窗口失去焦点时触发
  windowdeiconified(windowevent e) 
  windowiconified(windowevent e) 
  windowopened(windowevent e) 窗口打开之后触发
  上例重载了其中两个方法。如果在上例运行产生的窗口和另外一个应用程序窗口之间来回切换 (在 windows 操作系统中你可以使用 alt+tab 进行切换)……试试看,你发现了什么?有没有现我们的示例窗口标题上的数字一直在增加,这便是在 windowactivated 事件中 settitle("test frame " + counter++); 的功劳。
  而另一个事件处理函数 windowclosing 中的 system.exit(0) 则保证了当窗口被关闭时退出当前的 java 应用程序。如果不作这样的处理会怎样呢?试验之后你会发现,窗口虽然关闭了,但程序并没有结束,但此时,除了使用 ^c 强行结束之外,恐怕也没有其它办法了。所以,这一点非常重要:如果你想在关闭窗口的时候退出应用程序,需要你自己写代码处理 windowclosing 事件。……也不尽然,其实还有另外一个更简单的办法,让 jframe 自己处理这件事——你只需要如下调用 jframe 的 setdefaultcloseoperation 即可: frame.setdefaultcloseoperation(jframe.exit_on_close);
  我们可以在 jframe 对象中添加 awt 或者 swing 组件。但是,虽然它有 add 方法,却不能直接用于添加组件,否则会抛出异常——不信就试试。造成这个现象的原因只有一个解释:jframe 不是一个容器,它只是一个框架。那么,应该怎么添加组件呢?
  jframe 有一个 content pane,窗口是显示的所有组件都是添加在这个 content pane 中。jframe 提供了两个方法:getcontentpane 和 setcontentpane 就是用于获取和设置其 content pane 的。通常我们不需要重新设置 jframe 的 content pane,只需要直接获取
 
 
上一篇: java 图形用户界面设计(下)    下一篇: jboss配置 mysql数据库连接池
  相关文档
独家专访袁红岗:谈jsf的未来之路(上篇) 11-17
java编辑多语言的福音--推荐一个经典的多语言文件编辑的插件re.. 11-17
tomcat5.5下的jndi的配置实例 11-17
利用缓冲技术提高jsp程序的性能和稳定性 03-31
subversion宣布subversion 1.3 发布 11-17
关于 web2.0 时代的核心应用:ajax简介 12-27
eclipse forms设计漂亮ui之布局 11-16
使用socket连接穿越cmwap代理 11-17
j2me移动 2d 图形开发快速入门 11-17
首个java恶意手机代码出现 11-17
《java编程思想》(第二版)第6:重复运用classes 11-17
网友分享:构建高性能j2ee应用的10个技巧 11-06
folders 集合 11-16
为测试java应用程序生成证书链 11-17
jakarta tapestry 4.0 rc 1 11-17
substr 方法 11-16
对《java与模式》中工厂方法模式的异议 01-22
java swing中使用双击事件 11-16
hivemind, pico, spring ioc 11-17
eclipse-sdk-3.2m1-win32 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息