﻿<?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-ECLIPSE RCP [SWT/JFACE] For CN_ZH</title><link>http://www.blogjava.net/wing5jface/</link><description>關注于eclipse rcp開發, SWT/JFACE學習</description><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 04:29:28 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 04:29:28 GMT</pubDate><ttl>60</ttl><item><title>闲话(1)SWT 3.2后的一些更新:关于3.4 不规则窗体与不规则控件的创建</title><link>http://www.blogjava.net/wing5jface/archive/2009/07/09/286077.html</link><dc:creator>ECLIPSE RCP [SWT/JFACE] For CN_ZH</dc:creator><author>ECLIPSE RCP [SWT/JFACE] For CN_ZH</author><pubDate>Thu, 09 Jul 2009 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/wing5jface/archive/2009/07/09/286077.html</guid><wfw:comment>http://www.blogjava.net/wing5jface/comments/286077.html</wfw:comment><comments>http://www.blogjava.net/wing5jface/archive/2009/07/09/286077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wing5jface/comments/commentRss/286077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wing5jface/services/trackbacks/286077.html</trackback:ping><description><![CDATA[<strong style="font-size: 18pt">eclipse3.4版本在SWT方面提供了以下有趣的新增功能：<br />
&nbsp;&nbsp;&nbsp;&nbsp; SWT不规则控件的创建</strong><br />
<br />
1：提供真正的SWT全屏状态,不再强制需要使用ON_TOP设置窗体的style,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;在这之前也可达到全屏效果，不过你必须设置shell的region等于屏幕的SIZE.<br />
2:&nbsp;&nbsp; 提供窗体透明与半透明之设置,如windows,部分linux OS。<br />
3：提供真正的不规则控件创建功能，比之前的创建不规则的SHELL更有意思<br />
4&nbsp;&nbsp; 增强SWT对GC或GC对控件内部的绘制。<br />
上述特点将为我们创建更COOL的SWT 界面元素提供基础。<br />
<br />
首先我们先有eclipse官方的例子简单说明创建不规则控件的过程<br />
<br />
[Java代码]<br />
<span style="color: #0000ff">package org.eclipse.swt.snippets;<br />
<br />
import org.eclipse.swt.*;<br />
import org.eclipse.swt.graphics.*;<br />
import org.eclipse.swt.layout.*;<br />
import org.eclipse.swt.widgets.*;<br />
<br />
/*<br />
* 使用Region创建不规则控件之SWTButton <br />
*&nbsp;&nbsp; on a control: create a non-rectangular button<br />
<br />
* <url>http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet294.java?view=co</url><br />
* For a list of all SWT example snippets see<br />
* http://www.eclipse.org/swt/snippets/<br />
* <br />
* @since 3.4<br />
*/<br />
<br />
public class Snippet294 {<br />
<br />
&nbsp;&nbsp;static int[] circle(int r, int offsetX, int offsetY) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int[] polygon = new int[8 * r + 4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;// x^2 + y^2 = r^2<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 2 * r + 1; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x = i - r;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int y = (int)Math.sqrt(r*r - x*x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polygon[2*i] = offsetX + x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polygon[2*i+1] = offsetY + y;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polygon[8*r - 2*i - 2] = offsetX + x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polygon[8*r - 2*i - 1] = offsetY - y;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return polygon;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;final Display display = new Display();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;final Shell shell = new Shell(display);<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.setText("Regions on a Control");<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.setLayout(new FillLayout());<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.setBackground(display.getSystemColor(SWT.COLOR_DARK_RED));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Button b2 = new Button(shell, SWT.PUSH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;b2.setText("Button with Regions");<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// define a region that looks like a circle with two holes in ot<br />
&nbsp;&nbsp;&nbsp;&nbsp;Region region = new Region();<br />
&nbsp;&nbsp;&nbsp;&nbsp;region.add(circle(67, 87, 77));<br />
&nbsp;&nbsp;&nbsp;&nbsp;region.subtract(circle(20, 87, 47));<br />
&nbsp;&nbsp;&nbsp;&nbsp;region.subtract(circle(20, 87, 113));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// define the shape of the button using setRegion<br />
&nbsp;&nbsp;&nbsp;&nbsp;b2.setRegion(region);<br />
&nbsp;&nbsp;&nbsp;&nbsp;b2.setLocation(100,50);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;b2.addListener(SWT.Selection, new Listener() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void handleEvent(Event e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shell.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.setSize(200,200);<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.open();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (!shell.isDisposed()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!display.readAndDispatch())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display.sleep();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;region.dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;display.dispose();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
}</span><br />
<br />
[/java代码]<br />
<br />
<strong><span style="color: #ff0000"><strong style="font-size: 18pt">其次再来看看如何创建不规则的控件，<br />
以下以继承的SWT Button表现不规则按件</strong></span><br />
</strong><br />
package testupdate;<br />
<br />
import org.eclipse.swt.graphics.Region;<br />
import org.eclipse.swt.widgets.Button;<br />
import org.eclipse.swt.widgets.Composite;<br />
<br />
public class cirButton extends Button {<br />
&nbsp;&nbsp;static int[] circle(int r, int offsetX, int offsetY) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int[] polygon = new int[8 * r + 4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 2 * r + 1; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x = i - r;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int y = (int) Math.sqrt(r * r - x * x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polygon[2 * i] = offsetX + x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polygon[2 * i + 1] = offsetY + y;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polygon[8 * r - 2 * i - 2] = offsetX + x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;polygon[8 * r - 2 * i - 1] = offsetY - y;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return polygon;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;Region region = null;<br />
<br />
&nbsp;&nbsp;public cirButton(Composite parent, int style) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;super(parent, style);<br />
&nbsp;&nbsp;&nbsp;&nbsp;setwingRes();<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 指定不规则的区域及形状<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public void setwingRes() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;region = genRegion();<br />
&nbsp;&nbsp;&nbsp;&nbsp;setRegion(region);<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;// 需要重写checkSubclass方法才可正确使用<br />
&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;protected void checkSubclass() {<br />
<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;public static Region genRegion() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;Region region;<br />
&nbsp;&nbsp;&nbsp;&nbsp;region = new Region();<br />
&nbsp;&nbsp;&nbsp;&nbsp;region.add(circle(67, 87, 77));<br />
&nbsp;&nbsp;&nbsp;&nbsp;region.subtract(circle(20, 87, 47));<br />
&nbsp;&nbsp;&nbsp;&nbsp;region.subtract(circle(20, 87, 113));<br />
&nbsp;&nbsp;&nbsp;&nbsp;return region;<br />
&nbsp;&nbsp;}<br />
<br />
}<br />
<br />
=============================================<br />
测试代码<br />
=============================================<br />
package testupdate;<br />
<br />
import org.eclipse.swt.SWT;<br />
import org.eclipse.swt.layout.GridData;<br />
import org.eclipse.swt.layout.GridLayout;<br />
import org.eclipse.swt.widgets.Display;<br />
import org.eclipse.swt.widgets.Shell;<br />
<br />
/**<br />
* @since Eclispe 3.4<br />
* @author wing5jface<br />
* <br />
*/<br />
public class coolSWTButton {<br />
<br />
&nbsp;&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;final Display display = new Display();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;final Shell shell = new Shell(display);<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.setText("创建不规则控件之SWT");<br />
&nbsp;&nbsp;&nbsp;&nbsp;final GridLayout gridLayout = new GridLayout();<br />
&nbsp;&nbsp;&nbsp;&nbsp;gridLayout.numColumns = 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.setLayout(gridLayout);<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.setBackground(display.getSystemColor(SWT.COLOR_DARK_RED));<br />
&nbsp;&nbsp;&nbsp;&nbsp;GridData griddata = new GridData(300, 160);<br />
&nbsp;&nbsp;&nbsp;&nbsp;cirButton button = new cirButton(shell, SWT.PUSH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;button.setwingRes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;button.setText("http://www.ben777.cn");<br />
&nbsp;&nbsp;&nbsp;&nbsp;button.setLayoutData(griddata);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;button = new cirButton(shell, SWT.PUSH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;button.setText("ben777.cn");<br />
&nbsp;&nbsp;&nbsp;&nbsp;button.setLayoutData(griddata);<br />
&nbsp;&nbsp;&nbsp;&nbsp;button = new cirButton(shell, SWT.PUSH);<br />
&nbsp;&nbsp;&nbsp;&nbsp;button.setwingRes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;button.setText("cool 控件");<br />
&nbsp;&nbsp;&nbsp;&nbsp;button.setLayoutData(griddata);<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.setSize(1000, 900);<br />
&nbsp;&nbsp;&nbsp;&nbsp;shell.open();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (!shell.isDisposed()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!display.readAndDispatch())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display.sleep();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;display.dispose();<br />
&nbsp;&nbsp;}<br />
<br />
}<br />
<br />
来源wing5jface&lt;http://www.ben777.cn&gt; 
<img src ="http://www.blogjava.net/wing5jface/aggbug/286077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wing5jface/" target="_blank">ECLIPSE RCP [SWT/JFACE] For CN_ZH</a> 2009-07-09 13:29 <a href="http://www.blogjava.net/wing5jface/archive/2009/07/09/286077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>