Java论坛网»Java技术»学习Swing最好的书的序言

学习Swing最好的书的序言

问?:
什么书学习Swing最好呢
Java Swing 2nd Edition 还是 Java Swing with Samples
不管了,我暂且认为是 Java Swing with Samples吧,不过这本书没有看到有中文版的。下面是本书的序言,是由Java之父 JAMES GOSLING 写的
翻译了一下,但是不准确。

所以求个最准确的翻译,给分20。
作Swing的牛人肯定更有English好的,来看看吧
还有下面的那个JAMES GOSLING (包括公司等)具体翻译是什么啊

英文
*********************************************************************************
It’s been amazing to see the application that have been built using Swing. It’s an extraordinarily sophisticated user interface toolkit that gives great power to developers. This power leads to the biggest problem with Swing: the wide variety of facilities can be intimidating. One’s first contact with the Swing APIs can be a little like sticking your head into the cockpit of a 747: adizzying array of levers and dials that can be confusing. But there is a logic to it all. Once you know the terrirory, it’s easy to get around and the available facilities will make your job much easier.

The authors of this book have done a great job mapping out the territory and explaining the standard patterns that make Swing great. I love the way they have gone beyond just laying out the APIs to covering issues about what makes a good user interface. And what makes an application easy to understand and use. They also go beyond the usual snippets of code to develop complite applications. This is a great way to inter-relate all of the parts of the Swing APIs.
JAMES GOSLING
Vice President and Fellow
Sun Microsystem


我自己的翻译,不过意译的不准确,所以求个准确的翻译。谢谢牛人了
***********************************************************************************
看到用Swing开发的应用程序确实是件令人振奋的事。正是这个相当复杂的接口包提供给了开发者这种强大的功能。这种强大的功能导致的一个利用Swing的最大问题就是:Swing组件的弹性不足。你第一次接触Swing APIs时,可能对着747页的文档会使你感觉脑袋都大了:一组令你眼花缭乱的levers 和 dials。但是对这些所有的APIs来说,它们都是相当有逻辑性的。一旦你了解Swing的这种架构,你就会发现所有的这些组件都相当有用,而且Swing的弹性也会使你的工作变的更容易。

本书的作者在讲述Swing的架构和使得Swing更加出色标准模式方面作的相当出色。我喜欢作者的这种讲述方式,这种方式不是仅列出Swing的APIs而忽视掉“什么才是好的用户界面,什么是的我们的程序好用”。这种方式也不是仅列出代码段,在利用这些代码段构成一个完整的应用程序。这是一种相当好的解释Swing APIs的内部联系的方式。

JAMES GOSLING
Vice President and Fellow
Sun Microsystems
答!: 1:
747是波音飞机。。不是页数。。。

是说第一次接触swing就好像把头伸进波音747飞机的驾驶舱一样
答!: 2:
哪里有这本书的电子版下载啊?
或者哪位大侠有,发小弟我一份,谢谢了
andycpp2jre@gmail.com
答!: 3:
747是波音飞机。。不是页数。。。
great
答!: 4:
谢谢 坦克车 的
“747是波音飞机。。不是页数。。。”

to andycpp(幻瞳)
我有那本书,我发给你。呵呵
真诚的希望可以多多交流Swing,或者说程序上的事情 呵呵
答!: 5:
您提到的这两本书的电子版如果有的话,都给我发一下吧。
谢谢
最近工作变动,要学swing,正在找资料呢。
答!: 6:
songbird@163.com
刚才忘记说邮箱了~~呵呵
答!: 7:
to alvin_liao()
已经发了。呵呵
答!: 8:
to iceman1952()

发过了吗?好像还没收到耶~~~~~
andycpp2jre@gmail.com
答!: 9:
to iceman1952()

把你的邮箱留一下吧,有问题找你探讨!!!
答!: 10:
to iceman1952()

对不起,已经收到了!!!!!
Gmail把你的邮件列为垃圾邮件(狂汗~~~),刚才没注意!!
非常感谢!!
答!: 11:
xuyong913@163.com
答!: 12:
我的邮箱
希望作Swing的兄弟们,可以相互讨论一下

我的MSN:libing195205@163.com
QQ:290500532
答!: 13:
我也想要,非常感谢,是英文版的么?
mengqh_1999@hotmail.com
答!: 14:
要的请把邮箱地址写成这种格式
请楼下的把楼上的邮箱地址copy下来,然后把邮箱地址作为这种格式

a@163.com;b@163.com;c@sina.com

以便于我发送
就三天的时间,要的请遵守这个格式约定。呵呵
答!: 15:
andycpp2jre@gmail.com;mengqh_1999@hotmail.com;libing195205@163.com;xuyong913@163.com;
songbird@163.com;dearjalen@hotmail.com
答!: 16:
还有两天,要的赶快发邮箱

*********************************************************************************
要的请把邮箱地址写成这种格式
请楼下的把楼上的邮箱地址copy下来,然后把邮箱地址作为这种格式

a@163.com;b@163.com;c@sina.com

以便于我发送
就三天的时间,要的请遵守这个格式约定。呵呵
**********************************************************************************
答!: 17:
我要一份!!

wangkun1983@126.com

谢谢阿!!!
答!: 18:
揭贴了
答!: 19:
我也要一份~
moon_ghost_jian@126.com
谢谢LZ了!
答!: 20:
andycpp2jre@gmail.com;mengqh_1999@hotmail.com;libing195205@163.com;xuyong913@163.com;
songbird@163.com;dearjalen@hotmail.com;wangkun1983@126.com;moon_ghost_jian@126.com;3466408@163.com
答!: 21:
我们可以建一个MSN群,来一起翻译一下这本书。一人分几页

谁组织一下,大家一起翻译一下!!!
多找些人
到时候,每个人就分到三四十页,而且很快就翻译完成了

呵呵 好想法

谁可以组织一下兄弟们
答!: 22:
看来没有人愿意翻译啊

其实我们肯定翻译不好,不过,就像别人作开源的一样,我们也可以远程合作一下,也是一种经验。也可以促进大家看英文书的积极性,多好的事情啊。而且每个人就分到30多页。很快就完

弟兄们,响应一下吗???
我翻译了一点点。
Swing mechanics中 Painting and validation

2.11 Painting and Validation
JComponent的 painting 和 validation 机制的核心就是一个叫做 RepaintManager 的核心类。类 RepaintManger 负责将 painting 和 validation 请求发送到 系统事件队列中,这些请求在系统消息队列中等待被分发。总的来说,通过截获repaint()和revalidate()请求,在可能的时候合并这些请求,把这些请求包装在Runnable对象中,在把这些Runnable对象发送给方法invokeLater()。在我们实际讨论painting和validation处理的细节之前,我们需要更多的搞明白我们在本章的前面讲述的几个问题。
NOTE: 这部分包含了一些Swing的底层运作机制的相对交完善的解释。如果你刚刚接触Java或Swing,我们建议你跳过节,等你全面阅读本书后在回过头来阅读本节。如果你只是关心如何覆写和运用自己的painting方法,请阅读2.8节。如果想了解UI delegate的rendering,阅读第21章。
REFERENCE: 如果你想了解更详细的painting的处理过程。请看Swing的文章“Painting in AWT and Swing” at http://java.sun.com/products/jfc/tsc/special_report/Painting/painting.html.

2.11.1 Double-buffering
我们以前曾提到过double-buffering,但是你可能想知道如何在RepaintManager中禁用它,如何通过JComponent的setDoubleBuffered()方法来指定单个组件的double-buffering. 本节我们将介绍double-buffering是如何运作的。
所谓的"double-buffering"是这么的一种技术,在描绘组件的时候不是直接描绘到这个可见的组件上,而是描绘到一个off-screen的image上。最后,这个image才被描绘到屏幕上,当然将此image描绘到屏幕上,肯定要比直接朝屏幕上的可见组件上描绘快的多了。用AWT组件时,开发者必须自己实现这些AWT组件的double-buffering从而减少屏幕闪动。但是,很明显double-buffering应该时组件内置的特性,因为这个特性应用的太广泛了。所以你欣喜若狂的在现在的Swing中看到它,但是大可不必的,因为这本就是它该有的。
在幕后,double-buffering是这么组成的,首先建立一个Image(实际上是个volatile的image),然后得到这个image的Graphices对象以便在后来所有的painting方法中使用。如果被从新描绘的组件有孩子组件的话,这个Graphics对象会一直向下传递,用来对这些孩子repainting。所以,如果你对某个组件用了double-buffering了,那么这个组件的所有的孩子也就自动的应用了double-buffering了(不论是否这些孩子组件的double-buffering被禁用与否),因为这些孩子组件将被rendering到同一个Graphics对象。每个RepaintManager类只有一个off-screen image,而且每个applet或者application也仅仅只有一个RepaintManager实例(RepaintManager是一个服务类,这个类将自己的一个共享实例注册到AppContext上;详情请看2.5节)。
JAVA1.4: Java2D小组实现了一个新类叫做VolatileImage,这个类使得Java可以利用显卡硬件的一些便利。类RepaintManager有一个新的方法叫做getVolatileOffscreenBuffer()用来在使用double-buffering的时候得到VolatileImage
我们在第三章会看到,JRootPane在任何一个窗口(window)中都是一个顶级(top-level)Swing组件,包括在JInternalFrame中(实际上JInternalFrame不是一个窗口(window))。通过在JRootPane上使用double-buffering,这个窗口的所有的孩子都会利用double-buffering特性而被描绘。我们在最后一节将会看到,RepaintManager对所有组件的double-buffering也可以提供全局控制。所以一个使得所有的组件都使用double-buffering的方式就是调用这个方法:RepaintManager.currentManager(null).setDoubleBufferingEnabled(true)。
2.11.2 Optimized drawing
我们还没有深入的探讨过这个事实“在Swing中所有的组件都是可以交迭的”,是的,所有的组件都是可以交迭的。举例来说:JLayeredPane是一个容器(Container),这个容器允许任意数量的组件相互交迭。重绘这样一个容器比重绘一个不允许组件交迭的容器要复杂的多的多,这主要就是因为组件是可以透明的。
组件透明意味着什么呢?从技术上来说,也就是方法isOpaque()会返回一个false.我们可以通过方法setOpaque()来改变这个属性。"不透明"在这里就是说“一个组件必须要在它自己的范围内绘制自己的每个象素(pixel)”。如果opaque属性被设置为false,我们就不保证这个了(一个组件必须要在它自己的范围内绘制自己的每个象素)。当属性opaque是false时,这就使得整个painting机制变的相当复杂了。
JComponent的方法isOptimizedDrawingEnabled()在所有的JComponent的子类中-除了JLayedPane, JViewport和JDesktopPane-,都被覆写为返回true。基本上,调用这个方法和询问一个组件"你的孩子们是否可以交迭"是等同的。如果是,如果回答是可以交迭,那么为了“任意数量的组件都可以相互交迭(实际上从这个容器的任何一个层次上都可以交迭)”则(比组件间不可以交迭)多的多任务要被完成。既然组件是透明的,那么一个完全位于另一个组件后面的组件就也完全可以显示出来。这样的组件就不必是兄弟(也就是说他们可以不在同一个容器中)因为我们完全可以让一些透明的容器位于其他的容器之上。在这种情况下,我们必须要作很多的"树形遍历"来确定那些组件需要被刷新。如果方法isOptimizedDrawingEnabled()返回了true,那么我们就可以确定我们根本不必像上面所说的那么作。因此,painting就变的更加高效了,甚至是最优化的painting了。
答!: 23:
2.11.3 Root validation
我附加的内容,请记住下面的这句话:“true: 不影响别人,JRootPane, JScrollPane, JTextField;false: 影响别人”。
当组件需要被重新布局时,就会产生一个revalidate()的请求。当一个这么样的一个请求发送出去后,必须有一种方式来决定这么一个事情“重新布局这个组件,是否会影响到其他的东西”。JComponent的isValidateRoot()方法对大部分的组件来说都返回一个false(影响别人)。调用这么个方法和询问一个组件“如果我重新布局你的内容,你的父组件以及你的兄弟组件也不需要重新布局,对吗?”,默认情况下,只有JRootPane, JScrollPane,和JTextField返回true(不影响别人,也就是说“这三个组件的父母兄弟组件都不需要重新布局”,而其他的组件的内容被重新布局后,这些组件的父母兄弟则需要从新布局)。咋一看,这挺令人吃惊的,但是情况就是这样:只有这些组件,他们的内容可以在任何情况下被重新布局,而不影响到他们的父母兄弟。无论我们在JRootPane,JScrollPane,或者JTextField中作多大的改变,容器也不会改变他们的大小或者位置,除非有外部因素的影响,比方说父母兄弟组件改变了。为了让你确信这一点,你这么作,你把一个JTextArea放到一个容器中,这个JTextArea不要放到JScrollPane中。你会看到,建立一个新行将会依照你的Layout而改变JTextArea的大小。这种情况不是这样的“很少发生,或者可以阻止”,而是确实发生了。方法isValidateRoot()就是用来告知我们这种情况的。那么这个方法用在什么地方呢?
当某个组件的属性被改变了,并且这个属性值的改变会影响这个组件的大小、位置、或者内部布局,那么这个组件或者这个这个组件的父组件通常都会被revalidate。通过在某个组件的父组件上递归的调用isValidateRoot()方法,直到这个方法返回true(不影响别人),这样最终我们就会得到某个离内容改变的那个组件最近的祖先组件,这个祖先组件就可以保证,它的布局变化不会影响到别人(即不会影响到这个祖先组件的父母兄弟)。RepaintManager类就是依靠isValidateRoot()方法来分发validation请求的。
NOTE: 当我们说兄弟组件的时候,我们指得是在同一个容器中的组件。当我们说父组件的时候,我们指得是父容器。
用在组件JList, JTree和JTable中的Cell Renderer,则不是这样的。这些Cell Renderer被包装在CellRendererPane的实例中,而且这些组件的Cell Renderer的所有的validation和repainting请求不会通过容器级别来传播。关于CellRendererPane的更多细节以及为什么会有CellRendererPane这样的情况(Cell Renderer被包装在CellRendererPane的实例中,而且所有的validation和repainting请求不会通过容器级别来传播)存在,请看第十七章。在此,我们只是简单的提一下,Cell Renderer并不遵循这个在此处讨论的这个painting和validation的规律。
2.11.4 RepaintManager
class.javax.swing.RepaintManager
在每个applet或者每个application中,都仅仅只有一个RepaintManage类的实例。所以,除非我们自己创建了RepaintManager的实例(大部分情况下,我们根本就不需要这么作),所有的repainting都是用注册到AppContext类的一个RepaintManager的共享实例来管理的。我们经常通过这样得到这个实例:myRepaintManager = RepaintManager.currentManager(null);
这个方法以某个组件作为参数,但是,传个他什么参数都一样,没有什么关系。实际上,传给这个方法的参数在这个方法内部根本就没有用到。所以null在此也可以很安全的使用。(这种定义的存在是为了子类来用的,如果子类会用到更多的RepaintManager的实例)。
RepaintManager的存在有两个目的:通过合并指定的某个组件树的所有组件的paint/validation请求,提供高效的revalidation和repainting。RepainManager类实例,截获所有的repaint()和revalidate()请求。这个类也被用来处理Swing中的所有的double-buffering和维护一个单一Image。这个Image的最大值默认情况下,就是屏幕的大小。但是,我们可以手动的通过RepainManager的setDoubleBufferMaximumSize()方法来改变Image的大小。(所有的其他的RepaintManager的功能将在本节的任何需要的地方讲述)。
2.11.5 Revalidation
有这么一个Vector,它里面存储的是需要被validate的组件。而RepaintManager就维护这个Vector。一旦截获了revalidate()请求,发出这个revalidate()请求的组件就被传送到addInvalidComponent()方法,并且对这个组件调用isValidateRoot()方法来检查这个组件的validateRoot属性。而同样的事情(即,看看这个父组件的isValidateRoot()方法返回什么值(直到这个方法返回true))会递归的发生在这个组件的所有的父组件上,直到isValidateRoot()方法返回true。然后再检查这个最终的组件(就是最终方法isValidateRoot()返回true的那个父组件),如果存在的话,的可见性。如果这个最终组件的某个父容器不可见,那么就没有必要validate这个最终组件。否则(这个最终组件的所有的父容器都是可见的),如果这个最终组件所有的父容器都返回false,RepaintManager就会遍历这个组件树,直到到达最终的root 组件,也就是Window或者Applet。类RepaintManager的实例这时检查Vector中的所有的invalid组件,来看我们现在找到的最终组件是不是在这个Vector中,如果不在这个Vector里面,那么加入这个最终组件到这个Vector中,加入这个最终组件到Vector后,RepaintManager就会把根容器传给SystemEventQueueUtilities(系统事件队列工具类)的queueComponentWorkRequest()方法(我们在2.3中曾经见过SystemEventQueueUtilities类)。然后这个方法queueComponentWorkRequest()检测是否有个叫做ComponentWorkRequest的类对应着已存在在work requests表中的root。如果还没有这个root,就会建立个。如果已经存在着了这个root,则得到这个root的引用。然后这个方法queueComponentWorkRequest()方法同步访问ComponentWorkRequest,如果还没有这个root,则就把这个root放进这个work request表中,如果这个root是个新的,还有检查这个root是不是已经被放入了系统事件队列中。如果还没有放进系统事件队列,这个方法就把root送到SwingUtilities的invokeLater()方法。然后把这个root标记为“已经放入了系统事件队列”,这时同步块就结束了。当ComponentWorkRequest最终在“事件分发线程中最终运行时,这个root通知RepainManager去执行validateInvalidComponent()方法,接着再执行paintDirtyRegions()方法”。
方法validateInvalidComponent()检查RepaintManager的盛有需要validate的组件的Vector,然后在这个方法中再对所有的这些需要validate的组件调用validate()方法(validate()方法实际上比我们这里描述的还要小心翼翼,这个方法对加入Invalidate组件和validate需要validate的组件是同步的)。
paintDirtyRegions()方法就复杂的多了,我们在本章中,会讨论一下这个方法的某些细节。现在,你需要知道的就是这个方法负责绘制(所有的由RepaintManager类来管理的组件的)被破坏的区域
答!: 24:
ismyway.com@gmail.com
谢谢楼主了。
答!: 25:
我想要这书,不过我英文很烂,我只打算看看示例,学学swing,请lz发个给我,谢谢
mrzl603@21cn.com

相关JAVA教程:
Javabean和Jsp传值问题
请问hibernate能否动态映射数据库表
myeclipse+struts+tomcat问题
麻烦各位介绍一个处理pdf,word的开源包(支持中文,java写的jar包)
求助JComboBox组件的鼠标响应事件和键盘事件的代码!在线等待。20分
请问大家用JAVA做C/S端的一个档案管理软件的可行性
谢谢大家的帖子,不过还是有些问题,谢谢了!!!!!!!
用hibernate插入blob对象报错
在myeclipse下如何利用数据库表或者映射文件生成持久化类?
NickLee.Framework2.0.0.3
jsp异常??
在这个程序中为什么str1的值总是null