﻿<?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-amp@java-随笔分类-SWT</title><link>http://www.blogjava.net/amplifier/category/9019.html</link><description>amplifier's java blog
&lt;br&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "ca-pub-5575070670019942";
/* blogjava */
google_ad_slot = "7055672771";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 09 Mar 2012 07:52:47 GMT</lastBuildDate><pubDate>Fri, 09 Mar 2012 07:52:47 GMT</pubDate><ttl>60</ttl><item><title>SWT里面加了TableEditor后如何删除</title><link>http://www.blogjava.net/amplifier/archive/2012/03/09/371567.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Fri, 09 Mar 2012 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/amplifier/archive/2012/03/09/371567.html</guid><wfw:comment>http://www.blogjava.net/amplifier/comments/371567.html</wfw:comment><comments>http://www.blogjava.net/amplifier/archive/2012/03/09/371567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/amplifier/comments/commentRss/371567.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/amplifier/services/trackbacks/371567.html</trackback:ping><description><![CDATA[SWT里TableEditor的作用是可以在表格里面显示一些控件，例如列表、按钮等，有时候是根据表格的内容在控件上显示不同内容的，如果更新了表格内容，就要同时更新控件，但是表格内容可以通过Table控件的removeAll()来清除，而表格中的控件则无法用这个方法清除，你调用Table的removeAll()方法，往表格里填入新内容后，控件还是上次的控件，但是你一操作那些控件就会出异常，提示那些控件已经disposed。<br /><br />解决方法是显式地调用控件及TableEditor的dispose()方法，在你建立TableEditor的时候，把它的引用保存起来，把里面的控件的引用也保存起来，到整个表格需要的清除的时候，通过引用先把控件dispose掉，再把TableEditor也dispose掉，这样整个表格的内容就真正清除了。<br /><br />例如有一个表格名为table，里面的每一行都有3列，第一列是文本，第二列是Combo，第三列是Button,绘制表格的时候是这样的：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">TableItem&nbsp;ti&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;TableItem(table,SWT.NONE);<br />ti.setText(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">some&nbsp;string</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />te&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;TableEditor(table);<br />Combo&nbsp;combo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Combo(table,SWT.NONE);<br />controls.add(combo);<br />te.setEditor(combo,ti,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />Button&nbsp;button&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Button(table,SWT.NONE);<br />controls.add(button);<br />te.setEditor(button,ti,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);</span></div><br />其中te和controls都是成员变量，te的类型是TableEditor，controls的类型是ArrayList&lt;Control&gt;。<br />当整个table要清除内容时，可以这样：<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: #008000; ">//</span><span style="color: #008000; ">删除控件</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(Control&nbsp;control:controls){<br />control.dispose();<br />}<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">删除TableEditor</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">te.dispose();<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">删除文本</span><span style="color: #008000; "><br /></span><span style="color: #000000;">table.removeAll();<br /></span></div><img src ="http://www.blogjava.net/amplifier/aggbug/371567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/amplifier/" target="_blank">amp@java</a> 2012-03-09 11:09 <a href="http://www.blogjava.net/amplifier/archive/2012/03/09/371567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT的线程间通信</title><link>http://www.blogjava.net/amplifier/archive/2006/03/27/37646.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Mon, 27 Mar 2006 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/amplifier/archive/2006/03/27/37646.html</guid><wfw:comment>http://www.blogjava.net/amplifier/comments/37646.html</wfw:comment><comments>http://www.blogjava.net/amplifier/archive/2006/03/27/37646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/amplifier/comments/commentRss/37646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/amplifier/services/trackbacks/37646.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<p>在SWT中，通常需要开多个线程来执行任务，因为主线程为UI线程，不能用太长的时间来执行某个任务，否则会造成失去响应的假象。<br />SWT的线程通信有几个要注意的地方：<br />1、工作线程访问UI线程。不能在非UI线程中直接访问UI控件的值，要获得或设置控件的值必须通过Display对象的asyncExec()或syncExec()函数，一般的使用方法是：<br /><span style="COLOR: #008080"></span></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">
				<span style="COLOR: #000000">//代码A：<br /> <br />Display disp  </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">  Display.getDefault();<br /> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (disp </span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000"> )  {<br />   disp.asyncExec(<br />    </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000">  Runnable()  {<br />    </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">  </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">  run()  {<br />       </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 在这里设置或获得控件的值 </span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000"> } <br />} <br />); <br />} </span>
		</div>
		<br />2、内部类与外部类的交流。内部类调用外部类局部变量时，该变量必须是final的，这样在取得控件的值后返回给外部类处理时就比较麻烦。例如，在上面的代码段中，有个匿名内部类实现了Runnable接口，在里面的run()函数里可以访问到UI对象，但是，得到了对象的值怎么告诉外面的代码呢？假如用普通的局部变量传递进去，由于是final的，是不能赋值的，所以需要有一个封装类来把需要返回的变量封装起来，这个封装类是final的，但里面的成员变量是可变的，这样就把内部类里得到的东西传递到了外部，不过似乎比较麻烦，不知道有没有更好的办法。<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"><span style="COLOR: #0000ff">//代码B：<br /><br />class</span><span style="COLOR: #000000"> StringWrapper {<br /></span><span style="COLOR: #0000ff">   public</span><span style="COLOR: #000000"> String uiValue;<br />}<br />StringWrapper sw </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StringWrapper(); <br />Display disp  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  Display.getDefault();<br /> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (disp </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> )  {<br />   disp.asyncExec(<br />    </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">  Runnable()  {<br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">  run()  {<br />        sw.uiValue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> text.getText();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">假设text是一个文本框对象<br />       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 在这里设置或获得控件的值 </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    } <br />   } <br />   ); <br />} <br /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里就可以对sw.uiValue的值进行访问</span></div>3、线程间的同步。在上面的代码B中，通过asyncExec()函数来取得控件的值所需要的时间比较长，如果在后面马上访问那些值是得不到的，于是就需要有个同步的问题，即在控件值取得之前先不进行下一步操作。可以通过synchronized块及wait()，notify()机制来实现同步。<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"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">代码C：</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> StringWrapper {<br />   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String uiValue;<br />}<br />StringWrapper sw </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StringWrapper(); <br />Display disp  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  Display.getDefault();<br /> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (disp </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> )  {<br />   disp.asyncExec(<br />    </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">  Runnable()  {<br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">  run()  {<br />        </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">(sw){<br />          sw.uiValue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> text.getText();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">假设text是一个文本框对象</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            sw.notify();<br />         }<br />       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 在这里设置或获得控件的值</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000"> <br />    } <br />   } <br />   ); <br />}<br /></span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">(sw){<br />  sw.wait();<br />} <br /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里就可以对sw.uiValue的值进行访问</span></div><br />但是这里会带来一个问题，假如很快就能取得控件的值，但后面还有很长一段时间才会用到该值，如果把sw.wait()语句放在比较后的地方，就有可能造成死锁，因为sw已经被notify之后才开始wait的，再没有其他线程来notify它了，它就只能一直wait下去……。为了解决这个问题，可以(1)把sw.wait()紧跟在disp.asyncExec()后面；(2)给wait()设置一个timeout参数，到了一定的时间还没有东西notify它，它就自己超时。但这两种办法似乎都比较牵强，没有十足的保证，JDK文档里面有个例子，是用while来判断是否已经达到了要求，如果已经达到了就不再wait。<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"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">代码D：</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> StringWrapper {<br />   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String uiValue;<br />   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> isValueSet;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">是否已经取得了控件的值</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">}<br />StringWrapper sw </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StringWrapper(); <br />sw.isValueSet </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br />Display disp  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  Display.getDefault();<br /> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (disp </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> )  {<br />   disp.asyncExec(<br />    </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">  Runnable()  {<br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">  run()  {<br />        </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">(sw){<br />          sw.uiValue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> text.getText();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">假设text是一个文本框对象</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">            sw.isValueSet </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br />            sw.notify();<br />         }<br />       <span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 在这里设置或获得控件的值</span></span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000"> <br />    } <br />   } <br />   ); <br />}<br /></span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">(sw){<br />  </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">sw.isValueSet){<br />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br />      sw.wait();<br />    }</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (InterruptedException e){<br />    }<br />  }<br />} <br /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里就可以对sw.uiValue的值进行访问</span></div><br /><br /><img src ="http://www.blogjava.net/amplifier/aggbug/37646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/amplifier/" target="_blank">amp@java</a> 2006-03-27 17:29 <a href="http://www.blogjava.net/amplifier/archive/2006/03/27/37646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>