﻿<?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-Thinking in Java</title><link>http://www.blogjava.net/feenn/</link><description>Java开发技巧与实践</description><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 23:34:12 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 23:34:12 GMT</pubDate><ttl>60</ttl><item><title>Nonogram求解小程序</title><link>http://www.blogjava.net/feenn/archive/2020/03/04/435211.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Wed, 04 Mar 2020 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2020/03/04/435211.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/435211.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2020/03/04/435211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/435211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/435211.html</trackback:ping><description><![CDATA[算法就是简单的逐行逐列剪枝法，只不过加入了过程的可视化。支持任意Size的puzzle，支持三种可视化方法：<br /><strong>1.Console字符输出：</strong><br /><img src="http://www.blogjava.net/images/blogjava_net/feenn/未命名.png" border="0" alt="" /><br /><br /><strong>2.Console输入（带有ANSI Color字符，需要Terminal支持，Windows下推荐使用cmder等）</strong><br /><img src="http://www.blogjava.net/images/blogjava_net/feenn/test.png" border="0" alt="" /><br /><br /><strong>3. 窗口输出：在窗口中输出结果，支持保存图片，支持查看每一步。</strong><br /><img src="http://www.blogjava.net/images/blogjava_net/feenn/test2.png" border="0" alt="" /><br /><br />源代码：<a href="https://github.com/feenn/nonogram">https://github.com/feenn/nonogram</a><img src ="http://www.blogjava.net/feenn/aggbug/435211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2020-03-04 13:56 <a href="http://www.blogjava.net/feenn/archive/2020/03/04/435211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数独解题Demo程序-Sudoku</title><link>http://www.blogjava.net/feenn/archive/2019/05/14/433781.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Tue, 14 May 2019 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2019/05/14/433781.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/433781.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2019/05/14/433781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/433781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/433781.html</trackback:ping><description><![CDATA[用Processing写的Demo，主要是给教学用的。<br />
<ul>
     <li>
     可录入初始数字摆放布局</li>
     <li>
     可计算题解方案的总个数（当然极限方案总数<span style="color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif; font-size: 15px; background-color: #ffffff;">6670903752021072936960的计算朝纲了）<br />
     </span></li>
     <li>可自动演示每一步</li>
</ul>
可手动单步或回退<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/feenn/2019-5-14-9-20-59.jpg" width="480" height="720" alt="" /><br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/feenn/ezgif-1-ad268d498a3d.gif" width="480" height="720" alt="" /><br />
<br />
<iframe height=498 width=510 src="http://player.youku.com/embed/XNDE4MDgzODU0NA==?client_id=undefined" frameborder=0 allowfullscreen></iframe>
<img src ="http://www.blogjava.net/feenn/aggbug/433781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2019-05-14 09:59 <a href="http://www.blogjava.net/feenn/archive/2019/05/14/433781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Maven-Shade-Plugin打包SWT及JFace遇到的问题及解决方法</title><link>http://www.blogjava.net/feenn/archive/2019/04/29/433739.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Mon, 29 Apr 2019 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2019/04/29/433739.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/433739.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2019/04/29/433739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/433739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/433739.html</trackback:ping><description><![CDATA[<h3>一、问题</h3>
<span>当开启&nbsp;</span><span>m</span><span>inimizeJar&nbsp;</span>后，精简的Jar运行会出现如下错误：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->The&nbsp;image&nbsp;could&nbsp;not&nbsp;be&nbsp;loaded:&nbsp;FileImageDescriptor(location=<span style="color: #0000FF; ">class</span>&nbsp;org.eclipse.jface.dialogs.TitleAreaDialog,&nbsp;name=images/title_banner.png)<br />
org.eclipse.jface.resource.DeviceResourceException:&nbsp;Unable&nbsp;to&nbsp;create&nbsp;resource&nbsp;FileImageDescriptor(location=<span style="color: #0000FF; ">class</span>&nbsp;org.eclipse.jface.dialogs.TitleAreaDialog,&nbsp;name=images/title_banner.png)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.eclipse.jface.resource.ImageDescriptor.createResource(ImageDescriptor.java:184)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.eclipse.jface.resource.DeviceResourceManager.allocate(DeviceResourceManager.java:55)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.eclipse.jface.resource.AbstractResourceManager.create(AbstractResourceManager.java:88)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.eclipse.jface.resource.ResourceManager.createImageWithDefault(ResourceManager.java:195)<br />
&#8230;&#8230;&#8230;&#8230;</div>
<br />
出现这个错误的直接现象是所有的图片&#8212;&#8212;包括图标&#8212;&#8212;都无法正确显示。<br />
<br />
<h3>二、分析</h3>
开始以为是resources打包错误导致没有被压进jar包，不过分析jar包内容发现并没有文件缺失，然后开始分析minimizeJar的机制。文档上说：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&lt;minimizeJar&gt;<br />
When&nbsp;<span style="color: #0000FF; ">true</span>,&nbsp;dependencies&nbsp;will&nbsp;be&nbsp;stripped&nbsp;down&nbsp;on&nbsp;the&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;level&nbsp;to&nbsp;only&nbsp;the&nbsp;transitive&nbsp;hull&nbsp;required&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;the&nbsp;artifact.&nbsp;Note:&nbsp;Usage&nbsp;of&nbsp;<span style="color: #0000FF; ">this</span>&nbsp;feature&nbsp;requires&nbsp;Java&nbsp;1.5&nbsp;or&nbsp;higher.</div>
<br />
由此来看，shade做的只是做了静态调用分析，并没有做动态类加载运行分析，因此极大可能问题是出在这里了。而且从抛出的异常来看，有可能是图片文件格式无法解析导致了图片资源创建失败。<br />
<br />
那么之后的调试方法就简单了，首先上verbose大法，直接加verbose:class参数，分别运行正常的和异常的Jar包，从输出信息发现了端倪：<br />
<br />
<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 />
-->[Loaded&nbsp;java.lang.IndexOutOfBoundsException&nbsp;from&nbsp;C:\Program&nbsp;Files\Java\jre1.8.0_151\lib\rt.jar]<br />
[Loaded&nbsp;java.lang.ArrayIndexOutOfBoundsException&nbsp;from&nbsp;C:\Program&nbsp;Files\Java\jre1.8.0_151\lib\rt.jar]<br />
[Loaded&nbsp;org.eclipse.swt.internal.image.WinBMPFileFormat&nbsp;from&nbsp;file:/E:/Temp<span style="color: #008000; ">/**</span><span style="color: #008000; ">***.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.GIFFileFormat&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.WinICOFileFormat&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.JPEGFileFormat&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.JPEGSegment&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.JPEGFixedSizeSegment&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.JPEGStartOfImage&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PNGFileFormat&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngInputStream&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngDecodingDataStream&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngChunkReader&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngChunk&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngIhdrChunk&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngFileReadState&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngPlteChunk&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngIdatChunk&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngIendChunk&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.image.PngTrnsChunk&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span style="color: red;">[Loaded&nbsp;org.eclipse.swt.internal.win32.BITMAPINFOHEADER&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />[Loaded&nbsp;org.eclipse.jface.window.ToolTip$ToolTipOwnerControlListener&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span>[Loaded&nbsp;org.eclipse.jface.window.ToolTip$$Lambda$19/1873653341&nbsp;from&nbsp;org.eclipse.jface.window.ToolTip]<br />
</span><span>[Loaded&nbsp;org.cncert.xac.utils.ResourceManager&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span>[Loaded&nbsp;org.eclipse.swt.widgets.ToolItem&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span>[Loaded&nbsp;org.eclipse.swt.internal.win32.TBBUTTON&nbsp;from&nbsp;file:/E:/Temp/*****.jar]</span><span style="color: red;"><br />
</span><span>[Loaded&nbsp;org.eclipse.jface.resource.AbstractResourceManager$RefCount&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span>[Loaded&nbsp;org.eclipse.swt.layout.FormData&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span>[Loaded&nbsp;org.eclipse.swt.layout.FormAttachment&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span>[Loaded&nbsp;org.eclipse.jface.dialogs.TitleAreaDialog$1&nbsp;from&nbsp;file:/E:/Temp/*****.jar]<br />
</span><span>[Loaded&nbsp;org.eclipse.jface.window.ToolTip$TooltipHideListener&nbsp;from&nbsp;file:/E:/Temp/*****.jar]</span><span><br />
</span></div>
<br />
注意上方红色的字体，在异常的Jar包输出中是没有的，同时检查了Jar包中果然没有打包这几个类！将这几个类手动加入Jar包后，异常的Jar包可以正常运行了。<br />
<br />
从源代码看，这几个类型是SWT在运行时动态加载的，由 org.eclipse.swt.internal.image.FileFormat 动态加载，相关代码如下：<br />
<br />
<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; ">package</span>&nbsp;org.eclipse.swt.internal.image;<br />
<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.io.*;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.eclipse.swt.*;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.eclipse.swt.graphics.*;<br />
<br />
<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;Abstract&nbsp;factory&nbsp;class&nbsp;for&nbsp;loading/unloading&nbsp;images&nbsp;from&nbsp;files&nbsp;or&nbsp;streams<br />
&nbsp;*&nbsp;in&nbsp;various&nbsp;image&nbsp;file&nbsp;formats.<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;FileFormat&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;FORMAT_PACKAGE&nbsp;=&nbsp;"org.eclipse.swt.internal.image";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-1$</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;FORMAT_SUFFIX&nbsp;=&nbsp;"FileFormat";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-1$</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String[]&nbsp;FORMATS&nbsp;=&nbsp;{"WinBMP",&nbsp;"WinBMP",&nbsp;"GIF",&nbsp;"WinICO",&nbsp;"JPEG",&nbsp;"PNG",&nbsp;"TIFF",&nbsp;"OS2BMP"};&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-1$</span><span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-2$&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-3$&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-4$</span><span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-5$&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-6$</span><span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-7$</span><span style="color: #008000; ">//</span><span style="color: #008000; ">$NON-NLS-8$</span><span style="color: #008000; "><br />
</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;LEDataInputStream&nbsp;inputStream;<br />
&nbsp;&nbsp;&nbsp;&nbsp;LEDataOutputStream&nbsp;outputStream;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ImageLoader&nbsp;loader;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;compression;<br />
<br />
<span style="color: #0000FF; ">static</span>&nbsp;FileFormat&nbsp;getFileFormat&nbsp;(LEDataInputStream&nbsp;stream,&nbsp;String&nbsp;format)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Class&lt;?&gt;&nbsp;clazz&nbsp;=&nbsp;Class.forName(FORMAT_PACKAGE&nbsp;+&nbsp;'.'&nbsp;+&nbsp;format&nbsp;+&nbsp;FORMAT_SUFFIX);<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileFormat&nbsp;fileFormat&nbsp;=&nbsp;(FileFormat)&nbsp;clazz.getDeclaredConstructor().newInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fileFormat.isFileFormat(stream))&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fileFormat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />
}</div>
<br />
<h3>三、Maven配置的修改</h3>
在官方文档中，可以使用filter来显式包含不想被minimizeJar优化掉的内容，但是目前filter还无法做到针对一个artifact中选择性对某个目录下的文件不做优化。<br />
例如，我希望shade不对org/eclipse/swt/internal/image/**做优化，我的配置是这样的：<br />
<br />
<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; ">&lt;</span><span style="color: #800000; ">filter</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifact</span><span style="color: #0000FF; ">&gt;</span>org.eclipse:swt.win32.x86_64<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifact</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">includes</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">include</span><span style="color: #0000FF; ">&gt;</span>org/eclipse/swt/internal/image/**<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">include</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">includes</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter</span><span style="color: #0000FF; ">&gt;</span></div>
<br />
但最终的结果是只打包了这个目录内的类，而这个artifact中的其他类全部被removed，因为<a href="https://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html">官方demo</a>中有这样一句话：<br />
<br />
<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 />
-->As&nbsp;of&nbsp;version&nbsp;1.6,&nbsp;minimizeJar&nbsp;will&nbsp;respect&nbsp;classes&nbsp;that&nbsp;were&nbsp;specifically&nbsp;marked&nbsp;for&nbsp;inclusion&nbsp;in&nbsp;a&nbsp;filter.&nbsp;Note&nbsp;that&nbsp;<strong style="color: #ff0000;">specifying&nbsp;an&nbsp;include&nbsp;filter&nbsp;for&nbsp;classes&nbsp;in&nbsp;an&nbsp;artifact&nbsp;implicitly&nbsp;excludes&nbsp;all&nbsp;non-specified&nbsp;classes&nbsp;in&nbsp;that&nbsp;artifact</strong>.</div>
<br />
所以我只能让shade将swt的artifact全部保留，不做优化。<br />
<br />
<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; ">&lt;</span><span style="color: #800000; ">filter</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifact</span><span style="color: #0000FF; ">&gt;</span>org.eclipse:swt.win32.x86_64<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifact</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">includes</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">include</span><span style="color: #0000FF; ">&gt;</span>**<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">include</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">includes</span><span style="color: #0000FF; ">&gt;</span><br />
<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filter</span><span style="color: #0000FF; ">&gt;</span></div>
<br />
或者使用artifactSet达到同样的效果。<br /><h3>
四、总结</h3>
<ol>
     <li>目前shade的机制是静态分析，所以可能会优化掉很多动态加载的类，对于使用动态加载较多的工程，在发布时需要特别注意。
     </li>
<li>目前shade的配置无法在一个artifact内显式指定某个路径不优化（或许有，但我确实没找到，欢迎知道的朋友留言告知），只能显式保留整个artifact不做优化。
     </li>
</ol><img src ="http://www.blogjava.net/feenn/aggbug/433739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2019-04-29 16:33 <a href="http://www.blogjava.net/feenn/archive/2019/04/29/433739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse更新后手工清理Plugins中旧文件的小程序</title><link>http://www.blogjava.net/feenn/archive/2015/06/11/425625.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Thu, 11 Jun 2015 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2015/06/11/425625.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/425625.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2015/06/11/425625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/425625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/425625.html</trackback:ping><description><![CDATA[Eclipse更新时会对Features和Plugins的文件进行一定的清理，经过观察发现Eclipse的清理动作如下：<br /><ol><li>Features目录会自动更新无需手工清理。</li><li>Plugins目录中的source jar会自动清理，而运行jar包会保留之前的一个版本。</li></ol>出于冗余的考虑，一般来讲不需要手工清理Plugins目录，而手工清理通常需要借助TC等工具逐项对比后删除，需仔细且难保出现错误。因此，写了一个可自动清理Plugins中旧Jar包的辅助程序。<br />该程序通过对比Plugins中相同包名的Jar包文件，自动删除较旧的Jar包，用了一些小技巧：<br /><ol><li>比较版本时直接使用了文件的修改时间比较，当然这是一种比较懒的方法，有可能会出错。</li><li>删除时使用了JNA提供的删除到回收站的方法，以防出错后可以恢复。</li></ol>源代码见下。<br /><br /><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: #008080; ">&nbsp; 1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;org.tsinghua.benjamin;<br /><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.io.File;<br /><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.io.FileFilter;<br /><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.ArrayList;<br /><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.HashMap;<br /><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.Iterator;<br /><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><span style="color: #008080; ">&nbsp;10</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;11</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;com.sun.jna.platform.FileUtils;<br /><span style="color: #008080; ">&nbsp;12</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;EclipseUpdateCleaner&nbsp;{<br /><span style="color: #008080; ">&nbsp;14</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;15</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;String&nbsp;pluginPath&nbsp;=&nbsp;"d:\\Eclipse\\x86\\Luna\\plugins\\";</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;pluginPath&nbsp;=&nbsp;"d:\\Eclipse\\x64\\Luna\\plugins\\";<br /><span style="color: #008080; ">&nbsp;17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;HashMap&lt;String,&nbsp;List&lt;String&gt;&gt;&nbsp;mapDir&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;&gt;();<br /><span style="color: #008080; ">&nbsp;18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;HashMap&lt;String,&nbsp;List&lt;String&gt;&gt;&nbsp;mapJar&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;&gt;();<br /><span style="color: #008080; ">&nbsp;19</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;PluginFilter&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;FileFilter&nbsp;{<br /><span style="color: #008080; ">&nbsp;21</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br /><span style="color: #008080; ">&nbsp;23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;accept(File&nbsp;pathname)&nbsp;{<br /><span style="color: #008080; ">&nbsp;24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pathname&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;||&nbsp;!pathname.exists())<br /><span style="color: #008080; ">&nbsp;25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">&nbsp;26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pathname.isDirectory())<br /><span style="color: #008080; ">&nbsp;27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">&nbsp;28</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pathname.getName().toLowerCase().endsWith(".jar"))<br /><span style="color: #008080; ">&nbsp;30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">&nbsp;31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">&nbsp;32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;33</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;35</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br /><span style="color: #008080; ">&nbsp;37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File(pluginPath);<br /><span style="color: #008080; ">&nbsp;38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!file.exists()&nbsp;||&nbsp;!file.isDirectory())<br /><span style="color: #008080; ">&nbsp;39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br /><span style="color: #008080; ">&nbsp;40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File[]&nbsp;files&nbsp;=&nbsp;file.listFiles(<span style="color: #0000FF; ">new</span>&nbsp;PluginFilter());<br /><span style="color: #008080; ">&nbsp;42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(File&nbsp;file2&nbsp;:&nbsp;files)&nbsp;{<br /><span style="color: #008080; ">&nbsp;43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;=&nbsp;file2.getName();<br /><span style="color: #008080; ">&nbsp;44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index&nbsp;=&nbsp;name.indexOf('_');<br /><span style="color: #008080; ">&nbsp;45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">assert</span>(index&nbsp;&gt;&nbsp;0);<br /><span style="color: #008080; ">&nbsp;46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;name.substring(0,&nbsp;index);<br /><span style="color: #008080; ">&nbsp;47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;name.substring(index&nbsp;+&nbsp;1);<br /><span style="color: #008080; ">&nbsp;48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(file2.isDirectory())&nbsp;{<br /><span style="color: #008080; ">&nbsp;49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addToMap(mapDir,&nbsp;key,&nbsp;value);<br /><span style="color: #008080; ">&nbsp;50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addToMap(mapJar,&nbsp;key,&nbsp;value);<br /><span style="color: #008080; ">&nbsp;52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("---Dir---");<br /><span style="color: #008080; ">&nbsp;56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recycleOldJars(mapDir);<br /><span style="color: #008080; ">&nbsp;57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("---Jar---");<br /><span style="color: #008080; ">&nbsp;59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recycleOldJars(mapJar);<br /><span style="color: #008080; ">&nbsp;60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;61</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;63</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;map&nbsp;<br /></span><span style="color: #008080; ">&nbsp;64</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;key<br /></span><span style="color: #008080; ">&nbsp;65</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;value<br /></span><span style="color: #008080; ">&nbsp;66</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;addToMap(HashMap&lt;String,List&lt;String&gt;&gt;&nbsp;map,&nbsp;String&nbsp;key,&nbsp;String&nbsp;value)&nbsp;{<br /><span style="color: #008080; ">&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(mapDir.containsKey(key))&nbsp;{<br /><span style="color: #008080; ">&nbsp;69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;list&nbsp;=&nbsp;map.get(key);<br /><span style="color: #008080; ">&nbsp;70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(value);<br /><span style="color: #008080; ">&nbsp;71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(key,&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;String&gt;(){<br /><span style="color: #008080; ">&nbsp;73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;serialVersionUID&nbsp;=&nbsp;7647872335210732416L;<br /><span style="color: #008080; ">&nbsp;74</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(value);<br /><span style="color: #008080; ">&nbsp;77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}});<br /><span style="color: #008080; ">&nbsp;78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;80</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;82</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;fileUtils<br /></span><span style="color: #008080; ">&nbsp;83</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;iterator<br /></span><span style="color: #008080; ">&nbsp;84</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;recycleOldJars(HashMap&lt;String,&nbsp;List&lt;String&gt;&gt;&nbsp;map)&nbsp;{<br /><span style="color: #008080; ">&nbsp;86</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&lt;String&gt;&nbsp;iterator&nbsp;=&nbsp;map.keySet().iterator();<br /><span style="color: #008080; ">&nbsp;87</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileUtils&nbsp;fileUtils&nbsp;=&nbsp;FileUtils.getInstance();<br /><span style="color: #008080; ">&nbsp;88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(iterator.hasNext())&nbsp;{<br /><span style="color: #008080; ">&nbsp;89</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;next&nbsp;=&nbsp;iterator.next();<br /><span style="color: #008080; ">&nbsp;90</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;list&nbsp;=&nbsp;map.get(next);<br /><span style="color: #008080; ">&nbsp;91</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(list.size()&nbsp;&lt;&nbsp;2)<br /><span style="color: #008080; ">&nbsp;92</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br /><span style="color: #008080; ">&nbsp;93</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;curr&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File(pluginPath,&nbsp;next&nbsp;+&nbsp;"_"&nbsp;+&nbsp;list.get(0));<br /><span style="color: #008080; ">&nbsp;95</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;File&gt;&nbsp;files&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;File&gt;();<br /><span style="color: #008080; ">&nbsp;96</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;list.size();&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;97</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;temp&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File(pluginPath,&nbsp;next&nbsp;+&nbsp;"_"&nbsp;+&nbsp;list.get(i));<br /><span style="color: #008080; ">&nbsp;98</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(temp.lastModified()&nbsp;&gt;&nbsp;curr.lastModified())&nbsp;{<br /><span style="color: #008080; ">&nbsp;99</span>&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;files.add(curr);<br /><span style="color: #008080; ">100</span>&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;curr&nbsp;=&nbsp;temp;<br /><span style="color: #008080; ">101</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">102</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">103</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">104</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(String.format("[new]%s",&nbsp;curr.getName()));<br /><span style="color: #008080; ">105</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File[]&nbsp;rs&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File[files.size()];<br /><span style="color: #008080; ">106</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;rs.length;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">107</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs[i]&nbsp;=&nbsp;files.get(i);<br /><span style="color: #008080; ">108</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(String.format("\t[delete]%s",&nbsp;rs[i].getName()));<br /><span style="color: #008080; ">109</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">110</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">111</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(fileUtils.hasTrash())&nbsp;{<br /><span style="color: #008080; ">112</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br /><span style="color: #008080; ">113</span>&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;fileUtils.moveToTrash(rs);<br /><span style="color: #008080; ">114</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{<br /><span style="color: #008080; ">115</span>&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;e.printStackTrace();<br /><span style="color: #008080; ">116</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">117</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">118</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">119</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">120</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">121</span>&nbsp;<br /><span style="color: #008080; ">122</span>&nbsp;}<br /><span style="color: #008080; ">123</span>&nbsp;</div><img src ="http://www.blogjava.net/feenn/aggbug/425625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2015-06-11 14:12 <a href="http://www.blogjava.net/feenn/archive/2015/06/11/425625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XULRunner on 64-bit Windows</title><link>http://www.blogjava.net/feenn/archive/2013/05/18/399443.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Sat, 18 May 2013 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2013/05/18/399443.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/399443.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2013/05/18/399443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/399443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/399443.html</trackback:ping><description><![CDATA[Eclipse 4.3M7：<span style="font-family: verdana, arial, helvetica, geneva; font-size: 13px; line-height: normal;">The browser widget now supports the embedding of XULRunner on Windows x86_64.<br /><br />终于能支持了！<br /><br /></span><a href="http://download.eclipse.org/eclipse/downloads/drops4/S-4.3M7-201305020800/news/">http://download.eclipse.org/eclipse/downloads/drops4/S-4.3M7-201305020800/news/</a><img src ="http://www.blogjava.net/feenn/aggbug/399443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2013-05-18 10:15 <a href="http://www.blogjava.net/feenn/archive/2013/05/18/399443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse出现异常后重新指定默认workspace路径的方法</title><link>http://www.blogjava.net/feenn/archive/2012/07/27/384176.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Fri, 27 Jul 2012 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2012/07/27/384176.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/384176.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2012/07/27/384176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/384176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/384176.html</trackback:ping><description><![CDATA[今天突然遇到的这个问题，在网上搜索了一下，发现在Stack上面也有人遇到了。<br /><br />原文在此：<a href="http://stackoverflow.com/questions/7058782/how-to-force-eclipse-to-ask-for-default-workspace">http://stackoverflow.com/questions/7058782/how-to-force-eclipse-to-ask-for-default-workspace</a>&nbsp;<br /><br />症状是这样的：启动后默认打开一个目录作为workspace，该目录是我之前从来没配置过的。无论是在选项中勾选&#8220;<span style="font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; text-align: left; background-color: #ffffff; ">Prompt for workspace on startup</span>&#8221;，还是删除eclipse的配置文件均无法再次让eclipse询问并更改默认workspace路径。<br /><br />试过一些方法，比如启动两个eclipse指向同一个路径，这样会使第二个eclipse进程询问一个新的workspace路径。但是此方法对我无效。<br /><br />于是在stackoverflow上找到了一个解决方法：命令行执行&#8220;eclipse -clean&#8221;，启动eclipse，然后终于就正常了。<br /><br />查了一下eclipse startup parameters中关于此项的解释，貌似是将osgi的一些cache清除了。回忆起之前曾经在eclipse假死状态下杀掉了javaw进程，可能是因此而导致的。<br /><br />anyway，找到了方法并解决了此问题，特此记录。<br /><br /><img src ="http://www.blogjava.net/feenn/aggbug/384176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2012-07-27 16:41 <a href="http://www.blogjava.net/feenn/archive/2012/07/27/384176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>曾经写的一个猜数字小程序</title><link>http://www.blogjava.net/feenn/archive/2012/06/01/379765.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Fri, 01 Jun 2012 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2012/06/01/379765.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/379765.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2012/06/01/379765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/379765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/379765.html</trackback:ping><description><![CDATA[春节闲来无事，突然想起大一的时候第一次学习编程看到的一个演示程序：自己心里想一个数字，然后电脑来猜！当时印象极为深刻，尤其是用格子的形式动态展示计算机猜数的过程，甚为好看！于是用了一下午把它写了出来。今日偶然翻出来觉得挺有意思的，遂挂出来仅供大家一笑~<br />
<br />
算法上基本没有技术含量，当然如果能加入启发式算法更好。都是技术活，纯体力的，用到了之前说过的点阵字符。有兴趣的筒子可以拿去玩玩。<br />
<hr />
<strong>1.</strong> 实现了两种方式的猜数：计算重复位数 和 不计重复位数。每一种还包括数字&#8220;包含0&#8221;和&#8220;不包含0&#8221;两种情况。<br />
<strong>2.</strong> 理论上支持任意多位数，但是画图的考虑，只写了四位和六位数；<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/feenn/无命名.png" border="0" alt="" width="400" height="458" data-pinit="registered" /><br />
<br />
<strong>3. </strong>用点阵小灯表示猜数过程：红色点亮小灯代表目前可能的数字，熄灭的表示不可能的；<br />
<img src="http://www.blogjava.net/images/blogjava_net/feenn/无命名3.png" border="0" alt="" width="800" height="501" data-pinit="registered" /><br />
<br />
<strong>4. </strong>可以判断是否对电脑说谎。<br />
<img src="http://www.blogjava.net/images/blogjava_net/feenn/无命名2.png" border="0" alt="" width="800" height="364" data-pinit="registered" /><br />
<br />
当然，最后猜中了电脑也可以搞笑一把！<br />
<img src="http://www.blogjava.net/images/blogjava_net/feenn/无命名5.png" border="0" alt="" width="800" height="419" data-pinit="registered" /><br />
<br />
<strong>额外的体力活：</strong>支持窗口任意缩放，可自定义的搞笑短语&#8230;&#8230;&#8230;&#8230;<br />
<hr /><strong>
下载</strong>：<a title="可执行文件" href="/Files/feenn/GuessNumber.rar" style="color: #ff0000; ">可执行文件</a>&nbsp;&nbsp;<a title="源代码" href="/Files/feenn/GuessNumber_src.rar" style="color: #00ccff; ">源代码</a><br />
<br /><strong>
</strong><strong style="color: #ff6600; ">【重要说明】</strong><br /><strong>
</strong><strong style="color: #ff6600; ">1.</strong><span style="color: #ff6600; "> 程序中附带的swt库是x64的，如果是32位系统，请替换libs下面的swt jar包。然后，要么保持原来的jar包名称，要么修改guess.jar中的manifest文件中的内容；</span><br style="color: #ff6600; " /><strong style="color: #ff6600; ">
2.</strong><span style="color: #ff6600; "> 直接双击guess.exe即可执行，该文件实际上是一个批处理脚本；</span><br style="color: #ff6600; " /><strong style="color: #ff6600; ">
3.</strong><span style="color: #ff6600; "> 源代码无保留发布，eclipse工程。非认真开发，纯属娱乐，各位高手多多指教~</span><img src ="http://www.blogjava.net/feenn/aggbug/379765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2012-06-01 20:58 <a href="http://www.blogjava.net/feenn/archive/2012/06/01/379765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java生成点阵字符的思路</title><link>http://www.blogjava.net/feenn/archive/2012/02/16/370140.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Thu, 16 Feb 2012 11:52:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2012/02/16/370140.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/370140.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2012/02/16/370140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/370140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/370140.html</trackback:ping><description><![CDATA[基本思路是向Display绘制图片，然后通过操作Image上的像素点来生成点阵字库。<br />
<br />
这里以SWT为例，代码如下：<br />
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; 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;GC&nbsp;gc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;GC(image);<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;gc.setFont(font); <span style="color: #339966; ">// 设置字体，事先可以准备好一个字体实例</span><br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;gc.drawString(ch.toString(),&nbsp;0,&nbsp;0);<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;y&nbsp;=&nbsp;0;&nbsp;y&nbsp;&lt;&nbsp;size.y;&nbsp;y++)&nbsp;{<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;x&nbsp;=&nbsp;0;&nbsp;x&nbsp;&lt;&nbsp;size.x;&nbsp;x++)&nbsp;{<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;pixel&nbsp;=&nbsp;image.getImageData().getPixel(x,&nbsp;y);<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pixel&nbsp;!=&nbsp;0xffffff00)&nbsp;{<br />
<span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; "><br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #339966; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #339966; ">// 这里对像素值的判断依赖于gc的前景色和背景色设置，通过判断则可以对字符上的每一个像素进行操作，生成点阵坐标序列(x, y)</span><br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp; &nbsp; &nbsp;}<br />
<span style="color: #008080; ">14&nbsp;</span>}<br />
<span style="color: #008080; ">15</span>&nbsp;<br />
<font color="#008080">16</font>&nbsp;gc.dispose();<br />
<font color="#008080">17</font>&nbsp;image.dispose();</div>
<br />
当然这里可以一次性获得一个String的点阵矩阵，那么需要事先准备多大的image呢？<br />
<br />
在SWT中可以使用gc.stringExtent(String...)来获取，代码如下：<font color="#008080" size="2"><br />
</font>
<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"><span style="color: #008080; ">1</span>&nbsp;GC&nbsp;gc&nbsp;=&nbsp;<span style="color: #0000ff; ">new</span>&nbsp;GC(Display.getDefault());&nbsp;<br />
<span style="color: #008080; ">2</span>&nbsp;gc.setFont(font);<br />
<span style="color: #008080; ">3</span>&nbsp;Point&nbsp;size&nbsp;=&nbsp;gc.stringExtent(ch.toString());&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;获得了gc实际绘制区域的大小</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #008000; "></span>gc.dispose();</div><img src ="http://www.blogjava.net/feenn/aggbug/370140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2012-02-16 19:52 <a href="http://www.blogjava.net/feenn/archive/2012/02/16/370140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wxWidgets整合OpenGL+OpenCV+MathPlot(一种Windows和Linux通用的方法)</title><link>http://www.blogjava.net/feenn/archive/2011/01/16/343045.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Sun, 16 Jan 2011 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2011/01/16/343045.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/343045.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2011/01/16/343045.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/343045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/343045.html</trackback:ping><description><![CDATA[<div><strong>写在前面</strong>：其实本不应该发在Java方面的，只是最近在做的项目因为实时应用的关系没有使用Java，因此借这里记录一下心得。</div>
<div>最近在一个在Linux下开放的项目中用到了wxWidgets，当时在GTK+、QT和wx之间选择了很久，最终确定选择wxWidgets。有关这个框架的详细信息，请自行google之。</div>
<h1>1．<span class="Apple-tab-span" style="white-space: pre; "> </span>整合OpenGL</h1>
<div>WxWidgets中整合OpenGL是十分简单的，因为wxWidgets本身对OpenGL进行了封装，因此只需要按照example中的例子进行编写即可。一种常见的方法是继承wxGLCanvas类，将EVT_PAINT的回调函数进行重载即可。一段示例代码如下：</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #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; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;attriblist[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;WX_GL_RGBA,&nbsp;WX_GL_MIN_RED,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;WX_GL_MIN_GREEN,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;WX_GL_MIN_BLUE,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;WX_GL_DEPTH_SIZE,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;WX_GL_DOUBLEBUFFER,&nbsp;None<br />
};<br />
<br />
BEGIN_EVENT_TABLE(UIOpenGLCanvas,&nbsp;wxGLCanvas)<br />
&nbsp;&nbsp;&nbsp;&nbsp;EVT_SIZE(UIOpenGLCanvas::OnSize)<br />
&nbsp;&nbsp;&nbsp;&nbsp;EVT_PAINT(UIOpenGLCanvas::OnPaint)<br />
&nbsp;&nbsp;&nbsp;&nbsp;EVT_MOUSE_EVENTS(UIOpenGLCanvas::OnMouseEvent)<br />
END_EVENT_TABLE()<br />
<br />
UIOpenGLCanvas::UIOpenGLCanvas(wxWindow&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">parent,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;wxString&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">caption)<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;:wxGLCanvas(parent,&nbsp;wxID_ANY,&nbsp;attriblist,&nbsp;wxDefaultPosition,&nbsp;wxDefaultSize,&nbsp;wxFULL_REPAINT_ON_RESIZE,&nbsp;wxT("GLCanvas"),&nbsp;wxNullPalette)<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;:wxGLCanvas(parent,&nbsp;wxID_ANY,&nbsp;wxDefaultPosition,&nbsp;wxDefaultSize,&nbsp;wxFULL_REPAINT_ON_RESIZE,&nbsp;wxT("GLCanvas"))</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;:wxGLCanvas(parent,&nbsp;wxID_ANY,&nbsp;wxDefaultPosition,&nbsp;wxDefaultSize,&nbsp;wxFULL_REPAINT_ON_RESIZE,&nbsp;wxT(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GLCanvas</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;attriblist,&nbsp;wxNullPalette)<br />
&nbsp;&nbsp;&nbsp;&nbsp;,m_caption(caption),&nbsp;count(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{&nbsp;wxString((wxTheApp</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">argv)[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]).char_str()&nbsp;};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;NOTE:&nbsp;this&nbsp;example&nbsp;uses&nbsp;GLUT&nbsp;in&nbsp;order&nbsp;to&nbsp;have&nbsp;a&nbsp;free&nbsp;teapot&nbsp;model<br />
&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;display,&nbsp;to&nbsp;show&nbsp;3D&nbsp;capabilities.&nbsp;GLUT,&nbsp;however,&nbsp;seems&nbsp;to&nbsp;cause&nbsp;problems<br />
&nbsp;&nbsp;&nbsp;&nbsp;on&nbsp;some&nbsp;systems.&nbsp;If&nbsp;you&nbsp;meet&nbsp;problems,&nbsp;first&nbsp;try&nbsp;commenting&nbsp;out&nbsp;glutInit(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;try&nbsp;comeenting&nbsp;out&nbsp;all&nbsp;glut&nbsp;code<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;glutInit(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">argc,&nbsp;argv);<br />
}<br />
<br />
UIOpenGLCanvas::</span><span style="color: #000000; ">~</span><span style="color: #000000; ">UIOpenGLCanvas()&nbsp;{<br />
<br />
}<br />
<br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;UIOpenGLCanvas::OnSize(wxSizeEvent</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;this&nbsp;is&nbsp;also&nbsp;necessary&nbsp;to&nbsp;update&nbsp;the&nbsp;context&nbsp;on&nbsp;some&nbsp;platforms</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;wxGLCanvas::OnSize(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;set&nbsp;GL&nbsp;viewport&nbsp;(not&nbsp;called&nbsp;by&nbsp;wxGLCanvas::OnSize&nbsp;on&nbsp;all&nbsp;platforms<img src="http://www.blogjava.net/Images/dot.gif" alt="" />)</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;w,&nbsp;h;<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetClientSize(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">w,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">h);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(GetContext())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCurrent();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glViewport(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;(GLint)&nbsp;w,&nbsp;(GLint)&nbsp;h);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;UIOpenGLCanvas::OnMouseEvent(wxMouseEvent</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;dragging&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;last_x,&nbsp;last_y;<br />
<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf("%f&nbsp;%f&nbsp;%d\n",&nbsp;event.GetX(),&nbsp;event.GetY(),&nbsp;(int)event.LeftIsDown());</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; ">(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.LeftIsDown())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">dragging)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragging&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&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;yrot&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.GetX()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;last_x)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xrot&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.GetY()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;last_y)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Refresh(</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last_x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.GetX();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last_y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.GetY();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragging&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
<br />
}<br />
<br />
<br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;UIOpenGLCanvas::OnPaint(wxPaintEvent</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;WXUNUSED(</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Render();<br />
}<br />
<br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;UIOpenGLCanvas::Render()&nbsp;{<br />
</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;此处很关键&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;wxPaintDC(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">);<br />
&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; ">GetContext())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetCurrent();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;glClearColor(</span><span style="color: #000000; ">0.0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0.0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0.0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0.0</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;glClear(GL_COLOR_BUFFER_BIT&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;GL_DEPTH_BUFFER_BIT);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;glViewport(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;(GLint)GetSize().x,&nbsp;(GLint)GetSize().y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_POLYGON);<br />
&nbsp;&nbsp;&nbsp;&nbsp;glColor3f(</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0.0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0.0</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;glVertex2f(</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;glVertex2f(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;glVertex2f(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;glVertex2f(</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">0.1</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;glEnd();<br />
<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;using&nbsp;a&nbsp;little&nbsp;of&nbsp;glut</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;glColor4f(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;glutWireTeapot(</span><span style="color: #000000; ">0.4</span><span style="color: #000000; ">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;glPopMatrix();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;glFlush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;SwapBuffers();<br />
}</span></div>
</div>
<h1>2．<span class="Apple-tab-span" style="white-space: pre; "> </span>整合OpenCV</h1>
<div>这个话题在网上有过讨论，在OpenCV中文论坛中提出了一种向HDC绘图的方法。不过这种方法的局限在于：HDC是Windows平台下特有的结构，在Linux下是不可行的。</div>
<div>其实OpenCV的核心是IplImage结构，基本上所有的OpenCV绘图语句以及相应的算法都可以通过这个结构衍生出来。因此，一种直接的想法是如何将IplImage转换为wxWidgets中的wxImage类型，这样就可以直接在wxWidgets绘制IplImage类型的数据了。于是在网上寻找后，在一个国外论坛中找到了现成的代码如下：</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #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; ">void</span><span style="color: #000000; ">&nbsp;copy_and_swap_rb(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">s,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">d,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;size)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Copy&nbsp;image&nbsp;data&nbsp;source&nbsp;s&nbsp;to&nbsp;destination&nbsp;d,&nbsp;swapping&nbsp;R&nbsp;and&nbsp;B&nbsp;channels.<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Assumes&nbsp;8&nbsp;bit&nbsp;depth,&nbsp;3&nbsp;interleaved&nbsp;channels,&nbsp;and&nbsp;width_step&nbsp;=&nbsp;width*3</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;step&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">end&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(s</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">end)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;step;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;step;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;wx2cv(wxImage&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wx,&nbsp;IplImage&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">ipl)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Copy&nbsp;image&nbsp;data&nbsp;from&nbsp;wxWidgets&nbsp;image&nbsp;to&nbsp;Ipl&nbsp;(opencv)&nbsp;image<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Assumes&nbsp;ipl&nbsp;image&nbsp;has&nbsp;seq&nbsp;"GBR",&nbsp;depth&nbsp;8,&nbsp;and&nbsp;3&nbsp;channels,&nbsp;and<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;has&nbsp;the&nbsp;same&nbsp;size&nbsp;as&nbsp;the&nbsp;wxImage,&nbsp;and&nbsp;width_step&nbsp;=&nbsp;width*3.</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;copy_and_swap_rb((</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)wx.GetData(),&nbsp;ipl</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">imageData,&nbsp;ipl</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">imageSize);<br />
}<br />
<br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;cv2wx(IplImage&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">ipl,&nbsp;wxImage&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wx&nbsp;)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Copy&nbsp;image&nbsp;data&nbsp;from&nbsp;Ipl&nbsp;(opencv)&nbsp;image&nbsp;to&nbsp;wxImage<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Assumes&nbsp;ipl&nbsp;image&nbsp;has&nbsp;seq&nbsp;"GBR",&nbsp;depth&nbsp;8,&nbsp;and&nbsp;3&nbsp;channels,&nbsp;and<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;has&nbsp;the&nbsp;same&nbsp;size&nbsp;as&nbsp;the&nbsp;wxImage,&nbsp;and&nbsp;width_step&nbsp;=&nbsp;width*3.</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;copy_and_swap_rb(&nbsp;ipl</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">imageData,&nbsp;(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)wx.GetData(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.GetWidth()</span><span style="color: #000000; ">*</span><span style="color: #000000; ">wx.GetHeight()</span><span style="color: #000000; ">*</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);<br />
}<br />
<br />
IplImage&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">cv_from_wx(wxImage&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">wx)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Return&nbsp;a&nbsp;new&nbsp;IplImage&nbsp;copied&nbsp;from&nbsp;a&nbsp;wxImage.<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Must&nbsp;be&nbsp;freed&nbsp;by&nbsp;user&nbsp;with&nbsp;cvReleaseImage().</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;IplImage&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;cvCreateImage(cvSize(wx.GetWidth(),&nbsp;wx.GetHeight()),<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;IPL_DEPTH_8U,&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;wx2cv(wx,&nbsp;ret);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;ret;<br />
}<br />
<br />
wxImage&nbsp;wx_from_cv(&nbsp;IplImage&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">cx)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Return&nbsp;new&nbsp;wxImage&nbsp;copied&nbsp;from&nbsp;a&nbsp;compatible&nbsp;IplImage.<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Assumes&nbsp;ipl&nbsp;image&nbsp;has&nbsp;seq&nbsp;"GBR",&nbsp;depth&nbsp;8,&nbsp;and&nbsp;3&nbsp;channels<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Fear&nbsp;not.&nbsp;The&nbsp;copy&nbsp;on&nbsp;return&nbsp;is&nbsp;cheap;&nbsp;does&nbsp;not&nbsp;deep-copy&nbsp;the&nbsp;data.</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;wxImage&nbsp;wx(cx</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">width,&nbsp;cx</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">height,&nbsp;(unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)&nbsp;malloc(cx</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">imageSize),&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cv2wx(cx,&nbsp;wx);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;wx;<br />
}<br />
</span></div>
</div>
<div>进行这样的转换后，我们就直接可以在wxWidgets中使用OpenCV的接口。</div>
<h1>3．<span class="Apple-tab-span" style="white-space: pre; "> </span>整合MathPlot</h1>
<div>MathPlot是sourceforge上的一个开源项目，其功能是使用wxWidgets提供的绘图方法构建操作DC绘图的高级接口。这个项目的源代码十分简单，只有两个文件，但是功能却很实用。我在sourceforge上给了好评。</div>
<div>MathPlot内部实现了坐标轴的拖拽、平移和缩放，将图形划分为Layer，并且引入了动态Layer的概念，即在这个Layer上绘制的图形可以通过重设局部坐标系的原点基准坐标实现移动，并绘制轨迹。而且，MathPlot内部实现了双缓冲，因此，这个框架对于需要实时显示轨迹的简单应用来说具有很好使用价值。</div>
<div>由于MathPlot直接使用了wxWidgets的绘图接口，因此其整合十分简单，只需要在需要绘制的Panel上使用MathPlot提供的接口即可实现整合。</div>
<div><br />
</div>
<div>以上简单说明了wxWidgets如何整合OpenGL、OpenCV和MathPlot三种不同的绘图框架，最后给一个将三种绘图方法用在同一个窗口中实现不同功能的实例：</div>
<div><img src="http://www.blogjava.net/images/blogjava_net/feenn/a.gif" width="400" height="444" align="center" alt="整合示例" /><br />
</div>
<img src ="http://www.blogjava.net/feenn/aggbug/343045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2011-01-16 11:03 <a href="http://www.blogjava.net/feenn/archive/2011/01/16/343045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javadoc的chm制作</title><link>http://www.blogjava.net/feenn/archive/2010/01/12/309148.html</link><dc:creator>Feenn</dc:creator><author>Feenn</author><pubDate>Tue, 12 Jan 2010 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/feenn/archive/2010/01/12/309148.html</guid><wfw:comment>http://www.blogjava.net/feenn/comments/309148.html</wfw:comment><comments>http://www.blogjava.net/feenn/archive/2010/01/12/309148.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/feenn/comments/commentRss/309148.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/feenn/services/trackbacks/309148.html</trackback:ping><description><![CDATA[<p>
最近看到<a href="http://www.blogjava.net/lishunli/archive/2010/01/07/308618.html">一篇文章</a>，其中讲述了各种Javadoc生成chm的方法及工具。</p>
<p>
其实我一直以来都是使用自己写的一个工具来生成的，不过这个工具只是生成了.hhp、.hhc和.hhk文件，最后还需要使用FAR进行简单的编辑和压缩。不过我的工具可以配置并识别目录中包含多个API目录的情况，并能够将非API的部分生成TOC文件(之所以要使用FAR进行简单的编辑，也是因为非API的TOC部分需要根据情况自己修改或增减)。</p>
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/feenn/eclipse_3.5_chm.png" align="center" height="447" width="770" /><br />
<br />
上图是我是用这个工具生成的Eclipse 3.5的chm文档。<br />
<br />
其实这个过程很简单，我们只需要构造自己的文档解析器，并按照hhp、hhc和hhk格式规范生成相应的文件就行了。其中文档解析器我使用了Java的正则表达式来解析，其解析式的核心如下：<br />
<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: #008080;">1</span>&nbsp;<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;">final</span><span style="color: #000000;">&nbsp;String&nbsp;_INDEX_PATTERN&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;DT&gt;&lt;A&nbsp;HREF=\</span><span style="color: #000000;">"</span><span style="color: #000000;">([\\p{Graph}</span><span style="color: #000000;">|</span><span style="color: #000000;">\\p{Blank}]</span><span style="color: #000000;">*?</span><span style="color: #000000;">)\</span><span style="color: #000000;">"</span><span style="color: #000000;">(\\p{Space}\\p{Alpha}+?=\</span><span style="color: #000000;">"</span><span style="color: #000000;">.</span><span style="color: #000000;">*?</span><span style="color: #000000;">\</span><span style="color: #000000;">"</span><span style="color: #000000;">)?+&gt;&lt;B&gt;(.*?)&lt;/B&gt;&lt;/A&gt;(.*?)\\p{Space}-</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">2</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;">final</span><span style="color: #000000;">&nbsp;String&nbsp;_CONTEXT_PATTERN&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;TD&gt;&lt;CODE&gt;&lt;B&gt;&lt;A&nbsp;HREF=\</span><span style="color: #000000;">"</span><span style="color: #000000;">((\\p{Graph}</span><span style="color: #000000;">*?</span><span style="color: #000000;">)#(\\p{Graph}</span><span style="color: #000000;">*?</span><span style="color: #000000;">))\</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;(.*?)&lt;/A&gt;&lt;/B&gt;(.*?)&lt;/CODE&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;<br />
</span><span style="color: #008080;">3</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;">final</span><span style="color: #000000;">&nbsp;String&nbsp;_TITLE_PATTERN&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;title&gt;(.*?)&lt;/title&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span></div>
<br />
其中第一行是索引文件条目的表达式，这里我是使用了index-files来生成索引的，当然在没有index-files的时候是使用TOC解析出来的条目构建。<br />
第二行是TOC条目的表达式，第三行是提取文件title时使用的表达式。<br />
当然这里表达式是有缺陷的，比如不能解析不严格的HTML标签等等，不过对于我自己而言已经足够应付绝大多数Javadoc了。<br />
<br />
<br />
<img src ="http://www.blogjava.net/feenn/aggbug/309148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/feenn/" target="_blank">Feenn</a> 2010-01-12 14:22 <a href="http://www.blogjava.net/feenn/archive/2010/01/12/309148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>