<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MoDoFo.println(" &#187; Swing</title>
	<atom:link href="http://zhangv.com/archives/tag/swing/feed" rel="self" type="application/rss+xml" />
	<link>http://zhangv.com</link>
	<description>Life for Idea - forever young</description>
	<lastBuildDate>Sat, 07 Apr 2012 04:08:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>swing多线程编程归纳</title>
		<link>http://zhangv.com/archives/1196</link>
		<comments>http://zhangv.com/archives/1196#comments</comments>
		<pubDate>Tue, 11 Aug 2009 15:27:59 +0000</pubDate>
		<dc:creator>zhangv</dc:creator>
				<category><![CDATA[技术(Tech)]]></category>
		<category><![CDATA[Swing]]></category>
		<category><![CDATA[多线程]]></category>

		<guid isPermaLink="false">http://zhangv.com/archives/1196</guid>
		<description><![CDATA[Swing本身的界面绘制单线程的。也就是只有一个事件分派线程负责处理事件处理方法，保证了Swing本身的线程安全。但是如果存在一个很复杂耗时的任务，这样的处理方法就会造成界面的无响应甚至crash。所以Swing提供了SwingUtilities类的两个方法：invokeLater/invokeAndWait。invokeLater:异步提交执行代码给事件派发线程，代码立即返回，不会等待代码执行完毕。invokeAndWait:同步提交执行代码给事件派发线程，等到代码执行完再返回（SWT中也有类似的机制对应的是：asyncExec和syncExec）
SwingWorker类用来实现后台线程操作，和上面的不同，SwingWorker在创建时会使用一个独立的线程（而不是在事件派发线程）执行相应的代码，然后可以通过get()方法获得执行结果。如果启动worker后马上要求结果的话，Swing同样会阻塞直到得到处理结果为止。
参考：Swing单线程开发引起的问题编写多线程Java应用程序常见问题线程与Swing(英文)SWT中处理多线程


	Tags: Swing, 多线程
]]></description>
			<content:encoded><![CDATA[<p>Swing本身的界面绘制单线程的。也就是只有一个事件分派线程负责处理事件处理方法，保证了Swing本身的线程安全。但是如果存在一个很复杂耗时的任务，这样的处理方法就会造成界面的无响应甚至crash。所以Swing提供了SwingUtilities类的两个方法：invokeLater/invokeAndWait。<br />invokeLater:<b>异步</b>提交执行代码给事件派发线程，代码立即返回，不会等待代码执行完毕。<br />invokeAndWait:<b>同步</b>提交执行代码给事件派发线程，等到代码执行完再返回<br />（SWT中也有类似的机制对应的是：asyncExec和syncExec）</p>
<p>SwingWorker类用来实现后台线程操作，和上面的不同，SwingWorker在创建时会使用一个独立的线程（而不是在事件派发线程）执行相应的代码，然后可以通过get()方法获得执行结果。如果启动worker后马上要求结果的话，Swing同样会阻塞直到得到处理结果为止。</p>
<p>参考：<br /><a target="_blank" href="http://www.busfly.cn/csdn/post/Swing-progrem.html">Swing单线程开发引起的问题</a><br /><a target="_blank" href="http://www.abc188.com/info/html/chengxusheji/Javajishu/20080616/72685.html">编写多线程Java应用程序常见问题</a><br /><a target="_blank" href="http://www.javaresearch.org/article/7787.htm">线程与Swing</a>(<a target="_blank" href="http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html">英文</a>)<br /><a target="_blank" href="http://blog.csdn.net/baobeiSimple/archive/2007/08/22/1753910.aspx">SWT中处理多线程<br /></a></p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=30e53c18-6b85-8bb6-8ed2-5702120bf2a0" /></div>

	Tags: <a href="http://zhangv.com/archives/tag/swing" title="Swing" rel="tag">Swing</a>, <a href="http://zhangv.com/archives/tag/%e5%a4%9a%e7%ba%bf%e7%a8%8b" title="多线程" rel="tag">多线程</a><br />
]]></content:encoded>
			<wfw:commentRss>http://zhangv.com/archives/1196/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Swing和SWT的Calendar组件</title>
		<link>http://zhangv.com/archives/345</link>
		<comments>http://zhangv.com/archives/345#comments</comments>
		<pubDate>Fri, 13 Jun 2008 07:25:55 +0000</pubDate>
		<dc:creator>zhangv</dc:creator>
				<category><![CDATA[技术(Tech)]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>
		<category><![CDATA[swt]]></category>

		<guid isPermaLink="false">http://zhangv.com/archives/345</guid>
		<description><![CDATA[推荐swing上的calendar组件 - toedter

推荐swt上的calendar组件 - swtcalendar


	Tags: Java, Swing, swt
]]></description>
			<content:encoded><![CDATA[<p>推荐swing上的calendar组件 - <a href="http://www.toedter.com/">toedter</a></p>
<p><img style="max-width: 800px;" src="http://zhangv.com/wordpress/wp-content/uploads/swing-calendar-toedter.png" alt="" /></p>
<p>推荐swt上的calendar组件 - <a href="http://swtcalendar.sourceforge.net/">swtcalendar</a></p>
<p><img style="max-width: 800px;" src="http://zhangv.com/wordpress/wp-content/uploads/swt-calendar-vafada.png" alt="" /></p>

	Tags: <a href="http://zhangv.com/archives/tag/java" title="Java" rel="tag">Java</a>, <a href="http://zhangv.com/archives/tag/swing" title="Swing" rel="tag">Swing</a>, <a href="http://zhangv.com/archives/tag/swt" title="swt" rel="tag">swt</a><br />
]]></content:encoded>
			<wfw:commentRss>http://zhangv.com/archives/345/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Thinlet 二三事</title>
		<link>http://zhangv.com/archives/92</link>
		<comments>http://zhangv.com/archives/92#comments</comments>
		<pubDate>Thu, 03 Jan 2008 05:25:27 +0000</pubDate>
		<dc:creator>zhangv</dc:creator>
				<category><![CDATA[非技术(non-tech)]]></category>
		<category><![CDATA[AWT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>
		<category><![CDATA[thinlet]]></category>

		<guid isPermaLink="false">http://218.22.170.60/zhangv/wordpress/?p=22</guid>
		<description><![CDATA[XUL - xml user interface language,  mozilla推出的,firefox就是基于此. flex,zk都是这个意思
http://www.mozilla.org/projects/xul/
Thinlet - 开源XUL引擎,通过XUL分离业务逻辑和界面,基于AWT
 ThinG - 用来编写thinklet的XUL的工具,thing.sourceforge.net.通过ThinG配合thinlet使用可以很快速方便的开发awt界面.Theodore -  同上,但是是收费的
genesis -  开发框架,用于企业应用开发的,但是没有体会到有多好,测试sample里的thinlet时AspectWerkz出错,保持关注
 swiXML -  类似thinlet但是是用于swing的
jdnc - Sun力推的XUL解决方案,没看出有什么动向,保持关注

	Tags: AWT, Java, Swing, thinlet
]]></description>
			<content:encoded><![CDATA[<p>XUL - xml user interface language,  mozilla推出的,firefox就是基于此. flex,zk都是这个意思<br />
http://www.mozilla.org/projects/xul/</p>
<p><a href="http://www.thinlet.com">Thinlet</a><a href="http://www.thinlet.com"> </a>- 开源XUL引擎,通过XUL分离业务逻辑和界面,基于AWT<br />
<a href="http://thing.sourceforge.net"> ThinG</a> - 用来编写thinklet的XUL的工具,thing.sourceforge.net.通过ThinG配合thinlet使用可以很快速方便的开发awt界面.Theodore -  同上,但是是收费的<br />
genesis -  开发框架,用于企业应用开发的,但是没有体会到有多好,测试sample里的thinlet时AspectWerkz出错,保持关注<br />
<a href="http://www.swixml.org"> swiXML</a> -  类似thinlet但是是用于swing的<br />
jdnc - Sun力推的XUL解决方案,没看出有什么动向,保持关注</p>

	Tags: <a href="http://zhangv.com/archives/tag/awt" title="AWT" rel="tag">AWT</a>, <a href="http://zhangv.com/archives/tag/java" title="Java" rel="tag">Java</a>, <a href="http://zhangv.com/archives/tag/swing" title="Swing" rel="tag">Swing</a>, <a href="http://zhangv.com/archives/tag/thinlet" title="thinlet" rel="tag">thinlet</a><br />
]]></content:encoded>
			<wfw:commentRss>http://zhangv.com/archives/92/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MoBarbr &#8211; 记账</title>
		<link>http://zhangv.com/archives/61</link>
		<comments>http://zhangv.com/archives/61#comments</comments>
		<pubDate>Tue, 04 Dec 2007 13:20:54 +0000</pubDate>
		<dc:creator>zhangv</dc:creator>
				<category><![CDATA[技术(Tech)]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[mobarbr]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://218.22.170.60/zhangv/wordpress/?p=38</guid>
		<description><![CDATA[这个是前一阵子有空的时候用swing写的一个简单的记账软件。很简单的功能，无非就是记账，添加顾客，充值，修改，报表。用Spring来管理swing ui组件之间的依赖，发现也很方便，而且看起来更清晰，不像以前那种panel,frame,dialog的引用传来传去。本来还准备用thinlet重写一遍，后来因为thinlet只支持awt而没做。同时还试了一些方法来发布这个桌面应用，见Java桌面应用程序发布 截图： 下载  源代码

	Tags: Java, mobarbr, Swing
]]></description>
			<content:encoded><![CDATA[<p>这个是前一阵子有空的时候用swing写的一个简单的记账软件。很简单的功能，无非就是记账，添加顾客，充值，修改，报表。用Spring来管理swing ui组件之间的依赖，发现也很方便，而且看起来更清晰，不像以前那种panel,frame,dialog的引用传来传去。本来还准备用thinlet重写一遍，后来因为thinlet只支持awt而没做。同时还试了一些方法来发布这个桌面应用，见<a href="http://zhangv.com/archives/39">Java桌面应用程序发布</a> 截图：<img src="http://zhangv.com/wordpress/wp-content/uploads/mobarbr-ui.png" alt="" width="522" height="417" /> <a href="http://zhangv.com/wordpress/wp-content/uploads/mobarbr-1.0.zip">下载 </a> <a href="http://zhangv.com/wordpress/wp-content/uploads/mobarbr-10-src.zip">源代码</a></p>

	Tags: <a href="http://zhangv.com/archives/tag/java" title="Java" rel="tag">Java</a>, <a href="http://zhangv.com/archives/tag/mobarbr" title="mobarbr" rel="tag">mobarbr</a>, <a href="http://zhangv.com/archives/tag/swing" title="Swing" rel="tag">Swing</a><br />
]]></content:encoded>
			<wfw:commentRss>http://zhangv.com/archives/61/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>如何实现改变JTable中的曾选中过的cell的背景</title>
		<link>http://zhangv.com/archives/35</link>
		<comments>http://zhangv.com/archives/35#comments</comments>
		<pubDate>Tue, 13 Nov 2007 14:50:00 +0000</pubDate>
		<dc:creator>zhangv</dc:creator>
				<category><![CDATA[技术(Tech)]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://218.22.170.60/zhangv/wordpress/?p=28</guid>
		<description><![CDATA[&#160;
2006/5/14
扩展一个JTable,增加一个List记录每次点击选择的cell,将其index记录.然后用一个Renderer,如果cell被选择过,则修改背景颜色为红色.使用时候先实例化一个MyTable,在setCellRenderer.
public class MyTable extends JTable {
private ArrayList selected;
public MyTable() {
super();
selected = new  ArrayList();
}
//将选中的cell列,行数记录
public void addSelected(Point  p){
if(selected.contains(p)){
selected.remove(p);
}else{
selected.add(p);
}
}
//某个cell是否被记录过
public boolean hasSelected(int row, int column) {
return  selected.contains(new Point(row,column));
}
}
实现一个renderer,当cell的index在记录历史中,则修改其背景
public class MyRenderer extends DefaultTableCellRenderer{
public  MyRenderer(){
super();
setHorizontalAlignment(SwingConstants.CENTER);
}
public  Component getTableCellRendererComponent(JTable table, Object  value,
boolean isSelected, boolean hasFocus, int row, int column)  {
MyTable mt =  (MyTable)table;
if(isSelected){
mt.addSelected(new  Point(row,column));
}
if(mt.hasSelected(row,column)){
this.setBackground(Color.RED);
}else{
this.setBackground(Color.WHITE);
}
return [...]]]></description>
			<content:encoded><![CDATA[<p class="bvEntry">&nbsp;</p>
<p>2006/5/14</p>
<p class="bvMsg">扩展一个JTable,增加一个List记录每次点击选择的cell,将其index记录.然后用一个Renderer,如果cell被选择过,则修改背景颜色为红色.使用时候先实例化一个MyTable,在setCellRenderer.</p>
<p>public class MyTable extends JTable {</p>
<p>private ArrayList selected;</p>
<p>public MyTable() {<br />
super();<br />
selected = new  ArrayList();</p>
<p>}<br />
//将选中的cell列,行数记录<br />
public void addSelected(Point  p){<br />
if(selected.contains(p)){<br />
selected.remove(p);<br />
}else{<br />
selected.add(p);<br />
}<br />
}</p>
<p>//某个cell是否被记录过</p>
<p>public boolean hasSelected(int row, int column) {<br />
return  selected.contains(new Point(row,column));<br />
}</p>
<p>}<br />
实现一个renderer,当cell的index在记录历史中,则修改其背景</p>
<p>public class MyRenderer extends DefaultTableCellRenderer{<br />
public  MyRenderer(){<br />
super();<br />
setHorizontalAlignment(SwingConstants.CENTER);<br />
}<br />
public  Component getTableCellRendererComponent(JTable table, Object  value,<br />
boolean isSelected, boolean hasFocus, int row, int column)  {<br />
MyTable mt =  (MyTable)table;<br />
if(isSelected){<br />
mt.addSelected(new  Point(row,column));<br />
}<br />
if(mt.hasSelected(row,column)){<br />
this.setBackground(Color.RED);<br />
}else{<br />
this.setBackground(Color.WHITE);<br />
}<br />
return  this;<br />
}<br />
}</p>

	Tags: <a href="http://zhangv.com/archives/tag/gui" title="GUI" rel="tag">GUI</a>, <a href="http://zhangv.com/archives/tag/java" title="Java" rel="tag">Java</a>, <a href="http://zhangv.com/archives/tag/swing" title="Swing" rel="tag">Swing</a><br />
]]></content:encoded>
			<wfw:commentRss>http://zhangv.com/archives/35/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>alloy破解[转贴]</title>
		<link>http://zhangv.com/archives/7</link>
		<comments>http://zhangv.com/archives/7#comments</comments>
		<pubDate>Mon, 04 Jun 2007 06:02:32 +0000</pubDate>
		<dc:creator>zhangv</dc:creator>
				<category><![CDATA[技术(Tech)]]></category>
		<category><![CDATA[alloy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://zhangv.wordpress.com/?p=9</guid>
		<description><![CDATA[alloy的许可证分成四个部分，每个部分之间用#号分隔，第一部分是许可证过期时间，第二部分是用户名，第三和第四部分是两个36进制的整数，其中第三部分是校验码，第四部分是一个随机数（我是这么认为的，第四部分写死成一个常量也没有什么关系）。
好了，了解了许可证的构造之后，我们来了解一下alloy检验许可证是否合法和过期的过程。
一：分离许可证的各个部分。
二：判断日期部分的长度，如果长度大于1，就构造一个过期时间，否则过期时间为null。（这下子我们就可以通过使日期部分的长度不超过1来让alloy永不过期了^-^）。
三：调用Long.parseLong(String,   int)方法解析出第三和第四部分两个36进制整数的10进制的值。
四：使用java.util.zip.CRC32来计算校验值，计算的过程是把从第四部分得到的10进值整数对127取模，然后加上第一、二两个部分（包括中间的#号），这样就构造出一个字符串，然后调用CRC32.update()方法计算这个字符串的校验值。
五：使用getValue()方法从CRC32中取得校验值，然后将这个校验值与从第三部分获得的10进制数值比较，如果相等，则校验成功。随后就是判断当前日期是否过期的操作了。
这大致就是alloy验证许可证的过程，我们反过来做一遍，就可以得到我们自己的许可证了。下面就是我写的构造许可证的方法，供大家参考。
public   String   generate(String   user)
{
String   exp   =   "x";
String   rand   =   "torresg";
long   l   =   Long.parseLong(rand,   36);
CRC32   crc32    =   new   [...]]]></description>
			<content:encoded><![CDATA[<p>alloy的许可证分成四个部分，每个部分之间用#号分隔，第一部分是许可证过期时间，第二部分是用户名，第三和第四部分是两个36进制的整数，其中第三部分是校验码，第四部分是一个随机数（我是这么认为的，第四部分写死成一个常量也没有什么关系）。<br />
好了，了解了许可证的构造之后，我们来了解一下alloy检验许可证是否合法和过期的过程。<br />
一：分离许可证的各个部分。<br />
二：判断日期部分的长度，如果长度大于1，就构造一个过期时间，否则过期时间为null。（这下子我们就可以通过使日期部分的长度不超过1来让alloy永不过期了^-^）。<br />
三：调用Long.parseLong(String,   int)方法解析出第三和第四部分两个36进制整数的10进制的值。<br />
四：使用java.util.zip.CRC32来计算校验值，计算的过程是把从第四部分得到的10进值整数对127取模，然后加上第一、二两个部分（包括中间的#号），这样就构造出一个字符串，然后调用CRC32.update()方法计算这个字符串的校验值。<br />
五：使用getValue()方法从CRC32中取得校验值，然后将这个校验值与从第三部分获得的10进制数值比较，如果相等，则校验成功。随后就是判断当前日期是否过期的操作了。<br />
这大致就是alloy验证许可证的过程，我们反过来做一遍，就可以得到我们自己的许可证了。下面就是我写的构造许可证的方法，供大家参考。</p>
<p>public   String   generate(String   user)<br />
{<br />
String   exp   =   "x";<br />
String   rand   =   "torresg";<br />
long   l   =   Long.parseLong(rand,   36);<br />
CRC32   crc32    =   new   CRC32();<br />
crc32.update((l   %   127L   +   exp   +    "#"   +   user).getBytes());<br />
String   checksum   =    Long.toString(crc32.getValue(),   36);<br />
return   exp   +   "#"    +   user   +   "#"   +   checksum   +   "#"   +   rand;<br />
}</p>
<p>另外就是过期时间不能为空，因为alloy中另外某个地方要对这个时间进行处理。为空的话也会验证失败。所以过期时间要使用一个长度为1的字符串。</p>
<p>com.incors.plaf.alloy.AlloyLookAndFeel.setProperty("alloy.licenseCode",<br />
"v#ej_technologies#uwbjzx#e6pck8");<br />
try  {<br />
javax.swing.LookAndFeel alloyLnF = new  com.incors.plaf.alloy.AlloyLookAndFeel ();   javax.swing.UIManager.setLookAndFeel(alloyLnF);<br />
} catch  (javax.swing.UnsupportedLookAndFeelException ex) {<br />
// You may handle the  exception here<br />
ex.printStackTrace();<br />
}</p>

	Tags: <a href="http://zhangv.com/archives/tag/alloy" title="alloy" rel="tag">alloy</a>, <a href="http://zhangv.com/archives/tag/java" title="Java" rel="tag">Java</a>, <a href="http://zhangv.com/archives/tag/swing" title="Swing" rel="tag">Swing</a><br />
]]></content:encoded>
			<wfw:commentRss>http://zhangv.com/archives/7/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

