﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Jiangshachina-随笔分类-GUI</title><link>http://www.blogjava.net/jiangshachina/category/33265.html</link><description>同是Java爱好者，相逢何必曾相识！&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;a cup of Java, cheers!</description><language>zh-cn</language><lastBuildDate>Tue, 16 Jul 2013 07:41:18 GMT</lastBuildDate><pubDate>Tue, 16 Jul 2013 07:41:18 GMT</pubDate><ttl>60</ttl><item><title>Custom Layout Manager: PyramidLayout(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2012/07/15/383156.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Sun, 15 Jul 2012 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2012/07/15/383156.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/383156.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2012/07/15/383156.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/383156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/383156.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: Courier;"> </span>
<div>
<div align="center"><strong><span style="font-size: 14pt; font-family: Courier;">Custom Layout Manager: PyramidLayout</span></strong></div>&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt; font-family: Courier;">已有太多关于自定义部局管理器的文章了。本文仅是一篇学习笔记，描述了如何实现一种像堆金字塔似的部局管理器，很简单，也有点儿意思，可能你也会感兴趣的。(2012.07.17最后更新)</span><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span><br />
<br />
<span style="font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp; I have developed Swing application for several years, although I'm not professional GUI developer, I'm shamed of never creating any custom layout manager. Maybe the existing Swing layout managers are too powerful to create new ones. At least, <a href="http://docs.oracle.com/javase/7/docs/api/java/awt/GridBagLayout.html"><span style="font-family: Courier;">GridBagLayout</span></a></span><span style="font-size: 10pt; font-family: Courier;"> is powerful enough for my real works. And we have much more flexible <a href="http://docs.oracle.com/javase/7/docs/api/javax/swing/GroupLayout.html"><span style="font-family: Courier;">GroupLayout</span></a></span><span style="font-size: 10pt; font-family: Courier;"> and <a href="http://docs.oracle.com/javase/7/docs/api/javax/swing/SpringLayout.html"><span style="font-family: Courier;">SpringLayout</span></a></span><span style="font-size: 10pt; font-family: Courier;">, of course, both of them are too complex, in fact I never use them directly. However I indirectly take advantage of GroupLayout due to using <a href="http://netbeans.org/"><span style="font-family: Courier;">NetBeans</span></a></span><span style="font-size: 10pt; font-family: Courier;">' GUI designer <a href="http://netbeans.org/features/java/swing.html"><span style="font-family: Courier;">Matisse</span></a></span><span style="font-size: 10pt; font-family: Courier;">.</span><br />
<br />
<strong><span style="font-size: 12pt; font-family: Courier;">1. Layout Manager basics</span></strong><br />
<span style="font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp; Let's start with some layout manager foundation. Before this time I learn to customize layout, I always think layout manager is very mysterious. Layout is like a magic player that put a variety of components to right positions in containers. I haven't browsed any code of any layout, event the simplest one. That's why I think layout is mystery. But it's simple for me now.</span><br />
&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt; font-family: Courier;">Generally, all of layout implements one or both of <a href="http://docs.oracle.com/javase/7/docs/api/java/awt/LayoutManager.html"><span style="font-family: Courier;">LayoutManager</span></a></span><span style="font-size: 10pt; font-family: Courier;"> and <a href="http://docs.oracle.com/javase/7/docs/api/java/awt/LayoutManager2.html"><span style="font-family: Courier;">LayoutManager2</span></a></span><span style="font-size: 10pt; font-family: Courier;"> interfaces. LayoutManager2 is LayoutManager's sub-interface, then if someone implements LayoutManager2 that means it really implements LayoutManager. Mostly all modern layouts implements LayoutManager2.</span><br />
<span style="font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp; Interface LayoutManager defines the basic methods must be implemented by every layout, all of them are intuitional: add new component--addLayoutComponent(); remove component--removeLayoutComponent(); calculate preferred size--preferredLayoutSize(); calculate minimum size--minimumLayoutSize(); how to layout the components--layoutContainer(). Absolutely, the layoutContainer() method is essential, you must instruct the parent container how to allocate space(bounds) for every component.</span><br />
<span style="font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp; The extension interface LayoutManager2 introduces more methods that if you have to: support constraints--addLayoutComponent(Component, Object); specify maximum size--maximumLayoutSize(); specify alignment--getLayoutAlignmentX() and getLayoutAlignmentY(); destroy specific caches or reset some variables when invaliding container--invalidateLayout().</span><br />
<br />
<strong><span style="font-size: 12pt; font-family: Courier;">2. PyramidLayout</span></strong><br />
<span style="font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp; Now let's feature a simple and funny layout manager--PyramidLayout. The layout allows container to add components like building a Pyramid, as shown as the image below,</span><br />
<span style="font-size: 10pt;"></span><img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/pyramidLayout.PNG" /><br />
<span style="font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp; As the above, PyramidLayout puts the first component on the bottom, then puts the second on top of the first, but its bounds is smaller, ... It looks like a Pyramid, doesn't it? Here is the full codes,</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">class</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;PyramidLayout&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">implements</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;LayoutManager2&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">private</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;List</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&lt;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">Component</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&gt;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;comps&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">new</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;LinkedList</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&lt;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">Component</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&gt;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">void</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;addLayoutComponent(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Component&nbsp;comp,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Object&nbsp;constraints)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">synchronized</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;(comp.getTreeLock())&nbsp;{<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comps.add(comp);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">void</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;addLayoutComponent(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;String&nbsp;name,&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Component&nbsp;comp)&nbsp;{<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addLayoutComponent(comp,&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">null</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">void</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;removeLayoutComponent(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Component&nbsp;comp)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">synchronized</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;(comp.getTreeLock())&nbsp;{<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comps.remove(comp);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">float</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;getLayoutAlignmentX(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Container&nbsp;target)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">0.5F</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">float</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;getLayoutAlignmentY(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Container&nbsp;target)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">0.5F</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">void</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;invalidateLayout(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Container&nbsp;target)&nbsp;{<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Dimension&nbsp;preferredLayoutSize(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Container&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">synchronized</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;(parent.getTreeLock())&nbsp;{<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Insets&nbsp;insets&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;parent.getInsets();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;width&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;insets.left&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">+</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;insets.right;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;height&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;insets.top&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">+</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;insets.bottom;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">if</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;(comps.size()&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">0</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">new</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Dimension(width,&nbsp;height);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dimension&nbsp;size&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;comps.get(</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">0</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">).getPreferredSize();<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">+=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;size.width;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">+=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;size.height;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">new</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Dimension(width,&nbsp;height);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Dimension&nbsp;minimumLayoutSize(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Container&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">synchronized</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;(parent.getTreeLock())&nbsp;{<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Insets&nbsp;insets&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;parent.getInsets();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;width&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;insets.left&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">+</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;insets.right;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;height&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;insets.top&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">+</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;insets.bottom;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">if</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;(comps.size()&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">0</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">new</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Dimension(width,&nbsp;height);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dimension&nbsp;size&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;comps.get(</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">0</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">).getMinimumSize();<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">+=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;size.width;<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">+=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;size.height;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">new</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Dimension(width,&nbsp;height);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Dimension&nbsp;maximumLayoutSize(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Container&nbsp;target)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">new</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Dimension(Integer.MAX_VALUE,&nbsp;Integer.MAX_VALUE);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">void</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;layoutContainer(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">final</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Container&nbsp;parent)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">synchronized</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;(parent.getTreeLock())&nbsp;{<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dimension&nbsp;parentSize&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;parent.getSize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;compsCount&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;comps.size();<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dimension&nbsp;step&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">new</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Dimension(parentSize.width&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">/</span><span style="color: #000000; "> </span><span style="color: #000000; font-size: 10pt; font-family: Courier;">(2</span><span style="color: #000000; font-family: Courier;"> *</span><span style="color: #000000; font-size: 10pt;"></span><span style="color: #000000; font-size: 10pt; font-family: Courier;"> compsCount),<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentSize.height&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">/</span><span style="color: #000000; "> </span><span style="color: #000000; font-size: 10pt; font-family: Courier;">(2</span><span style="color: #000000; "> </span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;"> compsCount));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">for</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;(</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;i&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">0</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">;&nbsp;i&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&lt;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;compsCount;&nbsp;i</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">++</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">)&nbsp;{<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Component&nbsp;comp&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;comps.get(i);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp.setBounds(calcBounds(parentSize,&nbsp;step,&nbsp;i));<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent.setComponentZOrder(comp,&nbsp;compsCount&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">-</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;i&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">1</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">private</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Rectangle&nbsp;calcBounds(Dimension&nbsp;parentSize,&nbsp;Dimension&nbsp;step,&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;index)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;x&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;step.width&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;index;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;y&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;step.height&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;index;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;width&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;parentSize.width&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">-</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;step.width&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;index;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">int</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;height&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">=</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;parentSize.height&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">-</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;step.height&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">*</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;index;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; font-size: 10pt; font-family: Courier;">new</span><span style="color: #000000; font-size: 10pt; font-family: Courier;">&nbsp;Rectangle(x,&nbsp;y,&nbsp;width,&nbsp;height);<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-size: 10pt; font-family: Courier;">
}</span></div><span style="font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp; Collection instance "comps" manages all of components, in this case, I take a LinkedList object to add and remove UI components. The layout doesn't concern any constraint, so the two addLayoutComponent() methods have the same actions. Please see the codes for details.<br /></span><span style="font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp; As aforementioned, layoutContainer() method really takes charge of layouting the components. The key work is allocating space for each component, namely, specifying the bounds. Calculating bounds values just applies the simplest arithmetic operations.<br /></span><span style="font-size: 10pt; font-family: Courier;">&nbsp;&nbsp;&nbsp; According to the intention, the bottom component fills the whole parent container, so it determines the preferred and the minimum sizes. For details, please take a look at methods preferredLayoutSize() and minimumLayoutSize(). Since the layout manager doesn't take care of the maximum size, the maximumLayoutSize() method simply returns a constant value.<br /></span></div><img src ="http://www.blogjava.net/jiangshachina/aggbug/383156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2012-07-15 22:14 <a href="http://www.blogjava.net/jiangshachina/archive/2012/07/15/383156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建不规则窗体(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2011/05/31/351369.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Tue, 31 May 2011 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2011/05/31/351369.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/351369.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2011/05/31/351369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/351369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/351369.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"> </span>
<div>
<div>
<div align="center"><strong><span style="font-size: 14pt;">构建不规则窗体</span></strong></div>
<span style="font-size: 10pt;">
<div>在开发一个新浪微博Swing客户端的过程中希望能展现不规则的窗体界面，原来<a href="http://www.oracle.com/technetwork/java/javase/6u10-142936.html">JDK 6 update 10</a>提供了创建指定形状窗体的特性，简单易用，记于此处。(2010.05.31最后更新)</div>
<br />
Java从<a href="http://www.oracle.com/technetwork/java/javase/6u10-142936.html">JDK 6 update 10</a>开始将内建支持构建指定形状的窗体，类com.sun.awt.AWTUtilities中的方法setWindowShape会根据不同的Shape实现去构造相应形状的窗体。AWTUtilities类是放在SUN的包中，在使用该方法时应该通过反射去进行调用，如下代码所示，</span></div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">Class</span><span style="color: #000000; ">&lt;?&gt;</span><span style="color: #000000; ">&nbsp;clazz&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Class.forName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">com.sun.awt.AWTUtilities</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
Method&nbsp;method&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;clazz.getMethod(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setWindowShape</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;Window.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,&nbsp;Shape.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);</span></div>
<span style="font-size: 10pt;"><br />
</span><strong><span style="font-size: 12pt;">1. 创建正常窗体
</span></strong><span style="font-size: 10pt;"><br />先创建一个简单的界面，它使用BorderLayout，在其中安放5个JButton，如下代码所示，<br /></span>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ShapedFrame&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;JFrame&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2291343874280454383L</span><span style="color: #000000; ">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;JButton&nbsp;centerButton&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Center</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;ShapedFrame()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Shaped&nbsp;Frame</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initUI();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;initUI()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;container&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getContentPane();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setLayout(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BorderLayout());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">TOP</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;BorderLayout.PAGE_START);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">RIGHT</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;BorderLayout.LINE_END);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">BOTTOM</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;BorderLayout.PAGE_END);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">LEFT</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;BorderLayout.LINE_START);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(centerButton,&nbsp;BorderLayout.CENTER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SwingUtilities.invokeLater(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Runnable()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShapedFrame&nbsp;frame&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ShapedFrame();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setSize(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Dimension(</span><span style="color: #000000; ">400</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">300</span><span style="color: #000000; ">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setUndecorated(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAtCenter(frame);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setVisible(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;将Window置于屏幕正中</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setAtCenter(Window&nbsp;window)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dimension&nbsp;screenSize&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Toolkit.getDefaultToolkit().getScreenSize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.setLocation((screenSize.width&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;window.getWidth())&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(screenSize.height&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;window.getHeight())&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div><br />执行上述程序的效果如下图所示，<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/01.PNG" height="525" width="799" /><br /><br /><span style="font-size: 10pt;">
</span><strong><span style="font-size: 12pt;">2. 创建不规则窗体
</span></strong><span style="font-size: 10pt;"><br />基于上述程序创建不规则窗体，使整个窗体正好缺失掉RIGHT JButton所在的区域，如下代码所示，<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ShapedFrame&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;JFrame&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2291343874280454383L</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Method&nbsp;method&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class</span><span style="color: #000000; ">&lt;?&gt;</span><span style="color: #000000; ">&nbsp;clazz&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Class.forName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">com.sun.awt.AWTUtilities</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;clazz.getMethod(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">setWindowShape</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;Window.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,&nbsp;Shape.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;JButton&nbsp;centerButton&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Center</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;ShapedFrame()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Shaped&nbsp;Frame</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initUI();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addComponentListener(componentListener);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;initUI()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;container&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getContentPane();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setLayout(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BorderLayout());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">TOP</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;BorderLayout.PAGE_START);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">RIGHT</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;BorderLayout.LINE_END);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">BOTTOM</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;BorderLayout.PAGE_END);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JButton(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">LEFT</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;BorderLayout.LINE_START);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(centerButton,&nbsp;BorderLayout.CENTER);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;ComponentListener&nbsp;componentListener&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ComponentAdapter()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;componentResized(ComponentEvent&nbsp;evt)&nbsp;{&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;当UI组件(JFrame)的尺寸发生改变时，调用该方法</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle&nbsp;frameRect&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getBounds();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle&nbsp;spaceRect&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;centerButton.getBounds();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;o1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Point(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;o2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Point(frameRect.width,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;o3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Point(frameRect.width,&nbsp;frameRect.height);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;o4&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Point(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;frameRect.height);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;i1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Point(spaceRect.x&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;spaceRect.width,&nbsp;spaceRect.y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;i2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Point(frameRect.width,&nbsp;spaceRect.y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;i3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Point(frameRect.width,&nbsp;spaceRect.y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;spaceRect.height);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;i4&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Point(spaceRect.x&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;spaceRect.width,&nbsp;spaceRect.y&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;spaceRect.height);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">[]&nbsp;xpoints&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">[]&nbsp;{&nbsp;o1.x,&nbsp;o2.x,&nbsp;i2.x,&nbsp;i1.x,&nbsp;i4.x,&nbsp;i3.x,&nbsp;o3.x,&nbsp;o4.x&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">[]&nbsp;ypoints&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">[]&nbsp;{&nbsp;o1.y,&nbsp;o2.y,&nbsp;i2.y,&nbsp;i1.y,&nbsp;i4.y,&nbsp;i3.y,&nbsp;o3.y,&nbsp;o4.y&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;npoints&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;构建一个六边形，将RIGHT&nbsp;JButton所处的位置空缺出来</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Shape&nbsp;shape&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Polygon(xpoints,&nbsp;ypoints,&nbsp;npoints);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setWindowShape(ShapedFrame.</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">,&nbsp;shape);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置Window的形状</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setWindowShape(Window&nbsp;window,&nbsp;Shape&nbsp;shape)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.invoke(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">,&nbsp;window,&nbsp;shape);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SwingUtilities.invokeLater(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Runnable()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;run()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShapedFrame&nbsp;frame&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ShapedFrame();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setSize(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Dimension(</span><span style="color: #000000; ">400</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">300</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setUndecorated(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAtCenter(frame);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setVisible(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;将Window置于屏幕正中</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setAtCenter(Window&nbsp;window)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dimension&nbsp;screenSize&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Toolkit.getDefaultToolkit().getScreenSize();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.setLocation((screenSize.width&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;window.getWidth())&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(screenSize.height&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;window.getHeight())&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br />
<span style="font-size: 10pt;">执行上述程序后，会有如下图所示的效果，<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/02.PNG" height="524" width="799" /><br />
<br />
</span><span style="font-size: 10pt;"></span></div><img src ="http://www.blogjava.net/jiangshachina/aggbug/351369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2011-05-31 20:46 <a href="http://www.blogjava.net/jiangshachina/archive/2011/05/31/351369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你所不知道的五件事情--改进Swing(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2010/10/25/336125.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 25 Oct 2010 14:23:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2010/10/25/336125.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/336125.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2010/10/25/336125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/336125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/336125.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 你所不知道的五件事情--改进Swing这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇，讲述了关于改进Swing应用的一些窍门，值得大家学习。(2010.10.25最后更新)摘要：Swing已是一个比较老的工具集了，在美观的用户界面出来之前需要开发很长时间。它缺少一些你在开发富UI时所需的组件。幸运地是，像 Substance，Swi...&nbsp;&nbsp;<a href='http://www.blogjava.net/jiangshachina/archive/2010/10/25/336125.html'>阅读全文</a><img src ="http://www.blogjava.net/jiangshachina/aggbug/336125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2010-10-25 22:23 <a href="http://www.blogjava.net/jiangshachina/archive/2010/10/25/336125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用SwingX与TimingFramework实现淡入淡出(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/09/28/296709.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 28 Sep 2009 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/09/28/296709.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/296709.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/09/28/296709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/296709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/296709.html</trackback:ping><description><![CDATA[<div align="center"><strong style="font-size: 14pt;">利用SwingX与TimingFramework实现淡入淡出</strong><br />
</div>
<span style="font-size: 10pt;">本文使用<a href="https://swingx.dev.java.net">SwingX</a>与<a href="https://timingframework.dev.java.net">TimingFramework</a>展示了如何实现淡入淡出效果，程序简洁实用，希望对大家能有所助益。(2009.09.28最后更新)<br />
<br />
在Swing中使用<a href="http://java.sun.com/javase/6/docs/api/java/awt/AlphaComposite.html">AlphaComposite</a>设置界面的半透明度，再配合<a href="http://java.sun.com/javase/6/docs/api/javax/swing/Timer.html">javax.swing.Timer</a>可以比较容易地实现淡入淡出效果。但需要我们继承具体的UI组件，并重写它的paintComponent方法，同时还要为Timer提供一个ActionListener的实现。这些对于程序员来说，显得有些乏味。<br />
&nbsp;&nbsp;&nbsp; 幸运地是，SwingX中的JXPanel(JPanel的子类)通过setAlpha方法来设置半透明度，JXPanel中的所有UI组件都可随之半透明化。TimingFramework提供的Animator可以帮助我们非线性地设置JXPanel中的alpha值。故，我们在实现淡入淡出时，可以使用JXPanel来替代JPanel，用Animator来替代Timer。<br />
<img src="http://farm3.static.flickr.com/2567/3969155982_d8c1118b6c_o.png" alt="" /><br />
<img src="http://farm4.static.flickr.com/3452/3968381881_250129774e_o.png" alt="" /> <img src="http://farm3.static.flickr.com/2518/3969156126_0dbc8a627c_o.png" alt="" />
<br />
&nbsp;&nbsp;&nbsp; 下面是一个非常简单的示例，该示例在一个使用CardLayout的JPanel--cardPanel，中另包含了两个JXPanel--panelA和panelB，这两个子容器中又分别有一个JButton--buttonA和buttonB。当点击buttonA时，将淡入显示panelB；当点击buttonB时，将淡入显示panelA。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;FadingCardDemo&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JFrame&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">8005909309849021746L</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;CARD_A&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CARD_A</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;CARD_B&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">CARD_B</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JPanel&nbsp;cardPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JXPanel&nbsp;panelA&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JXPanel&nbsp;panelB&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JButton&nbsp;buttonA&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JButton&nbsp;buttonB&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;FadingCardDemo()&nbsp;{<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">FadingButton&nbsp;Demo</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initUI();<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;initUI()&nbsp;{<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cardPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JPanel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CardLayout());<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonA&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JButton(</span><span style="color: #000000;">"</span><span style="color: #000000;">Button&nbsp;A</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonA.addActionListener(actionHandler);<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelA&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JXPanel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BorderLayout());<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelA.add(buttonA,&nbsp;BorderLayout.CENTER);<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cardPanel.add(panelA,&nbsp;CARD_A);<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonB&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JButton(</span><span style="color: #000000;">"</span><span style="color: #000000;">Button&nbsp;B</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buttonB.addActionListener(actionHandler);<br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelB&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JXPanel(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BorderLayout());<br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelB.add(buttonB,&nbsp;BorderLayout.CENTER);<br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cardPanel.add(panelB,&nbsp;CARD_B);<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;container&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getContentPane();<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setLayout(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BorderLayout());<br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(cardPanel,&nbsp;BorderLayout.CENTER);<br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;ActionListener&nbsp;actionHandler&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActionListener()&nbsp;{<br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Animator&nbsp;animator&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(animator&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
</span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Animator(</span><span style="color: #000000;">2000</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.setDeceleration(</span><span style="color: #000000;">0.2F</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.setAcceleration(</span><span style="color: #000000;">0.4F</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"> if (animator.isRunning()) {<br />
</span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.stop();<br />
</span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JButton&nbsp;button&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(JButton)&nbsp;e.getSource();<br />
</span><span style="color: #008080;">54</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(button&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;buttonA)&nbsp;{<br />
</span><span style="color: #008080;">55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.addTarget(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PropertySetter(panelB,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">alpha</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0F</span><span style="color: #000000;">));<br />
</span><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelB.setAlpha(</span><span style="color: #000000;">0.1F</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((CardLayout)&nbsp;cardPanel.getLayout()).show(cardPanel,&nbsp;CARD_B);<br />
</span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(button&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;buttonB)&nbsp;{<br />
</span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.addTarget(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PropertySetter(panelA,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">alpha</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1.0F</span><span style="color: #000000;">));<br />
</span><span style="color: #008080;">60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panelA.setAlpha(</span><span style="color: #000000;">0.1F</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((CardLayout)&nbsp;cardPanel.getLayout()).show(cardPanel,&nbsp;CARD_A);<br />
</span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animator.start();<br />
</span><span style="color: #008080;">64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">65</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br />
</span><span style="color: #008080;">66</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">67</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
</span><span style="color: #008080;">68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SwingUtilities.invokeLater(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Runnable()&nbsp;{<br />
</span><span style="color: #008080;">69</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;run()&nbsp;{<br />
</span><span style="color: #008080;">70</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FadingCardDemo&nbsp;demo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FadingCardDemo();<br />
</span><span style="color: #008080;">71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;demo.setSize(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dimension(</span><span style="color: #000000;">400</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">300</span><span style="color: #000000;">));<br />
</span><span style="color: #008080;">72</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;demo.setVisible(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">73</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">74</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
</span><span style="color: #008080;">75</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">76</span>&nbsp;<span style="color: #000000;">}</span></div>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/296709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-09-28 09:46 <a href="http://www.blogjava.net/jiangshachina/archive/2009/09/28/296709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单的CheckBox Tree实现(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/08/05/289996.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Wed, 05 Aug 2009 13:10:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/08/05/289996.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/289996.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/08/05/289996.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/289996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/289996.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;">一个简单的CheckBox Tree实现</span></span></strong><br />
</div>
<span style="font-size: 10pt;">CheckBox Tree是一个十分常用的UI组件，它能使用户方便地按特定规则勾选树中的节点。</span><span style="font-size: 10pt;">本文实现了一种简单的Checking规则：当勾选了某节点后，该节点的所有下级节点全部被勾选；当取消勾选某节点后，该节点的所有下级节点全部被取消勾选。(2009.08.05最后更新)<br />
<br />
</span><span style="font-size: 10pt;">实现CheckBox Tree的常用方法，就是使用JCheckBox作为JTree的TreeCellRendrer，并且需要实现特定的Checking规则来勾选/取消勾选CheckBox。<br />
<br />
<strong><span style="font-size: 12pt;">1. 树节点</span></strong><br />
DefaultMutableTreeNode是最常用的TreeNode实现，此处我们将扩展这一实现--CheckBoxTreeNode，增加一个属性<span style="color: #2000ff;">isChecked</span>，用于标识该节点是否要被勾选上。该类的完整代码如下所示：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CheckBoxTreeNode&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;DefaultMutableTreeNode&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3195314943599939279L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isChecked&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CheckBoxTreeNode(Object&nbsp;userObject)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(userObject);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isChecked()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;isChecked;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setChecked(</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isChecked)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.isChecked&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;isChecked;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;"><br />
<strong><span style="font-size: 12pt;">2. 渲染器</span></strong><br />
如本文开头所述，我们将使用JCheckBox作为树节点展现形式的渲染器，同时确定对节点进行勾选或取消勾选的规则。CheckBoxTreeCellRenderer本身即是一个JCheckBox，那么在实现<span style="color: #2000ff;">getTreeCellRendererComponent</span>方法时，只简单地返回它自己的实例即可，而对于勾选或取消勾选的条件，则由CheckBoxTreeNode中的<span style="color: #2000ff;">isChecked</span>属性来确定，完整的代码如下所示：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CheckBoxTreeCellRenderer&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JCheckBox&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;TreeCellRenderer&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">6432020851855339311L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CheckBoxTreeCellRenderer()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setOpaque(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Component&nbsp;getTreeCellRendererComponent(JTree&nbsp;tree,&nbsp;Object&nbsp;value,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;selected,&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;expanded,&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;leaf,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;row,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;hasFocus)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckBoxTreeNode&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((CheckBoxTreeNode)&nbsp;value);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取树节点对象。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setText(node.toString());&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置CheckBox所展示的文本。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;当树节点被设置为勾选时，则该节点对应的CheckBox被勾选上；否则，取消勾选。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(node.isChecked())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSelected(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setForeground(Color.BLUE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSelected(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setForeground(tree.getForeground());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;"><br />
<strong><span style="font-size: 12pt;">3. 树</span></strong><br />
此处对JTree进行扩展，创建CheckBoxTree，该类只是为JTree添加了一个MouseListener，以侦听鼠标选中树节点后，如何设置勾选标记，并重绘树。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CheckBoxTree&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JTree&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">217950037507321241L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CheckBoxTree(TreeModel&nbsp;newModel)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(newModel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addCheckingListener();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addCheckingListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMouseListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MouseAdapter()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mousePressed(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;row&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getRowForLocation(e.getX(),&nbsp;e.getY());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreePath&nbsp;treePath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getPathForRow(row);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(treePath&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckBoxTreeNode&nbsp;node&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((CheckBoxTreeNode)&nbsp;treePath.getLastPathComponent());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;checking&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">node.isChecked();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果该节点已被勾选上，则此次将取消勾选；反之，亦反。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkNode(node,&nbsp;checking);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repaint();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;重绘整棵树。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;递归地勾选或取消勾选指定节点及其所有下级节点的CheckBox。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;checkNode(CheckBoxTreeNode&nbsp;node,&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;checking)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.setChecked(checking);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">node.isLeaf())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enumeration</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">CheckBoxTreeNode</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;children&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;node.children();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(children.hasMoreElements())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkNode(children.nextElement(),&nbsp;checking);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<span style="font-size: 10pt;">上述程序有两个关键点：1. 设置当前节点及其子节点的勾选标记--<span style="color: #5000ff;">checkNode</span>；2. 重绘树--<span style="color: #2000ff;">repaint</span>。调用repaint方法对树进行绘制时，方法<span style="color: #2000ff;">TreeCellRenderer.getTreeCellRendererComponent</span>就会被调用，此时程序就会根据<span style="color: #2000ff;">checkNode</span>方法设定的<span style="color: #2000ff;">isChecked</span>来勾选或取消勾选对应的树节点CheckBox。简言之，就是先设置树型数据中的勾选标记，然后渲染器再根据这些标记来渲染CheckBox。<br />
</span><img src ="http://www.blogjava.net/jiangshachina/aggbug/289996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-08-05 21:10 <a href="http://www.blogjava.net/jiangshachina/archive/2009/08/05/289996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Store, Q&amp;A(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/07/05/285528.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Sun, 05 Jul 2009 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/07/05/285528.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/285528.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/07/05/285528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/285528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/285528.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;"><a href="http://weblogs.java.net/blog/joshy/archive/2009/06/the_java_store.html">Java Store, Q&amp;A</a></span></strong></span><br />
</div>
<span style="font-size: 10pt;">在今年的JavaOne中，比较重要的议题之一就是Java应用商店。目前还没机会亲身体会一下这个商店，但我至少认为Java应用商店为广大Java程序员提供了一个新的展示自我的平台。Please show yourself! (2009.07.05最后更新)<br />
<br />
Java Store是JavaOne中最重大的消息之一。我格外为之骄傲，因为在过去的几个月中我一直秘密地为其工作。由于这一消息，我收到了一大堆关于该商店的问题，以及如何将它与Java生态系统中的其它部分相关联。出于对已极佳的<a href="http://java.sun.com/warehouse/reference/faq/">FAQ</a>的补充，我想应该再回答一些问题。<br />
<strong><br />
简约概括一下你所宣布的消息</strong><br />
我们已经发布了Java Store的私有Beta版，是一个桌面的客户端应用，它允许大家浏览并购买桌面Java应用；还有一个Java仓库的开放Beta版，为了分发应用程序，开发者们可将这些应用程序上传到这个仓库中。现在你就可以登录并浓度一下这个<a href="http://www.java.com/en/store/index.jsp">商店</a>和<a href="http://java.sun.com/warehouse/">仓库</a>。目前，这个商店和仓库只针对美国用户，很快将有更多的国家能够使用。<br />
<br />
<strong>我可以使用除JavaFX之外的其它语言来做用于Java Store的程序吗？</strong><br />
是的！不仅仅是Java和JavaFX，所有基于JVM的语言都是允许的。记住，最终用户并不关心你的应用是用什么语言写的。他们只关心你所做的应用是有用的，看起来和用起来都很好。<br />
<br />
<strong>商店中的应用程序有哪些限制？</strong><br />
查看<a href="http://java.sun.com/warehouse/reference/faq/">FAQ</a>，可以得到全部的细节，但简要的回答是：任何的JVM语句；必须面向消费者；(目前)小于50M；必须是未签名，或使用有效认证的签名。在该商店商用之前，所有的应用都是免费的，商用之后你就需要付费。此处包含的细节很少，但这些都是基本的。<br />
<br />
<strong>何时才允许我贩卖应用程序？</strong><br />
我们将尽快。商店还未开张。但最终，你不会拥有一个货架空空如也的商店。这就是为什么我们要给你们，开发者，时间去准备好你们的应用。当我们向商用开放这个商店时，你就能够标上价格并开始售卖了。<br />
<br />
<strong>顾客将如何找到我的应用程序？</strong><br />
你在JavaOne大会上看到的桌面客户端只是第一个版本。我们已在努力工作，向商店加上新的特性，这将使得顾客们找到你的应用。将有诸如查找，过滤，排序和评论之类的新特性。最后，Java Store将会随Java发布，这就使得你的应用能被近百万人发现。<br />
<br />
<strong>移动和TV应用将会怎样？</strong><br />
Java Store实际包含两个方面。店面是一个桌面客户端程序，它使你能够购买桌面应用。还有一个Java Warehouse，这是你，即开发者，存放待售应用程序的地方。在未来，还会增加针对电视和移动应用的店面，可能会carrier branded。你所存放应用程序的Java Warehouse将为所有的这些店面提供服务。桌面应用只是令人激动的第一步罢了。<br />
<br />
<strong>现在商店里都哪些应用了？他们来自于何处？</strong><br />
我们与许多伙伴公司一同工作为这个商店构建新的应用，以及修改已有的应用程序。我个人的最爱是Astronomy Picture of the Day，由位于俄勒冈州Eugene的一个名为<a href="http://www.concentricsky.com/">Concentric Sky</a>的公司创建的。这个程序与NASA的太空图片相连接，能使你浏览以前的图片，阅读图片说明，甚至还能使用Google Translate将文本翻译成其它语言。请看Concentric Sky的CEO在他们的博客中<a href="http://www.concentricsky.com/">对Java Store和JavaFX的描述</a>。<br />
<br />
<strong>为什么开发者们不能在其它国家登录？什么时候才能允许我们在其它国家贩卖应用程序？</strong><br />
我们将尽可能快的在其它国家开放这个商店。国际贸易要比你所想象的还要复杂的多(作为一个工程师，我感到十分的吃惊)。每个国家在税率，私有权和商业方面都有不同的法规。现在我们有法律和商业方面的伙记们在这些问题而工作。当前，我们计划在2010年的早些时候实现这一目标，但是如果我们能做得更快些，那一定会告诉你。<br />
<br />
为了使消息更清晰，我们让Jeet Kaul，Java的高管之一，作一些解释：(点击观看) <br />
<a href="http://blogs.sun.com/webmink/entry/tweetswoop_us_only_java_store"><img src="http://weblogs.java.net/blog/joshy/javastore/SafariScreenSnapz024.png" alt="SafariScreenSnapz024.png" border="0" height="239" width="418" /></a><br />
如果你有任何关于Java Store的问题，请发邮件给我，或者在我们的反馈页面中提交你的评论。<br />
<br />
</span><img src ="http://www.blogjava.net/jiangshachina/aggbug/285528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-07-05 09:48 <a href="http://www.blogjava.net/jiangshachina/archive/2009/07/05/285528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更好的Applet体验：海报帧(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/11/02/237466.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Sun, 02 Nov 2008 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/11/02/237466.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/237466.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/11/02/237466.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/237466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/237466.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong style="font-size: 14pt;">更好的Applet体验：海报帧</strong></span><br />
</div>
<span style="font-size: 10pt;">
本文是</span><a href="http://weblogs.java.net/blog/joshy"><span style="font-size: 10pt;">Joshua Marinacci</span></a><span style="font-size: 10pt;">的系列博客<em>A Better Applet Experience</em>中的</span><a href="http://weblogs.java.net/blog/joshy/archive/2008/08/a_better_applet_1.html"><span style="font-size: 10pt;">第二篇</span></a><span style="font-size: 10pt;">，介绍了如何使用海报帧去加快页面的加载。(2008.11.02最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; 在本系列文章的第一部分中，我向你展示了如何使用设置加载时图片，包括动态的GIF自旋体图片。这次，我将向展示如何使用屏幕截图或海报帧去加快页面的加载。<br />
&nbsp;&nbsp;&nbsp; Quicktime电影就有海报帧的思想。电影中的一帧(经常就是其中的第一帧)将会放到该电影出现的地方。当用户点击海报帧时，实现的电影才会通过网络被加载进来。这就能极大地加快该电影所在Web页面的加载速度。使用少许JavaScript，完全可以为Java Applet实现相同的功能。<br />
<br />
<strong><span style="font-size: 12pt;"><strong>Applet的海报帧</strong><br />
</span></strong>&nbsp;&nbsp;&nbsp; <strong>在研究这个Demo之前，我必须要提到，我个人尚未在IE浏览器中测试过这个Demo。如果你发现这个Demo不能在某个浏览器中运行，请向错误信息发送给我，以便我能更新这个JavaScript。</strong><br />
&nbsp;&nbsp;&nbsp; 基本思想非常的简单，创建一个div，它包含一个链接和一张屏幕截图。当用户点击该链接时，我们使用一个新的<code>applet</code>元素去替换页面中的<code>a</code>和<code>img</code>元素。一旦浏览器察觉到了这个新的<code>applet</code>元素，它将下载Java插件并启动这个Applet。<br />
&nbsp;&nbsp;&nbsp; 这就有一个例子：如果你点击了这张图片，一个Applet就会被加载到该图片所在的位置，并会说"applet loaded"。<br />
<br />
<strong style="font-size: 12pt;">JavaScript</strong><br />
&nbsp;&nbsp;&nbsp; 如下就是这个JavaScript脚本：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-size: 10pt;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">script</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;"><span style="font-size: 10pt;">function</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;generateInlineAppletTag(appletID,&nbsp;screenshotID)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;attributes&nbsp;</span><span style="color: #000000;">=</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code:'animatedstartup.MainApplet',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:</span><span style="color: #000000;">100</span></span><span style="font-size: 10pt;"><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height:</span><span style="color: #000000;">100</span></span><span style="font-size: 10pt;"><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;archive:'http:</span><span style="color: #008000;">//</span><span style="color: #008000;">projects.joshy.org/demos/AnimatedStartup/AnimatedStartup.jar',</span></span><span style="color: #008000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:'fooApplet'<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;parameters&nbsp;</span><span style="color: #000000;">=</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image:'http:</span><span style="color: #008000;">//</span><span style="color: #008000;">projects.joshy.org/demos/AnimatedStartup.gif',</span></span><span style="color: #008000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;centerImage:'</span><span style="color: #0000ff;">true</span></span><span style="font-size: 10pt;"><span style="color: #000000;">'<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;appletTag&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.createElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">applet</span><span style="color: #000000;">"</span></span><span style="font-size: 10pt;"><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;attribute&nbsp;</span><span style="color: #0000ff;">in</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;attributes)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appletTag.setAttribute(attribute,attributes[attribute]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(parameters&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;'#ff0000'&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;parameters&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span></span><span style="font-size: 10pt;"><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;parameter&nbsp;</span><span style="color: #0000ff;">in</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;parameters)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;param&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;document.createElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">PARAM</span><span style="color: #000000;">"</span></span><span style="font-size: 10pt;"><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span></span><span style="font-size: 10pt;"><span style="color: #000000;">,parameter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">value</span><span style="color: #000000;">"</span></span><span style="font-size: 10pt;"><span style="color: #000000;">,parameters[parameter]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;appletTag.appendChild(param);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;bodyRef&nbsp;</span><span style="color: #000000;">=</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;document.getElementById(appletID);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;screenshot&nbsp;</span><span style="color: #000000;">=</span></span><span style="font-size: 10pt;"><span style="color: #000000;">&nbsp;document.getElementById(screenshotID);<br />
&nbsp;&nbsp;&nbsp;&nbsp;bodyRef.removeChild(screenshot);<br />
&nbsp;&nbsp;&nbsp;&nbsp;bodyRef.appendChild(appletTag);<br />
}<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">script</span><span style="color: #000000;">&gt;</span></span></div>
<span style="font-size: 10pt;">该脚本的第一部分初始化了两个哈希表，它们包含了<code>applet</code>元素的属性与嵌套的param标签。然后，它会使用<code>document.createElement()</code>方法去创建这个applet，并配置其中的属性与<code>PARAM</code>元素。到目前为止，还很直接。真正地奇妙之事发生在<code>generateInlineAppletTag</code>函数的最后四行。它使用传入的<code>appletID</code>参数与包含着上述链接与图片的<code>div</code>元素相联在一起，然后它会找到并删除该链接，而用新的applet元素去替代这个链接。<br />
<br />
<strong style="font-size: 12pt;">HTML</strong><br />
要使用上述javascript函数，你只需将它放到页面的顶部，并通过那张屏幕截图链接的href去调用它。在本例中，我使用了：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="appletDiv"</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #000000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="screenshot1"</span><span style="color: #ff0000;">&nbsp;href</span><span style="color: #0000ff;">="javascript:generateInlineAppletTag('appletDiv','screenshot1');"</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #000000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #ff0000;">src</span><span style="color: #0000ff;">="http://projects.joshy.org/demos/AnimatedStartup/applet_screenshot.png"</span><span style="color: #ff0000;">&nbsp;border</span><span style="color: #0000ff;">="0"</span></span><span style="color: #ff0000;"><br />
</span><span style="color: #0000ff;"><span style="font-size: 10pt;">/&gt;</span></span><span style="color: #000000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span></span><span style="color: #000000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span></span></div>
<span style="font-size: 10pt;">这个div被命名为<code>appletDiv</code>，链接被命名为<code>screenshot1</code>。该链接的<code>href</code>会调用上述javascript函数，并传入div与链接的名称。最后该图片就只是显示将要运行的Applet的一张屏幕截图，该图被一个播放按钮覆盖着。就这么简单，在</span><a href="http://projects.joshy.org/demos/AppletOverlay/image_replace.html"><span style="font-size: 10pt;">这里</span></a><span style="font-size: 10pt;">你可以看到完整的javascript和HTML语句。<br />
<br />
<strong style="font-size: 12pt;">结论</strong><br />
这个javascript只是一个开始。你还能很容易的扩展它，使图片上能展现关于这个Applet的更多信息。你也可以把这个javascript重写为一个更加可重用的形式，使它能够被你的整个站点所共享。<br />
下次我将向你展示如何使用新的发布工具包去侦测当前已安装的Java版本，并启动更新程序。<br />
<strong>重复一遍，如果你在某个平台或浏览器中发现了任何错误，请让我知道，以便更新这个脚本。</strong><br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/237466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-11-02 10:57 <a href="http://www.blogjava.net/jiangshachina/archive/2008/11/02/237466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更好的Applet体验：定制加载时画面(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/10/29/236954.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Tue, 28 Oct 2008 23:32:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/10/29/236954.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/236954.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/10/29/236954.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/236954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/236954.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;"><strong>更好的Applet体验：定制加载时画面</strong></span><br />
</span></strong></div>
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 本文是</span><a href="http://weblogs.java.net/blog/joshy"><span style="font-size: 10pt;">Joshua Marinacci</span></a><span style="font-size: 10pt;">的系列博客<em>A Better Applet Experience</em>中的</span><a href="http://weblogs.java.net/blog/joshy/archive/2008/08/a_better_applet.html"><span style="font-size: 10pt;">第一篇</span></a><span style="font-size: 10pt;">，介绍了如何定制加载Applet时使用的画面。(2008.10.30最后更新)<br />
<br />
&nbsp;&nbsp;&nbsp; 你可能已经听说了Java SE 6 Update 10应当会改进Applet体验。你可能已经看过一些可在浏览器中拖拽的Applet示例，但还有比那更多的东西。在本博客系列中，我将向你展示如何在发布Applet时获得尽量多的东西，纵使你不使用Update 10。<br />
<br />
<strong><span style="font-size: 12pt;"><strong>摆脱咖啡杯图标</strong><br />
</span></strong>&nbsp;&nbsp;&nbsp; 很多人抱怨的第一件事情就是加载Java Applet时使用的咖啡杯图标。根据你具体使用的OS和JVM版本，这个图标是不同的，但它看起来总是像下图那样。<br />
<img alt="" src="http://weblogs.java.net/blog/campbell/archive/images/orangebox.png" /> <br />
&nbsp;&nbsp;&nbsp; 有很多理由可以认为这会困扰到应用程序开发者，包括不能为他们自己的软件标注品牌，破坏应用的视觉观感，滥用橘黄色。这些都是正确的批评。但在这儿我要告诉你，无须遵循这种方式。这个橘黄色的图标只是一种默认的方式罢了。你轻易就能，也应该将加载画面所使用的图片改成与你网站的其它部分相适应的图片。<br />
&nbsp;&nbsp;&nbsp; 在Java SE 6 Update 10出现的很长时间之前，Applet插件就已经支持在加载画面中使用定制图片了。只需设置Applet的<em>image</em>参数就可以了。就是这么简单!这儿就有一个例子：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">applet&nbsp;</span><span style="color: #ff0000;">code</span><span style="color: #0000ff;">="animatedstartup.MainApplet"</span></span><span style="color: #ff0000;"><br />
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;archive</span></span><span style="color: #0000ff;"><span style="font-size: 10pt;">="AnimatedStartup.jar"</span></span><span style="color: #ff0000;"><br />
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width</span></span><span style="font-size: 10pt;"><span style="color: #0000ff;">="100"</span><span style="color: #ff0000;">&nbsp;height</span><span style="color: #0000ff;">="100"</span></span><span style="color: #ff0000;"><br />
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #0000ff;"><span style="font-size: 10pt;">&gt;</span></span><span style="color: #000000;"><br />
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">PARAM&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="image"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="earth.gif"</span><span style="color: #0000ff;">/&gt;</span></span><span style="color: #000000;"><br />
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">PARAM&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="boxmessage"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="loading<img alt="" src="http://www.blogjava.net/Images/dot.gif" />"</span><span style="color: #0000ff;">/&gt;</span></span><span style="color: #000000;"><br />
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">PARAM&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="boxborder"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="false"</span><span style="color: #0000ff;">/&gt;</span></span><span style="color: #000000;"><br />
</span><span style="font-size: 10pt;"><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">applet</span><span style="color: #0000ff;">&gt;</span></span></div>
<span style="font-size: 10pt;"><em>image</em>参数将设置一个加载时图片。Update 10还支持添加加载时信息，以及不绘制Applet的边框，但<em>image</em>是比较重要的一个参数。上面这个例子看起来就像下面这样：<br />
屏幕截图<sup>[1]</sup><br />
<br />
<strong style="font-size: 12pt;">制作加载时动画</strong><br />
&nbsp;&nbsp;&nbsp; Java 6目前支持使用动态图片以添加加载时动画。在前面例子中使用的earth.gif图片文件就正是一个动态GIF文件。如果你有最新的Applet插件，就会看到加载时画面是动态的。当然，你可能想要一个自旋体的图片，它更合适些，就如你在这里看到的那样：你也可以使用一个更具有指示性的GIF加载图片，就像</span><a href="http://www.command-tab.com/2007/01/21/aqua-spinners/"><span style="font-size: 10pt;">这里</span></a><span style="font-size: 10pt;">的图片那样<sup>[2]</sup>。<br />
&nbsp;&nbsp;&nbsp; 关于Applet加载时画面的更多内容请见发布文档的</span><a href="http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/special_attributes.html"><span style="font-size: 10pt;">特别属性一节</span></a><span style="font-size: 10pt;">，以及</span><a href="https://jdk6.dev.java.net/plugin2/"><span style="font-size: 10pt;">关于这个新插件的说明</span></a><span style="font-size: 10pt;">。<br />
&nbsp;&nbsp;&nbsp; 本周就是这些了。在</span><a href="http://projects.joshy.org/demos/AnimatedStartup/applet.html"><span style="font-size: 10pt;">此处</span></a><span style="font-size: 10pt;">你可看到这个Demo的可运行版本。下次我将向你展示，在运行一个Applet之前，如何使用一个屏幕截图去替代这个真实的Applet。<br />
<br />
<strong style="font-size: 12pt;">译注<br />
</strong>[1]原文并未显示这张图片。<br />
[2]本句很有些奇怪，此处的两个"这里"应该指同一个地址。<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/236954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-10-29 07:32 <a href="http://www.blogjava.net/jiangshachina/archive/2008/10/29/236954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java SE 6 Update 10发布了!(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/10/17/234849.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Fri, 17 Oct 2008 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/10/17/234849.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/234849.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/10/17/234849.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/234849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/234849.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong style="font-size: 14pt;">Java SE 6 Update 10发布了!</strong></span><br />
</div>
<span style="font-size: 10pt;">
&nbsp;&nbsp;&nbsp; 在经过了漫长的期待之后，<a href="http://java.sun.com/javase/downloads/index.jsp">Java SE 6 Update 10</a>终于正式发布了。本文主要简介了该版本在客户端应用方面的改进。(2008.10.18最后更新)<br />
<br />
Java SE 6本就加入了许多关于客户端应用的新特性，在<a href="http://blogs.sun.com/dannycoward/entry/java_se_6_top_ten">Java SE 6的十大新特性</a>中，直接关于客户端/桌面领域的新特性就有两处。此次Update 10更是集中地在该领域内做出了重大改进。此处，主要基于<a href="http://java.sun.com/javase/6/webnotes/6u10.html">Java SE 6 Update 10 Release Notes</a>的说明，简介了该版本在客户端应用方面的改进。<br />
<br />
<strong style="font-size: 12pt;">下一代Java Plug-in</strong><br />
&nbsp;&nbsp;&nbsp; 下一代Java插件包含了Applet和Java Web Start技术的最佳架构特性。它为在Web浏览器中发布Java和Java FX内容提供了健壮的平台。下一代Java插件为高级用户内容和企业级应用提供了许多强大的特性。<br />
&nbsp;&nbsp;&nbsp; * 允许为Applet申请更多的内存；可为每个Applet应用指定不同的命令行参数。<br />
&nbsp;&nbsp;&nbsp; * 为每个Applet应用选择不同的JRE。<br />
&nbsp;&nbsp;&nbsp; * 提高了可靠性。<br />
&nbsp;&nbsp;&nbsp; * 能在Java和JavaScript程序设计语言之间进行更好、更便捷的整合。<br />
&nbsp;&nbsp;&nbsp; * 增强了对访问Web页面中DOM的支持。<br />
&nbsp;&nbsp;&nbsp; * 增加了对Web Services的支持。<br />
内建支持JNLP，使得Applet应用可立即复用之前由Java Web Start应用使用的JNLP扩展，例如JavaFX运行时组件，对基于硬件加速的3D图形，视频回放等等。<br />
&nbsp;&nbsp;&nbsp; P.S. 在我较早前的一篇译文<strong><a href="http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html">下一代Java Applet插件技术</a></strong>中，对这个新的插件有较详尽的描述。<br />
<br />
<strong style="font-size: 12pt;">Java Quick Starter</strong><br />
&nbsp;&nbsp;&nbsp; Java Quick Starter(JQS)为了提高Applet程序和Java应用程序的初始启动速度，会周期性预加载一些常用的JRE文件到内存(占用不多于20M的内存)。之后，当Java程序启动时，磁盘I/O将会显著减少，那么启动速度也就大大加快了。JQS会作为一个Windows服务启动，在任务管理器中会看到一个名为jqs.exe的进程。<br />
&nbsp;&nbsp;&nbsp; 注：JQS仅能用于x86架构下的Windows 2000和Windows XP系统；由于Windows Vista系统有其自己的预加载机制，JQS将不能使用。<br />
<br />
<strong style="font-size: 12pt;">Deployment Toolkit</strong><br />
&nbsp;&nbsp;&nbsp; 为了避免浏览器的兼容性问题，Deployment Toolkit提供了一组JavaScript方法，能够自动生成部署Applet和Java Web Start程序时所使用的HTML语句。<br />
<br />
<strong style="font-size: 12pt;">Nimbus</strong><br />
&nbsp;&nbsp;&nbsp; Nimbus是一个新的Java跨平台外观。在JDK 6 Update 10自带的demo中新加了一个SwingSet3应用，但与其它的demo应用(如SwingSet2)不同，这个demo应用没有包含源代码和可执行的jar文件，而需要通过Java Web Start运行(我猜想SwingSet3应该还处于开发阶段)。官方的介绍中有一张图片，大家可以看看，确实漂亮多了(此前，默认的Metal外观已经多年未更新了)。<br />
<img alt="" src="http://java.sun.com/javase/6/docs/technotes/guides/jweb/images/NimbusLAF.png" />&nbsp;<br />
<br />
</span><img src ="http://www.blogjava.net/jiangshachina/aggbug/234849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-10-17 21:37 <a href="http://www.blogjava.net/jiangshachina/archive/2008/10/17/234849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判定一个点是否在三角形内(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/07/24/217214.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Thu, 24 Jul 2008 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/07/24/217214.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/217214.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/07/24/217214.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/217214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/217214.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;">判定一个点是否在三角形内</span></span></strong><br />
</div>
<span style="font-size: 10pt;">如何判定一个点P是否存在于指定的三角形ABC内，这肯定是一个简单的问题，本文仅用一个图形界面程序展示了该问题，有兴趣的朋友可以看看。(2008.07.24最后更新)<br />
<br />
在此处使用一种常见且简便的方法：<strong>如果三角形PAB，PAC和PBC的面积之和与三角形ABC的面积相等，即可判定点P在三角形ABC内(包括在三条边上)</strong>。<br />
可知，该方法的关键在于如何计算三角形的面积。幸运地是，当知道三角形顶点(A，B和C)的坐标((Ax, Ay)，(Bx, By)和(Cx, Cy))之后，即可计算出其面积：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">S&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> |(Ax&nbsp;*&nbsp;By&nbsp;+&nbsp;Bx&nbsp;*&nbsp;Cy&nbsp;+&nbsp;Cx&nbsp;*&nbsp;Zy&nbsp;-&nbsp;Ay&nbsp;*&nbsp;Bx&nbsp;-&nbsp;By&nbsp;*&nbsp;Cx&nbsp;-&nbsp;Cy&nbsp;*&nbsp;Ax)&nbsp;/&nbsp;</span><span style="color: #000000;">2|</span></div>
<span style="font-size: 10pt;"><br />
关键的代码如下，<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;由给定的三个顶点的坐标，计算三角形面积。<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Point(java.awt.Point)代表点的坐标。</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;triangleArea(Point&nbsp;pos1,&nbsp;Point&nbsp;pos2,&nbsp;Point&nbsp;pos3)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Math.abs((pos1.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos2.y&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;pos2.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos3.y&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;pos3.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos1.y<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;pos2.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos1.y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;pos3.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos2.y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;pos1.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos3.y)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2.0D</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
}</span></div>
<span style="font-size: 10pt;"><br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;判断点pos是否在指定的三角形内。</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;inTriangle(Point&nbsp;pos,&nbsp;Point&nbsp;posA,&nbsp;Point&nbsp;posB,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;posC)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;triangleArea&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;triangleArea(posA,&nbsp;posB,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;area&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;triangleArea(pos,&nbsp;posA,&nbsp;posB);<br />
&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;triangleArea(pos,&nbsp;posA,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;triangleArea(pos,&nbsp;posB,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;epsilon&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0.0001</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;由于浮点数的计算存在着误差，故指定一个足够小的数，用于判定两个面积是否(近似)相等。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(Math.abs(triangleArea&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;area)&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;epsilon)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
}</span></div>
<span style="font-size: 10pt;"><br />
执行该应用程序，用鼠标在其中点击三次，即可绘制一个三角形，如下组图所示：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t01.PNG" height="200" width="300" /> <img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t02.PNG" height="200" width="300" /><br />
然后仅需移动鼠标，就会出现一个空心圆圈。如果圆圈的中心在三角内(包含在三条边上)，则圆圈显示为红色；否则，显示为蓝色。如下组图所示：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t03.PNG" height="200" width="300" /> <img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t04.PNG" height="200" width="300" /> <img alt="" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/t05.PNG" height="200" width="300" /><br />
<br />
完整代码如下：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CanvasPanel&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JPanel&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">6665936180725885346L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Point&nbsp;firstPoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Point&nbsp;secondPoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Point&nbsp;thirdPoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CanvasPanel()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setBackground(Color.WHITE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMouseListener(mouseAdapter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addMouseMotionListener(mouseAdapter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;paintComponent(Graphics&nbsp;g)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.paintComponent(g);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawTriangel(g);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;drawTriangel(Graphics&nbsp;g)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(firstPoint&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;secondPoint&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;secondPoint.x, secondPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(thirdPoint&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;thirdPoint.x, thirdPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(secondPoint.x,&nbsp;secondPoint.y,&nbsp;thirdPoint.x, thirdPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;inTriangle(Point&nbsp;pos,&nbsp;Point&nbsp;posA,&nbsp;Point&nbsp;posB,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;posC)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;triangeArea&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;triangleArea(posA,&nbsp;posB,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;area&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;triangleArea(pos,&nbsp;posA,&nbsp;posB);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;triangleArea(pos,&nbsp;posA,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;triangleArea(pos,&nbsp;posB,&nbsp;posC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;epsilon&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0.0001</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(Math.abs(triangeArea&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;area)&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;epsilon)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;triangleArea(Point&nbsp;pos1,&nbsp;Point&nbsp;pos2,&nbsp;Point&nbsp;pos3)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Math.abs((pos1.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos2.y&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;pos2.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos3.y&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;pos3.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos1.y<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;pos2.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos1.y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;pos3.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos2.y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;pos1.x&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pos3.y)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2.0D</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;MouseInputAdapter&nbsp;mouseAdapter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MouseInputAdapter()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mouseReleased(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;pos&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;e.getPoint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(firstPoint&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstPoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pos;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(secondPoint&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;secondPoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pos;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics&nbsp;g&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CanvasPanel.</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getGraphics();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CanvasPanel.</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.paintComponent(g);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;secondPoint.x, secondPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(thirdPoint&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thirdPoint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pos;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics&nbsp;g&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CanvasPanel.</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getGraphics();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CanvasPanel.</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.paintComponent(g);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;secondPoint.x, secondPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;thirdPoint.x, thirdPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawLine(secondPoint.x,&nbsp;secondPoint.y,&nbsp;thirdPoint.x, thirdPoint.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mouseMoved(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;pos&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;e.getPoint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics2D&nbsp;g2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Graphics2D)&nbsp;CanvasPanel.</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.getGraphics();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CanvasPanel.</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.paintComponent(g2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(firstPoint&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;secondPoint&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;pos.x,&nbsp;pos.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(firstPoint&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;secondPoint&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;thirdPoint&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawLine(firstPoint.x,&nbsp;firstPoint.y,&nbsp;pos.x,&nbsp;pos.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawLine(secondPoint.x,&nbsp;secondPoint.y,&nbsp;pos.x,&nbsp;pos.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(firstPoint&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;secondPoint&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;thirdPoint&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(inTriangle(pos,&nbsp;firstPoint,&nbsp;secondPoint,&nbsp;thirdPoint))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.setColor(Color.RED);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.setColor(Color.BLUE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;radius&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2.drawOval(pos.x&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;radius,&nbsp;pos.y&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;radius,&nbsp;radius&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">, radius&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
}<br />
</span></div>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Triangle&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JFrame&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;CanvasPanel&nbsp;mainPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Triangle()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTitle(</span><span style="color: #000000;">"</span><span style="color: #000000;">Triangle</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSize(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dimension(</span><span style="color: #000000;">300</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">200</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setResizable(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;container&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getContentPane();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.add(mainPanel);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setVisible(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainPanel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CanvasPanel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Triangle();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="font-size: 10pt;"><br />
</span><img src ="http://www.blogjava.net/jiangshachina/aggbug/217214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-07-24 17:02 <a href="http://www.blogjava.net/jiangshachina/archive/2008/07/24/217214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>下一代Java Applet插件技术(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 14 Jul 2008 11:56:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/214703.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/214703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/214703.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 14pt;">下一代Java Applet插件技术</span></strong><br />
</div>
&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt;">Java SE 6对Java桌面应用进行较大的升级，并启动了Java SE 6 Update N计划，该计划旨在简化JRE的大小，增进用户的安装体验，并提供了一个新的Applet浏览器插件，该插件将会随<a href="https://jdk6.dev.java.net/6u10ea.html">Java SE 6 Update 10</a>发布。<a href="http://java.sun.com/developer/technicalArticles/javase/newapplets/">本文</a>全面介绍了这个新插件的关键特性，并以<a href="http://www.nasa.gov/">NASA</a>的<a href="http://worldwind.arc.nasa.gov/java/">World Wind</a>为例介绍了该插件的应用。(2008.07.15最后更新)<br />
<br />
</span><span style="font-size: 10pt;">Applet回来了！<br />
为了在网络中传递你的程序，是时候再次考虑Java Applet技术了。<a href="http://jdk6.dev.java.net/6u10ea.html">下一代Java插件技术</a>以一种不同的，比过去更高效、更可靠的途径来运行Applet。现在你可以获得如下好处：<br />
</span>
<ul>
    <li><span style="font-size: 10pt;">
    增强的可靠性</span></li>
    <li><span style="font-size: 10pt;">
    改进的用户体验</span></li>
    <li><span style="font-size: 10pt;">
    在后台启动Applet</span></li>
    <li><span style="font-size: 10pt;">
    内建的JNLP支持</span></li>
    <li><span style="font-size: 10pt;">
    针对每个Applet的命令行参数</span></li>
    <li><span style="font-size: 10pt;">
    堆内存大小，Java 2D API加速选项</span></li>
    <li><span style="font-size: 10pt;">
    改进的Java/JavaScript程序设计语言集成</span></li>
    <li><span style="font-size: 10pt;">
    改进的Windows Vista支持</span></li>
    <li><span style="font-size: 10pt;">
    签名的Applet现在可以在Internet Explorer的保护模式中正常运行</span></li>
</ul>
<span style="font-size: 10pt;">
下一代Java插件提供了一种完全重新设计的架构，它将出现在<a href="http://jdk6.dev.java.net/6u10ea.html">Java SE 6 Update 10</a>中。该插件为运行在网络浏览器中的Applet提供了强大的新功能，它以向后兼容的方式改进了整个Applet的可靠性及功能。<br />
下一代Java插件最有意义的新特性是它内建支持通过JNLP文件启动Applet。使用JNLP文件格式作为Applet的描述符就能允许Applet马上复用之前为Java Web Start应用所写的JNLP扩展。<br />
<strong><br />
<span style="font-size: 12pt;">执行Applet的新途径</span></strong><br />
执行Applet的新途径在结构上与Java Web Start技术相似，但与浏览器整合的更为紧密。Applet不在运行于网络浏览器内的JVM中，而是会启动一个独立的JVM进程去运行Applet。默认地，只有一个JVM将被启动，但你也能启动多个JVM，并且可以为每个Applet都设置命令行参数，所以你能影响堆内存的大小或其它的要求。<br />
<img alt="" src="http://java.sun.com/developer/technicalArticles/javase/newapplets/images/architecture.jpg" width="424" height="320" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 10pt;"><strong>Figure 1.</strong> <em>Applet Architecture</em></span><br />
<span style="font-size: 10pt;">
在上图中，云表示JVM实例。在浏览器内有一个小的，headless JVM被用于管理一个或多个客户端JVM之间的连接，这些JVM运行着Applet。在该图中，Duke表示Applet。其中，一个JVM实例运行着两个Applet，另一个运行着一个Applet。<br />
Applet直接从JNLP文件启动，它使用的JNLP文件与Java Web Start软件使用的描述符文件相同，并且允许使用比典型的"archive"，"code"和"cache_archive"更为强大的参数。<br />
新的插件提供了：<br />
</span>
<ul>
    <li><span style="font-size: 10pt;">
    能够访问之前仅由Java Web Start软件专用的高级JNLP扩展。之前有少部分参数能够使用，但有一些限制，现在这些限制则被去除。</span></li>
    <li><span style="font-size: 10pt;">
    通过Applet访问JNLP API。</span></li>
    <li><span style="font-size: 10pt;">
    支持PersistenceService和DownloadService。</span></li>
    <li><span style="font-size: 10pt;">
    能够控制堆内存大小，命令行参数，JRE版本选择和自动下载。你具有Java Web Start软件所拥有的相同功能。</span></li>
</ul>
<span style="font-size: 10pt;">
现在你就可以在Web页面中使用像下面这样的语句了：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">applet&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">500</span><span style="color: #000000;">&#8221;&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">500</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;jnlp_href&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;my_applet.jnlp&#8221;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">applet</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">调用Applet生命周期方法init，start，stop和destroy会更为确定，并且已经改进了跨浏览器行为。完全支持Applet类装载器缓存，遗留的Applet生命周期及对向后兼容性的需求，并且这些行为都已得到了改进。<br />
Applet运行的就像一个由Java Web Start启动的应用。参数jnlp_href在Web页面和Applet的JNLP描述之间起到了桥接的作用。在如宽度与高度这样的特定方面，Applet标签与JNLP文件具有重叠的机制。<br />
一般地，你应该使用<a href="https://jdk6.dev.java.net/testDT.html">Deployment Toolkit</a>，这也是一个出现在Java SE 6 Update 10中的新工具，它能自动地为Applet标签生成HTML。<a href="https://jdk6.dev.java.net/deployment_advice.html">部署建议</a>指南展示了如何使用Deployment Toolkit简便地发布Applet。<br />
<br />
<strong><span style="font-size: 12pt;">配置Applet</span></strong><br />
现在也能更为简单地在多个方面来配置Applet，包括堆内存大小，需要被使用的Java版本，类加载器缓存，边界，及其它。<br />
&lt;applet&gt;与JNLP文件在针对某些参数时有重叠的机制。这些冲突可以用如下方法解决：<br />
</span>
<ul>
    <li><span style="font-size: 10pt;"><strong>width and height</strong>：这些属性将总是从&lt;applet&gt;，而不是JNLP文件，中获取。这是假设浏览器知道Applet在Web页面上应该显示多大，也只有浏览器才能支持相对于页面的宽度与高度(例如，width="50%")。</span></li>
    <li><span style="font-size: 10pt;">
    <strong>codebase</strong>：如果JNLP文件在&lt;jnlp&gt;标签中指定了一个绝对的codebase，那么就使用它。否则，将使用在<a href="https://jdk6.dev.java.net/plugin2/jnlp/#CODEBASE">codebase handling</a>一节中描述的规则进行组织。</span></li>
    <li><span style="font-size: 10pt;">
    <strong>code</strong>：当指定了jnlp_href参数，Applet的主类名将从main-class参数换成JNLP文件中的applet-desc标签，并且code属性会被忽略。注意，该特性允许你为经典Java插件写一个拥有反馈的Applet标签，但在新的Java插件中，该标签可使用更高级的功能。请见下面的"兼容性"一节。</span></li>
    <li><span style="font-size: 10pt;">
    任何一个由&lt;param&gt;标签指定的Applet参数将与JNLP文件中指定的参数进行合并。如果&lt;applet&gt;标签和JNLP文件都指定了同一个参数，&lt;applet&gt;标签中的版本将覆盖JNLP文件中的版本，除了参数java_arguments和java_version。</span></li>
    <li><span style="font-size: 10pt;">
    新的java_arguments和java_version参数在JNLP Applet中是不必要的。会替换为通过JNLP文件请求JRE版本或向JVM传递参数的机制。所以，命令行参数和JNLP文件请求的JRE版本将会覆盖HTML中为Applet指定的这些值。</span></li>
    <li><span style="font-size: 10pt;">
    特定的参数，例如image，boxbgcolor等等，在Applet的启动过程中是有用的。在HTML而不是JNLP文件中指定这些参数可能更好些，以便于在加载Web页面时就可立即获取它们，而不用再等到单独下载JNLP文件之后。</span></li>
</ul>
<span style="font-size: 10pt;">
过去，通过Java控制面板设置最大堆内存是有限制的。在新的Java插件中，这些限制被取消。现在Applet可以像命令行应用那样使用大量堆空间。<br />
指定一个比默认值大的堆空间：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">APPLET&nbsp;archive</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">my_applet.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;code</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">MyApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java_arguments</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">-Xmx128m</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">APPLET</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">指定一个非默认大小的堆内存以及一个Java 2D硬件加速器选项，该选项常通过JOGL使用OpenGL应用于Applet。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">APPLET&nbsp;archive</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">my_applet.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;code</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">MyApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">java_arguments</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">-Xmx256m&nbsp;-Dsun.java2d.noddraw=true</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">APPLET</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">如果你喜欢，一个Applet可强制进入一个属于它自己的JVM实例，而与所有其它的Applet隔离开：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;separate_jvm&#8221;&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&#8221;&nbsp;</span><span style="color: #000000;">/&gt;</span></div>
<span style="font-size: 10pt;">当把某些桌面应用移植到Web浏览器时，这就有用了。<br />
你也能使特定的Applet运行在特定版本的JRE上，如下所示：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">j2se&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">1.4</span><span style="color: #000000;">+</span><span style="color: #000000;">&#8221;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">j2se&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;</span><span style="color: #000000;">1.5</span><span style="color: #000000;">*</span><span style="color: #000000;">&#8221;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">当想针对特定版本的JRE，或Applet取代早期版本的选择机制(如同IE浏览器中的CLSID)，进行质量测评时，该方法就很有用了。如果请求了一个非常老的JRE版本，就会强制执行限制；如果Applet试图加载未签名的代码，将会提示用户。<br />
注意，因为支持JNLP的Java插件是在Java SE 6 Update 10中才首次出现的，所以指定像&#8220;1.4+&#8221;这样的版本基本上没有意义的。当需要&#8220;1.7+&#8221;时，这才有意义。<br />
另外，你可以在JNLP文件中使用&lt;update&gt;标签来显著降低第二次及接下来各次启动的时间。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">update&nbsp;check</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;background&#8221;</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">在这种情况下，将使用缓存中已有的Applet程序，并且在后台下载该应用的更新版本。在下次启动时，就会使用新版本。<br />
新的插件也能更好地对图像进行定制，在Applet被加载之前会展示该图像。image参数会以支持动画GIF文件作为目标，<a href="http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/contents.html">Java Plug-in Developers' Guide</a>的<a href="http://java.sun.com/javase/6/docs/technotes/guides/plugin/developer_guide/special_attributes.html">Special Attributes</a>一节对此有描述。此外，现也支持如下新的参数：<br />
<strong>boxborder</strong><br />
一个布尔型参数，用于指定在Applet被加载之前是否在Applet区域的边缘绘制一个宽度一象素的边框。默认为true。我们建议将该值设置为false，特别是将一个动画GIF用作加载期图像时，以避免可能的闪烁。<br />
<strong>centerimage</strong><br />
一个布尔型参数，用于指定是否将加载期图像在Applet区域内居中显示，而不是从左上角起始。默认为false。<br />
使用参数boxborder和centerimage的例子：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">APPLET&nbsp;archive</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">large_archive.jar</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;code</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">MyApplet</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;Use&nbsp;an&nbsp;animated&nbsp;GIF&nbsp;as&nbsp;an&nbsp;indeterminate&nbsp;progress&nbsp;bar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;the&nbsp;applet&nbsp;is&nbsp;loading&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;NAME</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">image</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;VALUE</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">animated_gif.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;Turn&nbsp;off&nbsp;the&nbsp;box&nbsp;border&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;better&nbsp;blending&nbsp;</span><span style="color: #0000ff;">with</span><span style="color: #000000;">&nbsp;the<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;surrounding&nbsp;web&nbsp;page&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;NAME</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">boxborder</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;VALUE</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;Center&nbsp;the&nbsp;image&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;the&nbsp;applet's&nbsp;area&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PARAM&nbsp;NAME</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">centerimage</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;VALUE</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">APPLET</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;"><br />
<strong><span style="font-size: 12pt;">兼容性</span></strong><br />
现在可更容易维护向后兼容性。你可创建运行在更早Java插件版本上的程序，但仅需提供一个与jnlp_href参数一样的格式完整的&lt;applet&gt;标签就可使用这些新特性了。早期版本的JRE会忽略jnlp_href参数，转而使用&lt;applet&gt;标签。新的Java插件技术将忽略archive和code参数，而仅使用JNLP文件去启动Applet。<br />
<br />
<strong><span style="font-size: 12pt;">World Wind Applet示例</span></strong><br />
由World Wind Java开发组创建的<a href="http://download.java.net/javadesktop/plugin2/wwj/">NASA World Wind Java</a> Applet示例阐述了如果发布像NASA World Wind Java这样的领先类库。同样地，也用示例说明了如何使用JavaScript在Web页面中高效地整合HTML和Applet内容。<br />
<img alt="" src="http://java.sun.com/developer/technicalArticles/javase/newapplets/images/nasaapplet.jpg" width="450" height="283" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
</span><span style="font-size: 10pt;"><strong>Figure 2.</strong> </span><em><span style="font-size: 10pt;">NASA World Wind Applet</span></em><br />
<span style="font-size: 10pt;">该Web页面包含了关于喀斯喀特山脉的信息(要感谢维基百科)，并且将World Wind Java作为一个Applet嵌入其中，以图示该山脉中各山的位置。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">applet&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">wwjApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">600</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">380</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;code</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">gov.nasa.worldwind.examples.applet.WWJApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;archive</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">BackwardCompatibility.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jnlp_href</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">WWJApplet.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">applet</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">WWJApplet随标准的<a href="http://worldwind.arc.nasa.gov/java/">World Wind Java发行包</a>发布。如下所述，你可选择编写你自己的Applet类并将World Wind嵌入其中：<br />
下面是WWJApplet.jnlp文件中相关的部分：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">jnlp&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">WWJApplet.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">resources&nbsp;os</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Windows</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sun.java2d.noddraw</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">resources</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">resources</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">j2se&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://java.sun.com/products/autodl/j2se</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1.4+</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">jar&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">worldwind.jar</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;main</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">extension&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jogl</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">resources</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">applet</span><span style="color: #000000;">-</span><span style="color: #000000;">descname</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">WWJ&nbsp;Applet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;main</span><span style="color: #000000;">-</span><span style="color: #000000;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">gov.nasa.worldwind.examples.applet.WWJApplet</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;Overwritten&nbsp;by&nbsp;the&nbsp;surrounding&nbsp;web&nbsp;page&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">100</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">100</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">applet</span><span style="color: #000000;">-</span><span style="color: #000000;">desc</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">jnlp</span><span style="color: #000000;">&gt;</span></div>
<span style="font-size: 10pt;">注意几点：<br />
</span>
<ul>
    <li><span style="font-size: 10pt;">
    在本例中，worldwind.jar作为主类使用。理想地，从NASA的网站引用它，将其作为一个JNLP扩展，这就使得许多不同的都嵌入了World Wind的应用程序或Applet共享相同的jar文件。详情请见下面的内容。</span></li>
    <li><span style="font-size: 10pt;">
    为了它的硬件加速的3D图形，World Wind Java使用了针对OpenGL API的Java绑定，<a href="http://jogl.dev.java.net/">JOGL</a>。注意，JOGL JNLP扩展仅使用一行代码与应用程序进行结合。也要注意，在Windows平台上，由于OpenGL API与DirectDraw/Direct3D API(该API用于Windows平台默认的Java 2D实现)之间在驱动层面的冲突，需要指定系统参数-Dsun.java2d.noddraw=true。Windows平台上所有使用JOGL的应用程序与Applet程序都需要该系统参数。</span></li>
</ul>
<span style="font-size: 10pt;">
Web页面中的HTML链接调用JavaScript函数，该函数会与Applet进行交互并将其导向合适的山峰。下面是这些链接中的一个：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">a&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">javascript:gotoLocation(MOUNT_RAINIER);</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">Mount&nbsp;Rainier</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">a</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;(southeast&nbsp;of&nbsp;Tacoma,&nbsp;Washington)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span></div>
<span style="font-size: 10pt;">当点击该链接后，将会调用JavaScript函数gotoLocation。该函数定义在同一个Web页面中：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;gotoLocation(locationString)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;params&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;locationString.split(';');<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(params.length&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Lat/lon</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;getWWJApplet().gotoLatLon(parseFloat(params[</span><span style="color: #000000;">1</span><span style="color: #000000;">]),<br />
&nbsp;&nbsp;&nbsp;&nbsp;parseFloat(params[</span><span style="color: #000000;">2</span><span style="color: #000000;">]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
}</span></div>
<span style="font-size: 10pt;">Web页面HTML中的山峰位置将被解码为JavaScript字符串。将从这些字符串中解析出纬度，经度及其它视觉信息，并将它们传递给Applet。 gotoLatLon方法是在WWJApplet类中定义的；上面的方法调用将起动一个JavaScript-to-Java调用，把参数从JavaScript引擎传给Java。World Wind Applet接收该通知，并将视点以动画的方式切换到适当的地方。注意，gotoLatLon方法会迅速地返回，以便浏览器不必等待它的完成；该动画会在一个单独的Java线程中运行。<br />
<img alt="" src="http://java.sun.com/developer/technicalArticles/javase/newapplets/images/mtsthelens.jpg" /><br />
&nbsp;&nbsp;
</span><span style="font-size: 10pt;"><strong>Figure 3.</strong> <em>World Wind Applet with Mount St. Helen's Clicked</em><br />
</span>
<span style="font-size: 10pt;">如上所述，将World Wind Java集成到你的应用程序或Applet程序中的最好方法是将其作为一个JNLP扩展。这允许很多来自网络的集成了World Wind Java的应用程序或Applet程序能够共享World Wind代码资源。为了引用World Wind JNLP扩展，你需将下面的语句行加入到你的应用程序或Applet程序的JNLP文件中的&lt;resources&gt;部分：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">extension&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">worldwind</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://worldwind.arc.nasa.gov/java/0.4.1/webstart/worldwind.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">extension&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jogl</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span></div>
<span style="font-size: 10pt;">注意，World Wind扩展JNLP是区分版本的，所以你需参考World Wind文档或访问<a href="http://forum.worldwindcentral.com/forumdisplay.php?f=37">论坛</a>去找到你的JNLP会引用到的扩展的最新版本。<a href="http://worldwindcentral.com/">World Wind Central</a>是一个关于World Wind最新信息的有用资源。<br />
将World Wind作为一个扩展使用就意味着你不能将WWJApplet直接作为你的main-class使用。由于JNLP文件格式的语义，主jar (main="true")必须定义在主JNLP文件中。但很容易就能适应该限制，你可简单地创建你自己的WWJApplet子类(称之为MyWWJApplet)，而它并不做任何事情：<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">class&nbsp;MyWWJApplet&nbsp;extends&nbsp;WWJApplet&nbsp;{}</span></div>
<span style="font-size: 10pt;">将worldwind.jar置于classpath中，并编译上述类，然后将该类放入它自己的jar文件中。引入这个jar作为你的主jar，MyWWJApplet就成为了你的main-class，然后将其作为JNLP扩展引入到World Wind中。<br />
<br />
<strong><span style="font-size: 12pt;">结论</span></strong><br />
介绍了Java插件对JNLP的支持，这为Applet的发布提供了很多新的可能，这对在浏览器内外发布Java内容的方法的统一又进了一大步。Applet自从它们起始已过了很长的时间，现在随着对JNLP的支持，它们会比以往更快，也更易于定制。<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/214703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-07-14 19:56 <a href="http://www.blogjava.net/jiangshachina/archive/2008/07/14/214703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Applet不适用于这样的应用？(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2008/02/26/182208.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Tue, 26 Feb 2008 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2008/02/26/182208.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/182208.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2008/02/26/182208.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/182208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/182208.html</trackback:ping><description><![CDATA[<div align="center"><strong><span style="font-size: 10pt;"><span style="font-size: 14pt;">Java Applet不适用于这样的应用？</span></span></strong><br />
</div>
<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt;">在基于浏览器的应用中，为何Flash大大流行于Java Applet?Java Applet是否真的不适用于这样的应用场景？<a href="http://weblogs.java.net/blog/joconner/archive/2008/02/java_applets_no.html">John O'Conner有话要说</a>...(2008.03.29最后更新)</span></span><br />
<span style="font-size: 10pt;"><br />
&nbsp;&nbsp;&nbsp; 我已正与一个公司一起创建一个聊天系统，以帮助该公司能够在线地销售出它们更多的产品。后端全是Java，还有Spring，Servlet，...都是些好东西。前端是...好吧，是Flash。<br />
&nbsp;&nbsp;&nbsp; 当有可能时，我更喜欢在每个地方都使用Java，故我就这个面向客户的应用--一个真实的聊天客户端程序选择使用Flash而提出了一些问题。这个谈话进行起来就像这样：<br />
&nbsp;&nbsp;&nbsp; <strong><em>John</em></strong>：哇，这个产品在每处都使用了Java，但前端除外，而这正是客户与之实际交互的地方。为什么在那儿选择Flash？<br />
&nbsp;&nbsp;&nbsp; <strong><em>Dev mgr</em></strong>：是的，Flash很容易。使用这样一个简单的UI也是很容易的。<br />
&nbsp;&nbsp;&nbsp; <strong><em>John</em></strong>：我明白，但使用Java也可十分简单地做出这个聊天UI。现在，Swing的布局管理器已很容易使用，特别是当你使用像NetBeans这样的IED来布局UI时。<br />
&nbsp;&nbsp;&nbsp; <strong><em>Dev mgr</em></strong>：那可能是对的，但这种选择不仅仅是基于简易地创建UI。<br />
&nbsp;&nbsp;&nbsp; <strong><em>John</em></strong>：哦？那是什么呢？<br />
&nbsp;&nbsp;&nbsp; <strong><em>Dev mgr</em></strong>：每个客户端浏览器中都有Flash。我们不必再安装一个运行时程序了。<br />
&nbsp;&nbsp;&nbsp; <strong><em>John</em></strong>：Java也将会那样，不是吗？大部分的PC制造商都包含它了。<br />
&nbsp;&nbsp;&nbsp; <strong><em>Dev mgr</em></strong>：也许，但我们知道Flash肯定是那样的。Flash遍及网络，而且很可能客户已经有了Flash的运行时程序。如里没有的话，下载与安装这个运行时程序也是很快、很容易的。<br />
&nbsp;&nbsp;&nbsp; <strong><em>John</em></strong>：是的，但Java也将易于安装。<br />
&nbsp;&nbsp;&nbsp; <strong><em>Dev mgr</em></strong>：但是Java会花费很长的安装时间。它太大了。<br />
&nbsp;&nbsp;&nbsp; <strong><em>John</em></strong>：我不知道现在是否还是那样。为了使运行时程序更小也更加的模块化，已经做了很多工作。所以你仅需要下载你所需要的部分。<br />
&nbsp;&nbsp;&nbsp; <strong><em>Dev mgr</em></strong>：我们所需要的就是非常、非常的简单。一个非常简单的UI，它有着非常简单的功能去中转聊天文本。Flash可以做得很好。<br />
&nbsp;&nbsp;&nbsp; 交谈继续着，但我不想弄得太长。可能Flash做小应用时会比Java做的更好？在Sun工作了如此长的时间，我就很自然地想像Java无处不在，而且其它的每个人也都喜欢它。我一直都能把事情做好...但很显然，不是每个人都能做到。下载文件的大小从未烦扰过我...但它确实烦扰到了其它的一些人。<br />
&nbsp;&nbsp;&nbsp; 另外，我发现感觉与现实一样重要。所以，如果Java现在更快，更轻巧，而且在浏览器中工作得极好，那将会怎样呢？不知何故，这还是没有用。旧有的感觉仍就在那儿--Java很慢，很大，而且很难在浏览器中工作。更令人惊讶的是，你会发现有些人在那种情况下就再也不把Java当作他们的解决方案了。<br />
&nbsp;&nbsp;&nbsp; 我联系了一些朋友，他们一起搭建面向客户的网站。他们也是使用Flash。那么Java呢？当然...都是在后端的业务逻辑中。那么对于客户将会使用到的应用呢？如果这些应用是嵌入到浏览器中的，它们就会使用Flash。哇!<br />
&nbsp;&nbsp;&nbsp; 这样，你如何对待这种感觉呢？Java需要做些什么以反击这些旧有的感觉？为什么Flash在基于浏览器的应用中更为流行？我们如何才能使那些应用转而使用Java？<br />
<br />
</span>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/182208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2008-02-26 14:07 <a href="http://www.blogjava.net/jiangshachina/archive/2008/02/26/182208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>