﻿<?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-季浩的Blog-随笔分类-J2SE</title><link>http://www.blogjava.net/jht/category/18831.html</link><description>努力</description><language>zh-cn</language><lastBuildDate>Wed, 02 Apr 2008 14:28:55 GMT</lastBuildDate><pubDate>Wed, 02 Apr 2008 14:28:55 GMT</pubDate><ttl>60</ttl><item><title>使用Eclipse做Java开发时，JDK1.6居然也不认识enum？</title><link>http://www.blogjava.net/jht/archive/2008/04/02/190453.html</link><dc:creator>jht</dc:creator><author>jht</author><pubDate>Wed, 02 Apr 2008 12:56:00 GMT</pubDate><guid>http://www.blogjava.net/jht/archive/2008/04/02/190453.html</guid><wfw:comment>http://www.blogjava.net/jht/comments/190453.html</wfw:comment><comments>http://www.blogjava.net/jht/archive/2008/04/02/190453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jht/comments/commentRss/190453.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jht/services/trackbacks/190453.html</trackback:ping><description><![CDATA[如题，有人真的遇到过这个问题，开始被问到的时候还真觉得奇怪，心想不会啊，从JDK5开始就支持这个枚举类型了啊，为什么呢？<br /><br />开始还怀疑他的JDK版本太低导致的，但是一看是JDK1.6的，迷惑了几秒。。。<br /><br />然后我打开了Eclipse的Java编译选项，<strong><font style="BACKGROUND-COLOR: #ffffff" color="#000080">发现原来遇到这个问题的人的Java编译级别设置的是1.4</font></strong>，如下图，当然就会出问题了。<br /><br /><img height="566" alt="compile_setting.png" src="http://www.blogjava.net/images/blogjava_net/jht/compile_setting.png" width="563" border="0" /><br /><br />呵呵，虽然，这是个小问题，但是如果遇到了还真够新手郁闷一阵的。<br /><img src ="http://www.blogjava.net/jht/aggbug/190453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jht/" target="_blank">jht</a> 2008-04-02 20:56 <a href="http://www.blogjava.net/jht/archive/2008/04/02/190453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]用Swing编写反应灵敏的图形用户界面 </title><link>http://www.blogjava.net/jht/archive/2008/03/13/186115.html</link><dc:creator>jht</dc:creator><author>jht</author><pubDate>Thu, 13 Mar 2008 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/jht/archive/2008/03/13/186115.html</guid><wfw:comment>http://www.blogjava.net/jht/comments/186115.html</wfw:comment><comments>http://www.blogjava.net/jht/archive/2008/03/13/186115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jht/comments/commentRss/186115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jht/services/trackbacks/186115.html</trackback:ping><description><![CDATA[<p>
				<b>作者简介</b>
		</p>
		<p class="normal">徐皓，北京航空航天大学计算机系本科生，你可以通过<a href="mailto:ertri@163.com"><font color="#3d7db3">ertri@163.com</font></a>与他联系。</p>
		<p>
				<b>正文</b>
		</p>
		<p class="normal">不灵敏的图形用户界面会降低应用程序的可用性。当以下现象出现的时候，我们通常说这个用户界面反应不灵敏。</p>
		<ol>
				<li>不响应事件的现象； 
</li>
				<li>没有更新的现象</li>
		</ol>[@more@] 
<p class="normal">这些现象在很大程度上与事件的处理方法相关，而在编写Swing应用程序的时候，我们几乎必然要编写方法去响应鼠标点击按钮，键盘回车等事件。在这些方法中我们要编写一些代码，在运行时去触发一些动作。常见动作包括查找，更新数据库等。在这篇文章中通过对一个实例的分析，介绍了一些基本概念，常见的错误以及提出了一个解决方案。</p><p><b>event-dispatching thread</b></p><p class="normal">我们一定要记住，事件响应方法的代码都是在event-dispatching thread中执行的，除非你启用另一个线程。</p><p class="normal">那么，什么是event-dispatching thread呢？在《Java Tutorial》[1]中，作者给出了一条单一线程规则：一旦一个Swing组件被实现（realized），所有的有可能影响或依赖于这个组件的状态的代码都应该在event-dispatching thread中被执行。而实现一个组件有两种方式：</p><ol><li>对顶层组件调用show(), pack(), 或者setVisible(true)； 
</li><li>将一个组件加到一个已经被实现的容器中。 </li></ol><p class="normal">单一线程规则的根源是由于Swing组件库的大部分方法是对多线程不安全的，尽管存在一些例外。这些例外的情况可以在《Java Tutorial》[1]的相关章节找到，这里不再展开。</p><p class="normal">为了支持单一线程模型，Swing组件库提供了一个专门来完成这些与Swing组件相关的操作的线程，而这一线程就是event-dispatching thread。我们的事件响应方法通常都是由这一线程调用的，除非你自己编写代码来调用这些事件响应方法。在这里初学者经常犯的一个错误就是在事件响应方法中完成过多的与修改组件没有直接联系的代码。其最有可能的效果就是导致组件反应缓慢。比如以下响应按钮事件的代码：</p><pre>String str = null;<br />this.textArea.setText("Please wait...");<br />try {<br />    //do something that is really time consuming<br />    str = "Hello, world!";<br />    Thread.sleep(1000L);<br />} catch (InterruptedException e) {<br />    e.printStackTrace();<br />}<br />this.textArea.setText(str);       <br /></pre><p class="normal">执行之后的效果就是按钮似乎定住了一段时间，直到Done.出现之后才弹起来。原因就是Swing组件的更新和事件的响应都是在event-dispatching thread中完成的，而事件响应的时候，event-dispatching thread被事件响应方法占据，所以组件不会被更新。而直到事件响应方法退出时才有可能去更新Swing组件。</p><p class="normal">为了解决这个问题，有人也许会试图通过调用repaint()方法来更新组件：</p><pre>final String[] str = new String[1];<br />this.jTextArea1.setText("Please wait...");<br />this.repaint();<br /><br />try {<br />    Thread.sleep(1000L);<br />}catch(InterruptedException e) {<br />    e.printStackTrace();<br />}<br />str[0] = "Done.";<br /><br />jTextArea1.setText(str[0]);<br /></pre><p class="normal">但是这一个方法没有起到预期的作用，按钮仍然定住一段时间，在察看了repaint()方法的源代码之后就知道原因了。</p><pre>PaintEvent e = new PaintEvent(this, PaintEvent.UPDATE,<br />    new Rectangle(x, y, width, height));<br />Toolkit.getEventQueue().postEvent(e);              <br /></pre><p class="normal">repaint()方法实际上是在事件队列里加了一个UPDATE的事件，而没有直接去重画组件，而且这一个事件只能等待当前的事件响应方法结束之后才能被分配。因此只有绕过分配机制直接调用paint方法才能达到目的。</p><pre>final String[] str = new String[1];<br />this.jTextArea1.setText("Please wait...");<br />this.paint(this.getGraphics());<br /><br />try {<br />    Thread.sleep(1000L);<br />}catch(InterruptedException e) {<br />    e.printStackTrace();<br />}<br />str[0] = "Done.";<br /><br />jTextArea1.setText(str[0]);<br /></pre><p class="normal">这样却是实现了更新，但是还存在着以下的问题。虽然从感觉上，按钮已经弹起来了，但是在Done.出现之前，我们却无法按下这个按钮。可以说按钮还是定住了，只不过定在了弹起的状态。调用重绘方法无法从根本上解决问题，因此我们需要寻求其他的方法。</p><p><b>使用多线程</b></p><p class="normal">有效的解决方法是使用多线程。首先看一看一个更好的解决方案，这一方案是在参考《Rethinking Swing Threading》[3]的一个程序片段完成的：</p><pre>final String[] str = new String[1];<br />this.jTextArea1.setText("Please wait...");<br />this.repaint();<br /><br />new Thread() {<br />    public void run() {<br />        try {<br />            Thread.sleep(1000L);<br />        }catch(InterruptedException e) {<br />            e.printStackTrace();<br />        }<br />        str[0] = "Done.";<br />        javax.swing.SwingUtilities.invokeLater(new Runnable() {<br />            public void run() {<br />                jTextArea1.setText(str[0]);<br />             }<br />        });<br />    }<br />}.start();<br /></pre><p class="normal">在这个程序中，要花费大量时间的操作被放到另一个线程当中，从而使事件响应方法能快速返回，event-dispatching thread就可以更新UI和响应其它事件了。注意到这个程序使用了invokeLater()方法。invokeLater()方法的作用是让event-dispatching thread去运行制定的代码。当然也可以不使用invokeLater()方法，但是这样就违背了单一线程原则，同时带来了一定程度的相对多线程的不安全性。到现在，解决方案似乎是完美的了，但是我们看一看在原来的程序添加下面的代码，尽管我们通常不这样做。</p><pre>public void paint(java.awt.Graphics g) {<br />    super.paint(g);<br />    g.drawRect(1, 1, 100, 100);<br />}<br /></pre><p class="normal">我们会发现以前画的矩形被覆盖了一部分，原因是由于我们没用重画这一个矩形，因此在结尾加上对repaint()方法的调用。</p><pre>final String[] str = new String[1];<br />this.jTextArea1.setText("Please wait...");<br />this.repaint();<br /><br />new Thread() {<br />    public void run() {<br />        try {<br />            Thread.sleep(1000L);<br />        }catch(InterruptedException e) {<br />            e.printStackTrace();<br />        }<br />        str[0] = "Done.";<br />        javax.swing.SwingUtilities.invokeLater(new Runnable() {<br />            public void run() {<br />                jTextArea1.setText(str[0]);<br />                repaint();<br />             }<br />        });<br />    }<br />}.start();<br /></pre><p class="normal">如果你认为这段代码过于缺乏可读性，通过在《Java Tutorial》[1]里面介绍的SwingWorker来简化编程的方法。可以通过实现一个construct()方法来实现花费大量时间的操作和重写finished()方法来完成组件更新的工作。</p><pre>this.jTextArea1.setText("Please wait...");<br /><br />final SwingWorker worker = new SwingWorker() {<br />    public Object construct() {<br />        try {<br />            Thread.sleep(1000L);<br />        }catch(InterruptedException e) {<br />            e.printStackTrace();<br />        }<br />        return "Done.";<br />    }<br />    public void finished() {<br />        jTextArea1.setText(getValue().toString());<br />        repaint();<br />    }<br />};<br />worker.start();<br /></pre><p class="normal">在《Rethinking Swing Threading》[3]，作者将以上的编程方式称为同步方式。另外作者提出了一个通过消息机制来实现相同功能的更清晰，但是需要编写更多代码的"异步"的方法。</p><p><b>结论</b></p><p class="normal">总之，我们在编写使用Swing组件的程序是要记住以下几点：</p><p class="normal">1、不要过多地占用event-dispatching thread；</p><p class="normal">2、与更新组件相关的代码要使用event-dispatching thread去执行；</p><p class="normal">3、要更新组件。</p><p class="normal">编写反应灵敏的图形用户界面还需要考虑很多问题，以上只是最基本的一部分。欢迎有兴趣的读者来信进行讨论。</p><img src ="http://www.blogjava.net/jht/aggbug/186115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jht/" target="_blank">jht</a> 2008-03-13 17:53 <a href="http://www.blogjava.net/jht/archive/2008/03/13/186115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[翻译]Java RMI指南</title><link>http://www.blogjava.net/jht/archive/2007/05/09/116216.html</link><dc:creator>jht</dc:creator><author>jht</author><pubDate>Wed, 09 May 2007 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/jht/archive/2007/05/09/116216.html</guid><wfw:comment>http://www.blogjava.net/jht/comments/116216.html</wfw:comment><comments>http://www.blogjava.net/jht/archive/2007/05/09/116216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jht/comments/commentRss/116216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jht/services/trackbacks/116216.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文地址:  http://java.sun.com/docs/books/tutorial/rmi/index.html 译者:jht 欢迎大家对翻译中存在的问题批判指正,谢谢大家!从Word粘帖过来之后格式有点问题,所以把word文档传上来了,点击下载						RMI																				 																		...&nbsp;&nbsp;<a href='http://www.blogjava.net/jht/archive/2007/05/09/116216.html'>阅读全文</a><img src ="http://www.blogjava.net/jht/aggbug/116216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jht/" target="_blank">jht</a> 2007-05-09 16:59 <a href="http://www.blogjava.net/jht/archive/2007/05/09/116216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用WebService 和RMI远程协作</title><link>http://www.blogjava.net/jht/archive/2007/03/31/107687.html</link><dc:creator>jht</dc:creator><author>jht</author><pubDate>Sat, 31 Mar 2007 13:27:00 GMT</pubDate><guid>http://www.blogjava.net/jht/archive/2007/03/31/107687.html</guid><wfw:comment>http://www.blogjava.net/jht/comments/107687.html</wfw:comment><comments>http://www.blogjava.net/jht/archive/2007/03/31/107687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jht/comments/commentRss/107687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jht/services/trackbacks/107687.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、一些概念								    WebService技术现在几乎无处不在，以前玩.NET的时候最开始接触这个概念，C#语言对WebService近似原生性的支持使我们用C#可以非常迅速的开发出一个WebService，没有任何复杂烦扰的步骤。    后来没有机会再在.Net Framework上面开发，转投了Java的怀抱，想要开发出一个WebService感觉比较，搞一堆命令生成一堆...&nbsp;&nbsp;<a href='http://www.blogjava.net/jht/archive/2007/03/31/107687.html'>阅读全文</a><img src ="http://www.blogjava.net/jht/aggbug/107687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jht/" target="_blank">jht</a> 2007-03-31 21:27 <a href="http://www.blogjava.net/jht/archive/2007/03/31/107687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyScreenSnap 一个简单的截图程序</title><link>http://www.blogjava.net/jht/archive/2007/03/29/107311.html</link><dc:creator>jht</dc:creator><author>jht</author><pubDate>Thu, 29 Mar 2007 11:19:00 GMT</pubDate><guid>http://www.blogjava.net/jht/archive/2007/03/29/107311.html</guid><wfw:comment>http://www.blogjava.net/jht/comments/107311.html</wfw:comment><comments>http://www.blogjava.net/jht/archive/2007/03/29/107311.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jht/comments/commentRss/107311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jht/services/trackbacks/107311.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天稍微花了点时间实现了一个java的屏幕截图程序，功能简单，支持全屏截图和选择截图用JSmooth做了个.exe程序，直接运行就可以了，附：程序下载 http://www.blogjava.net/Files/jht/MyScreenSnap.zipJRE1.4版本的可执行程序 http://www.blogjava.net/Files/jht/MyScreenSnap_jre1.4.zip关键...&nbsp;&nbsp;<a href='http://www.blogjava.net/jht/archive/2007/03/29/107311.html'>阅读全文</a><img src ="http://www.blogjava.net/jht/aggbug/107311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jht/" target="_blank">jht</a> 2007-03-29 19:19 <a href="http://www.blogjava.net/jht/archive/2007/03/29/107311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SwingHack1-创建使用图像主题的组件</title><link>http://www.blogjava.net/jht/archive/2007/03/28/107093.html</link><dc:creator>jht</dc:creator><author>jht</author><pubDate>Wed, 28 Mar 2007 15:57:00 GMT</pubDate><guid>http://www.blogjava.net/jht/archive/2007/03/28/107093.html</guid><wfw:comment>http://www.blogjava.net/jht/comments/107093.html</wfw:comment><comments>http://www.blogjava.net/jht/archive/2007/03/28/107093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jht/comments/commentRss/107093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jht/services/trackbacks/107093.html</trackback:ping><description><![CDATA[这个技巧比较Cool也比较基础常用，关键技术是使用图像重新绘制组件<br />看下面demo的代码<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.awt.Insets;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.swing.ImageIcon;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.swing.JButton;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_124_448_Open_Image" onclick="this.style.display='none'; Codehighlighter1_124_448_Open_Text.style.display='none'; Codehighlighter1_124_448_Closed_Image.style.display='inline'; Codehighlighter1_124_448_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_124_448_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_124_448_Closed_Text.style.display='none'; Codehighlighter1_124_448_Open_Image.style.display='inline'; Codehighlighter1_124_448_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ImageButton </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> JButton </span><span id="Codehighlighter1_124_448_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_124_448_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> serialVersionUID </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">7760427126786950870L</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_232_446_Open_Image" onclick="this.style.display='none'; Codehighlighter1_232_446_Open_Text.style.display='none'; Codehighlighter1_232_446_Closed_Image.style.display='inline'; Codehighlighter1_232_446_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_232_446_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_232_446_Closed_Text.style.display='none'; Codehighlighter1_232_446_Open_Image.style.display='inline'; Codehighlighter1_232_446_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ImageButton(ImageIcon icon) </span><span id="Codehighlighter1_232_446_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_232_446_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        setSize(icon.getImage().getWidth(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">),icon.getImage().getHeight(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        setIcon(icon);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        setMargin(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Insets(</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">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        setIconTextGap(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        setBorderPainted(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        setBorder(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        setText(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p><br />稍微要解释一下的是讲button的边框都设置成为0，还有边框的重绘设置false，我们可以用不同的贴图表示按钮被选中等的状态<br /><br />使用这个组件的demoCode</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">        ImageButton button </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ImageButton(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">images/*.png</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        button.setPressedIcon(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ImageIcon(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">images/*.png</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        button.setRolloverIcon(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ImageIcon(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">images/*.png</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        button.setSelectedIcon(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ImageIcon(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">images/*.png</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        button.setRolloverSelectedIcon(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ImageIcon(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">images/*.png</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        button.setDisabledIcon(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ImageIcon(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">images/*.png</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        button.setDisabledSelectedIcon(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ImageIcon(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">images/*.png</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));</span></div><br />这个Hack要显示效果好，关键就在于贴图了，可见美工很重要。<br /><br />我准备每天Hack一篇<br /><br />更多内容，可以看Swing Hacks<br /><br /><br />参考资料：<br /> "<span class="docEmphasis">Swing Hacks</span> by Joshua Marinacci and Chris Adamson. Copyright 2005 O'Reilly Media, Inc., 0-596-00907-0."<img src ="http://www.blogjava.net/jht/aggbug/107093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jht/" target="_blank">jht</a> 2007-03-28 23:57 <a href="http://www.blogjava.net/jht/archive/2007/03/28/107093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tip: About a frame without title bar</title><link>http://www.blogjava.net/jht/archive/2007/03/28/106932.html</link><dc:creator>jht</dc:creator><author>jht</author><pubDate>Wed, 28 Mar 2007 05:24:00 GMT</pubDate><guid>http://www.blogjava.net/jht/archive/2007/03/28/106932.html</guid><wfw:comment>http://www.blogjava.net/jht/comments/106932.html</wfw:comment><comments>http://www.blogjava.net/jht/archive/2007/03/28/106932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jht/comments/commentRss/106932.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jht/services/trackbacks/106932.html</trackback:ping><description><![CDATA[It's easy to create a frame without title bar.Just use this method setUndecorated(true)<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">JFrame frame </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> JFrame();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />frame.setUndecorated(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />frame.setSize(</span><span style="COLOR: #000000">500</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />frame.show();</span></div><img src ="http://www.blogjava.net/jht/aggbug/106932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jht/" target="_blank">jht</a> 2007-03-28 13:24 <a href="http://www.blogjava.net/jht/archive/2007/03/28/106932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>study.jni的简单尝试(Java 调用 C++)</title><link>http://www.blogjava.net/jht/archive/2007/01/16/94214.html</link><dc:creator>jht</dc:creator><author>jht</author><pubDate>Tue, 16 Jan 2007 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/jht/archive/2007/01/16/94214.html</guid><wfw:comment>http://www.blogjava.net/jht/comments/94214.html</wfw:comment><comments>http://www.blogjava.net/jht/archive/2007/01/16/94214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jht/comments/commentRss/94214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jht/services/trackbacks/94214.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">Step1<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：创建带有</span>Native<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法描述的</span>ProcessHandler.java<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件</span></p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">Step2<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span>javac <span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译该文件，生成</span>ProcessHandler.class<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件</span></p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">Step3<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span>javah ProcessHandler.class <span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成</span>pkg_ProcessHandler.h Native<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法头文件，注意包名字为</span>pkg<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，所以生成的方法以</span>pkg_<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开头</span></p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">Step4<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：使用</span>Eclipse<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">建立</span><b>Managed Make C++ Project</b><span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在第二步选择</span><b>Shared Library</b><span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，然后把刚刚生成和的</span>pkg_ProcessHandler.h <span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加入工程</span></p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">Step5<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：实现</span>Native<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，从头文件里面</span>Copy<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">出这个方法，完成具体实现，编译工程，生成</span>dll</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">Step6<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：完成后</span>Jni<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用，注意</span>dll<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">库需要在系统</span>Path<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里，否则会出现</span><span style="FONT-SIZE: 10.5pt">java.lang.UnsatisfiedLinkError: no *** in java.library.path<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 10.5pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 10.5pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除了上面的路径问题，还有可能不能成功调用该</span>
				<span style="FONT-SIZE: 10.5pt">dll</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，原因上</span>
				<span style="FONT-SIZE: 10.5pt">g++/gcc</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译出来的东西和</span>
				<span style="FONT-SIZE: 10.5pt">java</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">预期的不匹配，详细描述参考</span>
				<span style="FONT-SIZE: 10.5pt">
						<a href="/lixf/archive/2005/12/23/25177.html">http://www.blogjava.net/lixf/archive/2005/12/23/25177.html</a>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">〔</span>
				<span style="FONT-SIZE: 10.5pt">win32</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下使用</span>
				<span style="FONT-SIZE: 10.5pt">gcc</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译供</span>
				<span style="FONT-SIZE: 10.5pt">java </span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用的</span>
				<span style="FONT-SIZE: 10.5pt">dll</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">须知</span>
				<span style="FONT-SIZE: 10.5pt">(jni)</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt">
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我也是遇到问题</span>
				<span style="FONT-SIZE: 10.5pt">Google</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到这篇文章的，</span>
				<span style="FONT-SIZE: 10.5pt">Solution</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然也在该文章里面</span>
				<span style="FONT-SIZE: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 10.5pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参考资料：</span>
				<span style="FONT-SIZE: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 10.5pt">
						<a href="/zuroc/archive/2005/04/07/2908.html">
								<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例解</span> VC++ 6.0 <span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现</span> JNI</a>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（非烂文）</span>
				<span style="FONT-SIZE: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p><img src ="http://www.blogjava.net/jht/aggbug/94214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jht/" target="_blank">jht</a> 2007-01-16 15:33 <a href="http://www.blogjava.net/jht/archive/2007/01/16/94214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>支持通配符的多线程文件下载</title><link>http://www.blogjava.net/jht/archive/2006/12/31/91183.html</link><dc:creator>jht</dc:creator><author>jht</author><pubDate>Sun, 31 Dec 2006 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/jht/archive/2006/12/31/91183.html</guid><wfw:comment>http://www.blogjava.net/jht/comments/91183.html</wfw:comment><comments>http://www.blogjava.net/jht/archive/2006/12/31/91183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jht/comments/commentRss/91183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jht/services/trackbacks/91183.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用各种网络下载工具下文件的时候，大多数下载软件支持添加批量下载任务的功能，闲暇之余coding了一个简单的程序，实现批量下载．分了三个类RegFiles.java主要实现通配符文件地址的构造,提供了一些辅助方法,方便的添加需要下载的URLURLFileSaver.java 实现将URL指向的文件保存到本地的功能FileDownLoader.java 创建多个线程下载大家看ｃｏｄｅ，欢迎提出重构意见...&nbsp;&nbsp;<a href='http://www.blogjava.net/jht/archive/2006/12/31/91183.html'>阅读全文</a><img src ="http://www.blogjava.net/jht/aggbug/91183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jht/" target="_blank">jht</a> 2006-12-31 15:58 <a href="http://www.blogjava.net/jht/archive/2006/12/31/91183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>