Java对于服务器 个人电脑和移动设备来说是一项伟大的技术 由于需要java的跨平台的特性 因此java在服务器和移动设备方面的应用是非常成功的 但java在个人电脑应用方面的情况和在服务器及移动设备方面的应用有所不同 但是这很快就会有所改变 至少比你想象得要快 在这篇文章中 我会分析一下java在
桌面环境中的应用将怎样得到提升 然后具体说一下java GUI(用户图形接口)的三个主要的工具:AWT Swing 和SWT 在下文中 我将会开发一个完整的java桌面
应用程序 Java与桌面端 现在 流行的桌面平台要数Windows Mac and Linux了 但它们不是十全十美的 Windows主宰著桌面 *** 作系统的市场 其上有巨大的应用和开发群体 但它昂贵且有许多安全漏洞 Linux有着稳固的基础 它是开源的软件 比Windows更可靠 Macs非常容易 *** 作且不是黑客的目标 但与Windows和Linux比起来 Mac的硬件和软件可选的余地非常的有限 公司和个人选择他们的 *** 作系统基于许多因素 花费少且安全性高是首选的因素 这导致一些组织从Windows 系统转而选择Linux 对许多用户来说 可用性及对原有应用程序的支持是非常重要的因素 这意味着Windows 将继续享有巨大的市场 Mac有其自己忠诚的用户 这使得苹果机仍然可以存活 Linux 在桌面的流行及Mac的成功创造了多样性 这种多样性正是Java需要的 这种多样性使得Java在桌面有举足轻重的地位
跨平台的支持 Java 运行于所有相关的 *** 作系统 包括Windows Mac和Linux 对于任何组织 他想把现有的应用从一个 *** 作系统移植到另一个 *** 作系统而不用做太多的改动 那么Java正是他们首选的桌面开发平台 或许用微软的可视化工具很容易构建 NET应用 但是这将使你被绑定在了Windows平台上了 很多人也许想立刻用Linux 代替Windows 从而避免由微软件 *** 作系统的漏洞带来的问题 用户不能容忍的问题之一是当从Windows移植到Linux带来的巨大的费用 如果你的应用程序用Java构建 你就没有了这些问题 Java的图形用户界面看上去会跟你用的 *** 作系统一样 而并不需要做什么改动 假如有一天又有一种桌面 *** 作系统出现的话 java 是个安全的赌注 因为它现在能够运行在Windows和Linux 上 那么可以推测它也可以运行在将来可能出现的 *** 作系统上 这些 *** 作系统可能或迟或早地由微软 或是开源社区 或是其它的人开发出来
丰富的特征 最初 Java只有非常有限的一些特征去构建图形用户界面 思想就是用平台无关的Java应用程序接口打包不同的 *** 作系统的本地图形用户界面 称之为抽象的窗口工具 仅有普通的部件如文件域 文本区 选择框 单选按钮 列表框和按钮被AWT支持 图形和图像的特性支持非常有限 也就是说 只足够构建简单的applet程序 认识到需要更高级的图形用户界面组件和图形能力 Sun公司开发了Swing Java D Java D 图像的输入/输出 Java高级图像(JAI)和很多其它的 这些中的一些窗体组件现在已经是Java 标准版(J SE)里的一部分 并且其它的一些扩展必须和你的应用程序打包在一起 例如Swing Java D 图像的输入/输出都是Java的核心API 随着Java开发工具包(JDK)和Java运行环境一起提供 让我们不要忘了J EE平台 如果你开发服务器端的应用程序并且需要丰富的图形用户界面 那么你毫无疑问应该选择Java 这允许你把服务器端的一些代码移到客户端 反之亦然 例如 一个项目可能开始是基于WEB和图形界面 在某些时候 用户可能要求图形元素不能在HTML中实现 如果你选择java做客户端应用 那么你可以重用这些当初用来做服务器端的代码 如果你用远程调用 一些类会真正地实现服务器和客户端的共享 通过页面服务器 Java桌面应用也能够和其它的Java 或非Java应用程序通信 如CORBA TCP/IP 或是 HTTP
Java图形界面工具 Java有三个主要的图形界面工具 AWT Swing和SWT Swing 是构建java图形界面标准的API(应用程序接口) 一些AWT类由Swing基础而来 SWT是一个非常有前途的新的窗体工具 由IBM资助 但是事实上 这三者相互补充 他们满足不同的需求
AWT 抽象窗口工具集为简单的applet程序设计 它不适宜用来构建丰富的桌面图形界面 但是从开始被介绍 它至少有一个好的思想就是布局管理 它负责为组件找到一个放置的位置 这种机制是必需的 因为GUI组件在不同的 *** 作系统中有不同的尺寸 现在 AWT扩展了组件模型和事件处理机制(由JavaBeans说明定义) 新的图形API(称为Java D) 支持剪贴板和拖拉 *** 作 打印 准入 和新的GUI工具Swing 所有这些都归到Java基础类中(JFC) Swing Swing是曾经开发的最复杂的GUI之一 它有一套完全的组件从按钮到文件域到表格 树型和文件编辑器 这些组件不依赖于 *** 作系统本地的部件 而是用原始的图形像直线 矩形 文字画出 这种画代表感观插件 它能够模仿本地的感观 Swing也有平台无关的外观称为 Metal Swing的结构由MVC模式得到启发 这里在屏幕上的视觉GUI组件和支持数据的模型对象之间有一个明显的分隔 在GUI和数据层之间的通讯基于事件 在最初的Swing版本中有许多错误并且有执行问题 这减慢了接受它的速度 Swing最大的问题是被从事于并且许多人相信它是为开发桌面应用而准备的 今天 有许多基于Swing开发的商业产品 包括大多数的Java集成开发工具 我所喜欢的集成开发工具是Jbuilder 它的速度相当的快
SWT SWT是IBM为它的Eclipse集成开发环境而开发的图形用户界面工具 SWT可以在Eclipse环境外使用 而且提供对 *** 作系统本地图形用户界面的直接访问 因此 基于SWT的Java应用程序拥有本地的图形用户界面并且可以和本地别的应用程序和部件集成在一起 假如你的桌面应用程序产生HTML报表 你想把它显示给用户看 你可以使用Swing去浏览简单的HTML文档 但这不是一个理想的的解决方案 最好是在你的应用程序里提供IE或者Mozilla浏览器引擎 SWT社区现在正在设计浏览器API 这些API可以让你产生基于IE或者Mozilla的HTML窗口 SWT现在可以在AIX HPUX Linux QNX Solaris and Windows下面运行 Mac OS X is 也在进行之中
误解与Bug 对于java/Swing一直有着误解 诸如 Java/Swing太慢了 或者是Java/Swing需要更多的内存 Swing也许在老式的奔腾的cpu而且只有 m内存运行JDK 运行起来却是很慢 但是如果在PIII级别的CPU有着 mb的内存 运行JDK 环境是足够快的 对于一个应用程序来说鼠标在 毫秒和在 毫秒的反映的区别 对于使用者来说看起来是 没什么区别的 Java在企业级的数百人 上千人同时在线的服务器表现的很好 Java在对于有限资源的移动设备上的表现也是很出色的 那为什么Java不能成为很好的桌面应用程序呢?以我的观点看 Swing的bug比其运行速度慢这问题还严重 例如 如果你用
的是JDK 你将不能在表格(称为JTable)中输入%&($#!q 等这些字符 这八个字符和箭头键及Home End Pgup and Pgdn这几个键的键值是相同的 其中一个由JTable由到的类调用了KeyEvent getCharCode()方法代替KeyEvent getKeyCode() 这个bug这JDK 已经得到了纠正 你大概已经放弃过Swing 如果你是从用JDK 的Swing 你可能因为你不能在表格里输入q而恼怒 可能不幸的是你正需要用Jtable开发一个Swing应用 你将花费许多时间从sun的bug数据库中查找解决的办法 但没有发现你需要的(记住在那时Swing还是个新事物) 你将花费更多的时间去看Swing的源代码和发展中的工作区 经过了这个的经历之后 很少有人很在另一个项目里再用Swing了 你的工作区会像下面这样子 import java awt *import java awt event *import javax swing *import javax swing table *public class WorkingTable extends JTable { public static final boolean JDK = System getProperty( java version ) startsWith( )public void processKeyEvent(KeyEvent e) { if (JDK ) { char ch = e getKeyChar()if (e getID() == KeyEvent KEY_TYPED &&(( <= ch &&ch <= 40) || ch == 'q')) { int anchorRow = getSelectionModel().getAnchorSelectionIndex()int anchorColumn = getColumnModel() .getSelectionModel().getAnchorSelectionIndex()if (anchorRow != -1 &&anchorColumn != -1) { if (!isEditing()) editCellAt(anchorRow, anchorColumn)Component editorComp = getEditorComponent()if (isEditing() &&editorComp instanceof JTextField) { JTextField textField = (JTextField) editorComptextField.setText(textField.getText() + ch)return} } } } super.processKeyEvent(e)} } 不幸的是,Swing有许多像上面描述的那样的问题,一些问题很难解决,需要做大量的工作。Tw.WInGwiT.例如,Swing的打开文件和保存文件的对话框是基于称为JfileChooser的组件,它部分的执行了JDK 1.2和JDK 1.3(一些特性总是不能用的,要创建一个新的目录对大多数用户来是一个挑战)。我不知道为什么Sun需要几年的时间直到jdk1.4中才完成JfileChooser。在JDK 1.4之前,你有两种选择:用这种破烂的JfileChooser或是创建你自己的文件选择框,Borland公司在他们的JBuilder 4中做一个很好的文件打开对话框。然而,大多数的开发者用的是标准的JfileChooser,给他们的用户带来许多问题。有一件重要的事情需要注意:可以像上面描述的那个去创建工作环境,因为Swing的源代码是可以得到的。学习java源代码也能够让你成为更好的程序员并且让你理解工作在Java API的内部机制。当你开发你自己习惯的GUI组件,这点是有用 lishixinzhi/Article/program/Java/hx/201311/26851
我承认即使在JavaFX出现之前Java已经在桌面领域做出了一些重大的提升 比如Swing中的提升 我们现在也有了很棒的OpenGL DirectX也有了很大的提升 启动时间也显著提升了 没错 Java在去年做了很多显著而有效的工作
然而不得不说的是 除此之外其他的仍是一塌糊涂 比如Java sound实际上并不好用 被遗弃的Java D又如何呢?最近甚至JOGL也被Sun遗弃 包括很久之前的SwingLab JAI(用作图片处理)多年未真正升级过 看起来也没有在什么地方得到利用 它迫切需要性能上的巨大提升以适应来临的多核GPU时代所有这些应用于桌面领域的Java产品不是被遗弃就是成为鸡肋
而且很关键一点是 尽管我们可以用Java创建出桌面应用 但只要我们想开发真正的富桌面应用我们就无法真正使用Java而使用JNI C/C++和平台依赖的libraries等
使用Java构建桌面应用更多的是困难和麻烦 比如即便想要在Java应用内创建一个高效的优良的web浏览器都是一件难事 而且没有用Java编写的图片处理应用 没有一个纯粹的Java web浏览器 没有数字音频应用 没有 D建模器 没有矢量图形编辑器 没有先进的光栅编辑器 Java今日在桌面端所到达的高度只能满足那些服务器开发者 因为他们只需要在远程服务时使用电脑桌面上的简单界面
过去我们一直说这是因为Java太慢 无法在一个慢的平台上开发出如此复杂的应用 但我们这样说是错的 原因有两点 一 Java从来就没有慢过 即便有些部分曾经慢过 但没有人怀疑当它需要被用到服务器端时它会迅速地得到提升 比如JITs GCs等 这一点也正是Java语言卓越的地方 二 由于Java平台的天然特性 Java应用总是第一个利用市场上新硬件和新 *** 作系统的应用 一旦JVM被配置到了一个新系统中 几乎不需要任何编辑和调试 Java应用就可以在上面全速运行 比如你在 位的 *** 作系统上开发了一个应用 它就可以全速运行在Windows 或者Solaris的 位JVM上 所以所谓的Java太慢根本不能成为Java在桌面端碌碌无为的借口
而且 如果你是一个终端用户 你甚至不需要从网站上重新下载应用 这意味着不仅终端用户和开发者得到了速度提升 甚至应用的执行性能的前边也得到了速度提升 今天 JIT在runtime为本地 *** 作优化代码已经做得很棒了 这意味着你可以挖掘出你运行的硬件的全部的能力 这是一个静态编译语言永远也无法竞争过的性能 只是这个性能如果可以运用到桌面端和游戏领域就好了
我们总是说 由于Sun总是一个服务器端公司的原因 Java在桌面端一直没有真正的机会 而Oracle的收购让这种境况看起来不会有什么改变 希望这不要再继续下去 为了Sun Oracle和Java自身的利益 Oracle内部的知名人士应该提醒公司来让他们知道 如果缺乏了在桌面端的能力和效率 必将影响Java的普及率甚至它在服务器端的占有率
我们一直以来习惯着Sun主要提供服务器端服务 因而想象著未来更多的处理能力还是出现在服务器端 而客户端不过是连接服务器的简单服务 这种情况已被证明是绝对错误的 因为未来的桌面应用将服务 应用与硬件所有的运算能力相结合 大量的数据和解码 声音 图像 视频被开发者处理 而且用并行编程的方式来实现 既保证了丰富的性能又保证了速度 对开发者来说 未来的服务既需要他们在客户端处理也需要在服务器端处理 执行复杂的搜索 图像 视频以及虚拟 D环境需要服务器端的技术 而远程服务如医学分析 远程教育和远程会议等则需要客户端能力
只是令我们感到失望的是历史又一次地重复了 因为至今Java中还没有什么大的动作
armin Ehrenreich 在回复中说道 说的好 我完全认同
确实迫切需要跨平台的桌面应用技术 而且我不认为C++结合Qt是个好的选择 你说阐述的问题之所以没有引起很多的共鸣 我想是文化上的问题 许多Java社区的人们包括Sun内部的负责人无法理解你所说的 所以我断言Oracle也不会对Java做出什么大的改变
客户端现在基本上被微软和Apple包揽 到Cocoa论坛中会发现他们谈论的是GUI的可用性 响应性 终端户如何处理桌面应用等而我们的论坛呢 大部分人认为应用的未来在服务器端 这就是文化上的差异
但是桌面技术需要做很多工作 Swing很慢很慢地进化 连同Netbeans平台 Java D JOGL等应用勉强成为了桌面端的一个选择 但Sun置此境遇于不顾 只是模仿Flash发布了一款新的脚本语言 但是那些API只有使用JavaFX才可用
Jeff Martin回复道 正确的观点 但我有一点不同 Sun真正的问题是他应该吃自己的饭 用自己的力量来用Java写一些实在的桌面应用 这可以证明他们关于Java在桌面端的承诺 证明他们可以写出应用 提升框架和工具 我不认为另一个框架会帮助Java
James Sugrue回复道 我同意作者观点 我也很支持桌面端开发 看看现在处于开发中的Eclipse e 中的一些项目 它们为桌面和浏览器提供了一个解决方案 所以我想还是有一些希望的 但我认为我们不需要过分聚焦于桌面端 JavaFX是正确方向上的一个迈进 只是无法在Swing和Java D/JOGL中看到应用提升
Osvaldo Doederlein回复道 我认为JOGL的支持没有那么糟糕 毕竟它是JavaFX Desktop Runtime的一个依赖 实际上 我们可以写一个非JavaFX的小程序 而且不需要请求本地代码的许可性就可以配置
lishixinzhi/Article/program/Java/hx/201311/25625
评论列表(0条)