??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国内在线,国产精品久久久乱弄,av资源网在线观看http://www.aygfsteel.com/sealyu/category/30672.html--- The devil's in the Detailszh-cnFri, 11 Jun 2010 18:18:23 GMTFri, 11 Jun 2010 18:18:23 GMT60Eclipse ?Java Project 转换为Dynamic Web ProjectQ{Q?/title><link>http://www.aygfsteel.com/sealyu/archive/2009/10/15/298346.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 15 Oct 2009 03:17:00 GMT</pubDate><guid>http://www.aygfsteel.com/sealyu/archive/2009/10/15/298346.html</guid><wfw:comment>http://www.aygfsteel.com/sealyu/comments/298346.html</wfw:comment><comments>http://www.aygfsteel.com/sealyu/archive/2009/10/15/298346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sealyu/comments/commentRss/298346.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sealyu/services/trackbacks/298346.html</trackback:ping><description><![CDATA[接手一个前期的Web目Q当时是用MyEclipse建立的,用MyEclipse发布q行没有M问题?br /> 现在因ؓ没有购买MyEclipse的年费,军_用EclipsE+WPTl箋开发,没想到在WPT的Server中发C了该目Q于是用下面的Ҏ其转换为WPT能识别的目?br /> 1. 修改目?project文gQ保存,不记得是否需要重启Eclipse了?br />     ?lt;natures><br />          …<br />       </natures> <p>之间d下列三行配置 </p> <p><nature>org.eclipse.wst.common.project.facet.core.nature</nature><br /> <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature><br /> <nature>org.eclipse.jem.workbench.JavaEMFNature</nature> </p> <p>2. 在Eclipse中打开“project properties"Q会看到新增了很多选择,点中"Project Facets",按下N|:</p> <p><img alt="" src="../../images/blogjava_net/vcok/convert2Web.jpg" height="651" width="814" /></p> 3. 目卛_成ؓ一个被WPT识别的项目? <img src ="http://www.aygfsteel.com/sealyu/aggbug/298346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sealyu/" target="_blank">seal</a> 2009-10-15 11:17 <a href="http://www.aygfsteel.com/sealyu/archive/2009/10/15/298346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 8.04下的eclipse与scim输入法冲H解军_??http://www.aygfsteel.com/sealyu/archive/2009/04/20/266500.htmlsealsealMon, 20 Apr 2009 02:20:00 GMThttp://www.aygfsteel.com/sealyu/archive/2009/04/20/266500.htmlhttp://www.aygfsteel.com/sealyu/comments/266500.htmlhttp://www.aygfsteel.com/sealyu/archive/2009/04/20/266500.html#Feedback1http://www.aygfsteel.com/sealyu/comments/commentRss/266500.htmlhttp://www.aygfsteel.com/sealyu/services/trackbacks/266500.html

最q把pȝ升?.04Q整个安装配|过E越来越单,一切都比较利Q最后在eclipse与scim之间卡住了。我安装的是英文环境Qlocale是en_US.UTF-8Q同LҎ?.04之前版本是正常的QLinux是Linux。下面是本hscim输入法的安装配置q程Q根据个人经验,不一定能够完全解x有h遇到的同样问题,仅供参考?/p>

1、安装scim拼音输入?br /> sudo apt-get install scim-pinyin im-switch



2、接着把系l默认的输入法设|ؓscim
sudo im-switch -s scim


l果讄p|Q系l反馈:


update-alternatives: Cannot find alternative `/etc/X11/xinit/xinput.d/scim'.



3、然后以普通用戯n份设|(新手朋友注意没有sudo了)


im-switch -s scim


讄成功QFirefox,GEdit都默认用了scim作ؓ首选输入法Q但是在eclise中则不是Q在默认情况下,在eclipse~辑器里面不能输入Q何字W(包括中文或英文)。只有鼠标右键选择Input Methods -> SCIM input Method之后Q才可以正常输入Q虽然这样也能解决问题,但是太多人性了QGoogle一把,扑ֈ解决办法?/p>

4、修改scim配置


sudo /etc/X11/xinit/xinput.d/scim


GTK_IM_MODULE=scim中的xim修改为scimQ保存ƈ退出?/p>

5、再ơ设|系l默认的输入法ؓscim


sudo update-alternatives --install /etc/X11/xinit/xinput.d/all_ALL xinput-all_ALL /etc/X11/xinit/xinput.d/scim 30
sudo im-switch -s scim



重启eclipseQ一切正常,大功告成?/p>



seal 2009-04-20 10:20 发表评论
]]>
Eclipse自动生成注释Q{Q?/title><link>http://www.aygfsteel.com/sealyu/archive/2009/03/26/262238.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Thu, 26 Mar 2009 13:28:00 GMT</pubDate><guid>http://www.aygfsteel.com/sealyu/archive/2009/03/26/262238.html</guid><wfw:comment>http://www.aygfsteel.com/sealyu/comments/262238.html</wfw:comment><comments>http://www.aygfsteel.com/sealyu/archive/2009/03/26/262238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sealyu/comments/commentRss/262238.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sealyu/services/trackbacks/262238.html</trackback:ping><description><![CDATA[windows-->preference<br /> Java-->Code Style-->Code Templates<br /> code-->new Java files <p>~辑?/p> ${filecomment}<br /> ${package_declaration}<br /> /**<br /> * @author 作?E-mail:<br /> * @version 创徏旉Q?{date} ${time}<br /> * c说?br /> */<br /> ${typecomment}<br /> ${type_declaration} <img src ="http://www.aygfsteel.com/sealyu/aggbug/262238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sealyu/" target="_blank">seal</a> 2009-03-26 21:28 <a href="http://www.aygfsteel.com/sealyu/archive/2009/03/26/262238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse中jboss启动时提C?50 seconds. 时 (?http://www.aygfsteel.com/sealyu/archive/2009/03/26/262024.htmlsealsealThu, 26 Mar 2009 01:51:00 GMThttp://www.aygfsteel.com/sealyu/archive/2009/03/26/262024.htmlhttp://www.aygfsteel.com/sealyu/comments/262024.htmlhttp://www.aygfsteel.com/sealyu/archive/2009/03/26/262024.html#Feedback0http://www.aygfsteel.com/sealyu/comments/commentRss/262024.htmlhttp://www.aygfsteel.com/sealyu/services/trackbacks/262024.html

eclipse中jboss启动时提C?/p>

Server JBoss v4.2 at localhost was unable to start within 50 seconds.
If the server requires more time, try increasing the timeout in the server editor.

解决办法

修改

workspace".metadata".plugins"org.eclipse.wst.server.core"servers.xml

<server auto-publish-setting="1" hostname="localhost" id="JBoss v4.2 at localhost" name="JBoss v4.2 at localhost" runtime-id="JBoss v4.2" server-type="org.eclipse.jst.server.generic.jboss42" server-type-id="org.eclipse.jst.server.generic.jboss42" start-timeout="50" stop-timeout="15" timestamp="7">

?start-timeout="50" 改ؓ  start-timeout="500000"

重启eclipse可以了



seal 2009-03-26 09:51 发表评论
]]>
eclipse 中boolean型变量自动生成Setter、GetterҎ的问?/title><link>http://www.aygfsteel.com/sealyu/archive/2009/02/17/255042.html</link><dc:creator>seal</dc:creator><author>seal</author><pubDate>Tue, 17 Feb 2009 03:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/sealyu/archive/2009/02/17/255042.html</guid><wfw:comment>http://www.aygfsteel.com/sealyu/comments/255042.html</wfw:comment><comments>http://www.aygfsteel.com/sealyu/archive/2009/02/17/255042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sealyu/comments/commentRss/255042.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sealyu/services/trackbacks/255042.html</trackback:ping><description><![CDATA[今天在用eclipse自动生成Setter/GetterҎ时发玎ͼ 如果一个布型变量命名?#8220;is”开头的话,自动生成的Setter/GetterҎ中会?#8220;is”自动LQ例如:<br /> 变量QisRequestableQ?br /> 生成的变量就会ؓQ?br />     public boolean isRequestable() {<br />         return isRequestable;<br />     }<br /> <br />     public void setRequestable(boolean isRequestable) {<br />         this.isRequestable = isRequestable;<br />     }<br /> <br /> l果我在使用seam的时候,上下文绑定就Z问题。提C找不到isRequestableq个property.<br /> 在代码中自动生成之后Q手动将之改写ؓQ?br />     public boolean isIsRequestable() {<br />         return isRequestable;<br />     }<br /> <br />     public void setIsRequestable(boolean isRequestable) {<br />         this.isRequestable = isRequestable;<br />     }<br /> 问题p决了<br /> <br /> 另外Q还有一个问题,是变量名如果是W一个ؓ写字母Q第二个为大写字母,也会出错Q例如:eOrder,<br /> q样在生成Setter/GetterҎ时也会提C找不到变量。所以将变量改名Q然后JPA注释的时候映一下就可以了?br /> <img src ="http://www.aygfsteel.com/sealyu/aggbug/255042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sealyu/" target="_blank">seal</a> 2009-02-17 11:08 <a href="http://www.aygfsteel.com/sealyu/archive/2009/02/17/255042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse中设|tab sizehttp://www.aygfsteel.com/sealyu/archive/2009/02/17/255028.htmlsealsealTue, 17 Feb 2009 01:52:00 GMThttp://www.aygfsteel.com/sealyu/archive/2009/02/17/255028.htmlhttp://www.aygfsteel.com/sealyu/comments/255028.htmlhttp://www.aygfsteel.com/sealyu/archive/2009/02/17/255028.html#Feedback0http://www.aygfsteel.com/sealyu/comments/commentRss/255028.htmlhttp://www.aygfsteel.com/sealyu/services/trackbacks/255028.html

1Qwindow——preference——General——Editor——Text Editor讄面QDisplay Tab Width

2Qwindow——preference——Java——Code Style——Formatter讄面QEditQ在弹出的Editor profileH口中,Indentation卡片Q设|Indentation Size和Tab Size?

3Q如果安装了MyeclipseQ那么在window——preference——Myeclipse——Editor——Common Editor Preference中Apperance卡片Q设|Tab Size?

对Java文gQ第2中是可行的。设|??没有?/font>



seal 2009-02-17 09:52 发表评论
]]>
Eclicpse3.1.1下配|SWTQ打包发布SWTE序Q{EXEQ{载)http://www.aygfsteel.com/sealyu/archive/2008/04/10/192003.htmlsealsealThu, 10 Apr 2008 14:43:00 GMThttp://www.aygfsteel.com/sealyu/archive/2008/04/10/192003.htmlhttp://www.aygfsteel.com/sealyu/comments/192003.htmlhttp://www.aygfsteel.com/sealyu/archive/2008/04/10/192003.html#Feedback0http://www.aygfsteel.com/sealyu/comments/commentRss/192003.htmlhttp://www.aygfsteel.com/sealyu/services/trackbacks/192003.htmlEclicpse3.1.1下配|SWTQ打包发布SWTE序Q{EXE一条龙q程记录
Eclipse下安?strong>SWT
1.?a >www.eclipse.org上下载SWT.
我这里用的是1.1.0.1Qƈ且页面上有推荐的Eclipse3.1.1QEMF,GEF。都下蝲了!
2.按照Eclipse安装插g的方法,安装SWT,EMF,GEF?/div>
3.如果不出意外Q就可以正常使用了!
q里有一个徏议:最好用纯的EclipseQ我开始用WTP版的Q怎么配置也不行?/div>
可以建立Visual ClassQ但是不能可视化d控gQ或者看不到控g的属性,或者Text,TextArea控g无法d。后来按照以上方法,重新来了一ơ,OK?
二打包发?strong>SWTE序
1.因ؓ需?strong>SWT?strong>jar.但是Eclipse3.1.1配合的的SWT不是通过SWT.jar发布的!是org.eclipse.swt.win32.win32.x86_3.1.0.jar。里面包括了JINI的DLL?strong>SWTcL件?/div>
需要下?/div>
q里?strong>SWT.jarQ和3个DLL,把他们解压羃出来Q备用!
2.通过Eclipse的导出功能,生成一?strong>可执行的jarQMANIFEST.MF文g选择?strong>Eclipse生成Qƈ且保存到目中?/div>
3.上面2的步骤,只是Z得到MANIFEST.MF文g。下面修改一下这个文件?/div>
加上 Class-Path SWT.jar
如果q有其他的jar,用空格分开Q加到后?/div>
4.再生成一ơjar,MANIFEST.MF选择修改后的?/div>
5.打包的jar,SWT.jar,3个DLL攑ֈ一个文件夹下,双击可执行的jarQ程序运行!
三jar转EXE
1.打开JSmooth0.9.7?/div>
2.选择skeleton,在skeleton properties中先把Launch java app in the exe process,Debug console选中。可以查看生成EXE文g执行q程信息?/div>
3.选择Executable.
选择生成的EXE文g存放位置?/div>
选择EXE文g图标
讄当前路径Q选择要{换的jar文g所在文件夹
4.选择Application
讄Main Class,可执行jar中的Main Class注意写类全名
讄Application Argument,如果需要传入参敎ͼ写到q里
讄Embedded jar: 可执行的jar
讄ClasspathQSWT.jar 如果有其他的l箋d
5.选择JVM Selection。默认吧?/div>
6.JVM Configuration:
可以讄java properties,内存使用
7.炚w轮。生成!看是否有错误?/div>
8.EXE执行需要的文gQEXE,3个DLLQSWT.jar
把他们考到其他目录Q一样可以执行!
9.Lskeleton properties中的Launch java app in the exe process,Debug console选项?/div>
重新生成。应该OK了!


seal 2008-04-10 22:43 发表评论
]]>使用SWT模拟鼠标键盘事ghttp://www.aygfsteel.com/sealyu/archive/2008/04/10/192001.htmlsealsealThu, 10 Apr 2008 14:42:00 GMThttp://www.aygfsteel.com/sealyu/archive/2008/04/10/192001.htmlhttp://www.aygfsteel.com/sealyu/comments/192001.htmlhttp://www.aygfsteel.com/sealyu/archive/2008/04/10/192001.html#Feedback0http://www.aygfsteel.com/sealyu/comments/commentRss/192001.htmlhttp://www.aygfsteel.com/sealyu/services/trackbacks/192001.html最q在学习SWT/JFaceQ在做一个小东西的时候需要模拟鼠标键盘事Ӟ在网上搜了一下,在java中模拟这些事Ӟ主要有两U方法:

一、用AWT中的Robotc?/h4>

Robot

java.awt.Robot

public class Robot
extends void keyPress(int keycode)
          按下l定的键?/td>  void keyRelease(int keycode)
          释放l定的键?/td>  void mouseMove(int x, int y)
          鼠标指针移动到l定屏幕坐标?/td>  void mousePress(int buttons)
          按下一个或多个鼠标按钮?/td>  void mouseRelease(int buttons)
          释放一个或多个鼠标按钮?/td>  void mouseWheel(int wheelAmt)
          在配有滚轮的鼠标上旋转滚轮?/td>
二、用SWT中的鼠标键盘事g
    在SWT的snippets中有两个例子用来介绍q两个方法的使用Q如下:

(1)、模拟鼠标事?br />  * UI Automation (for testing tools) snippet: post mouse events
import org.eclipse.swt.*;
public class Snippet142 {
public static void main(String[] args) {
 final Display display = new Display();
 final Shell shell = new Shell(display);
 final Button button = new Button(shell,SWT.NONE);
 button.setSize(100,100);
 button.setText("Click");
 shell.pack();
 shell.open();
 button.addListener(SWT.MouseDown, new Listener() {
  public void handleEvent(Event e){
   System.out.println("Mouse Down (button: " + e.button + " x: " + e.x + " y: " + e.y + ")");
  }
 });
 final Point pt = display.map(shell, null, 50, 50);
 new Thread(){
  Event event;
  public void run(){
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {}
   event = new Event();
   event.type = SWT.MouseMove;
   event.x = pt.x;
   event.y = pt.y;
   display.post(event);
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {}
   event.type = SWT.MouseDown;
   event.button = 1;
   display.post(event);
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {}
   event.type = SWT.MouseUp;
   display.post(event);
  } 
 }.start();
 while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) display.sleep();
 }
 display.dispose();
}
}
(2)、模拟键盘事?/div>

 * UI Automation (for testing tools) snippet: post key events
import org.eclipse.swt.*;
public class Snippet146 {
public static void main(String[] args) {
 final Display display = new Display();
 final Shell shell = new Shell(display);
 final Text text = new Text(shell, SWT.BORDER);
 text.setSize(text.computeSize(150, SWT.DEFAULT));
 shell.pack();
 shell.open();
 new Thread(){
  public void run(){
   String string = "Love the method.";
   for (int i = 0; i < string.length(); i++) {
    char ch = string.charAt(i);
    boolean shift = Character.isUpperCase(ch);
    ch = Character.toLowerCase(ch);
    if (shift) {
     Event event = new Event();
     event.type = SWT.KeyDown;
     event.keyCode = SWT.SHIFT;
     display.post(event); 
    }
    Event event = new Event();
    event.type = SWT.KeyDown;
    event.character = ch;
    display.post(event);
    try {
     Thread.sleep(10);
    } catch (InterruptedException e) {}
    event.type = SWT.KeyUp;
    display.post(event);
    try {
     Thread.sleep(100);
    } catch (InterruptedException e) {}
    if (shift) {
     event = new Event();
     event.type = SWT.KeyUp;
     event.keyCode = SWT.SHIFT;
     display.post(event); 
    }
   }
  } 
 }.start();
 while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) display.sleep();
 }
 display.dispose();
}
}
两种Ҏ中都是先声明一个EventQ然后将该Event的typecd讄为对应的 SWT.KeyUp/KeyDown/MouseUp/MouseDownQ最后通过DisplaycȝpostQEventQ方法来模拟对应的事件。注 意:如果有多个控Ӟ需要得到对应控件的display属性,然后post该事件。例如,在一个窗口中有一个BrowserQ则需要? thisClass.browser.getDisplay().post(event)?/div>



seal 2008-04-10 22:42 发表评论
]]>SWTQ实现自我绘制的ButtonlgQ{载)http://www.aygfsteel.com/sealyu/archive/2008/04/10/192000.htmlsealsealThu, 10 Apr 2008 14:41:00 GMThttp://www.aygfsteel.com/sealyu/archive/2008/04/10/192000.htmlhttp://www.aygfsteel.com/sealyu/comments/192000.htmlhttp://www.aygfsteel.com/sealyu/archive/2008/04/10/192000.html#Feedback0http://www.aygfsteel.com/sealyu/comments/commentRss/192000.htmlhttp://www.aygfsteel.com/sealyu/services/trackbacks/192000.html
然而,我对Buttonlgq是不能感到满意。最大的遗憾是Q对它的外观Q所能做的工作也׃限于此了。如果你惌按钮拥有一个漂亮的、渐变色的背景和一些特D的文字效果Q怎么办呢Q答案是没有办法。Buttonc里面似乎没有Q何方法提供我惌的功能?br />
我曾试q的W一个想法是用Button.addPaintListener来修Ҏ钮的外观。但是,l果令h失望——虽然它昄出来的时候的按照预 惌行绘制了Q但是当你用鼠标L它的时候,马上又变回了原本灰头土脸的样子。显Ӟ在按下按钮的时候,它ƈ不是触发paint事gQ而是按照自己的想? d原本的按钮,于是我的工作全部白费了?br />
如果试为按钮设定图像会怎么样呢Q这也不是一个好L。首先,不管你选择什么样的图像, 都没办法L按钮四周的边框,而正是这些边框严重破坏了囑փ的和谐感Q其ơ,如果你的E序有几十甚至上百个按钮Qؓ每个按钮都维护一q图像(甚至更多—? 理论上每个按钮在普通状态和被按下、禁用的状态下Q甚臛_鼠标U进Ud按钮的时候,都应当显CZ同的囑փQ明显是在浪费系l资源;如果你们的美工听说需? 做几百个囄Q大概也不会l你好脸色看。此外,囑փ有一个严重的~点是:它所拥有的像素数目是固定的,难以随着界面的放大和~小同时变化。如果强制进行羃 攄话,会出现明昄锯和失真,最l让你精心设计的H口变得惨不忍睹。最好还是放弃这个想法?br />
如果以Canvas为基Q设计一? 伪装的按钮组件又如何呢?听v来好像很不错Q因为采用这U办法的话,我们对如何绘制组件的表面有了完整的控制权。不q这也意味着你必d按钮的状态进? 手工l护。虽然Button本n是一个很单的lgQ但是重复去做标准按钮已l作好的工作gq是有点无谓。还有一件事情是应当考虑的:我们知道Q? JFace中的Action机制可以标准按钮、菜单项和工h按钮q三U界面组件纳入一个统一的事件处理体pR然而,如果我们从CanvaszL? 一个按钮的话,不论你模拟到多么怼的地步,它毕竟不是一个真正的ButtonQAction也不会给它同{的待遇。也是说手工制作的按钮无法? JFace Action体系协同工作——除非你M改Action的处理方法,让它LUx的按钮对象。这可不是一件轻杄工作?br />
如果上面的方法都行不通的话,应当怎么办呢Q我们知道,和Swingq样的框架不同,SWT中的按钮其实是操作pȝ底层所实现的按钮(q一点也可以? SPY++或者Winsight32之类的工兯实)。同时我们也知道Q操作系l——至是WindowspȝQ对按钮已经提供了自我绘制的机制Q这是 所谓的Owner DrawQ称为所有者绘制的原因是因为默认情况下l制消息是发送给按钮的父H口处理的,但是父窗口也可以把这个皮球再t回l按钮,让它自己解决Q。在 Win32 API中,凡是使用BS_OWNERDRAW风格创徏、ƈ且能够(通过消息反射Q响应WS_DRAWITEM消息的按钮,都可以获得这U定制的能力? 了解q一点,接下来的d是研究Buttonlg有没有开放这个接口供我们修改了。对Buttonlg的源代码q行_略的浏览后Q我发现了如下的ҎQ?br />
package org.eclipse.swt.widgets;

public class Button extends Control {

LRESULT wmDrawChild (int wParam, int lParam) {
if ((style & SWT.ARROW) == 0) return super.wmDrawChild (wParam, lParam);
DRAWITEMSTRUCT struct = new DRAWITEMSTRUCT ();
....

其中DRAWITEMSTRUCTl构的出现是一个明昄提示Q这里就是WM_DRAWITEM消息的响应函敎ͼ很幸q它没有声明为final的,只要重蝲它ƈ提供自己的实现就行了?br />
看v来是个小caseQ实际上也是。不q,q有一处小ȝ需要克服。注意wmDrawChildҎ没有使用M讉K限定W,q意味着它是 package friendly的——同一个包中的对象可以讉K和重载此ҎQ其他包中的对象没有这个权力了。也是_要定制按钮对象,我们新徏的对象也需要放在同 一个包Qorg.eclipse.swt.widgetsQ中。看h有点像在使用Hack手段Q不qؓ了突破SWTl我们的限制Q眼下也只好E稍就一 下。好在swt的包没有密封QSealedQ,不然我就不得不再ơ宣U此路不通了?br />
既然障碍已经扫清Q接下来我们可以来实现前面的? 法了。这里我做了一个决定,在上q包中只加入一个抽象类Q目的是把必要的接口暴露出来Q至于如何绘制按钮,则留l具体的按钮对象Ҏ应用E序的需求来? 定。这P不管你希望实现Windows XP风格的按钮、还是卡通风格的按钮、或是^面样式的QM不论什么千奇百怪的风格Q只要承一个类q载一个绘制方法就行了Q而不必每ơ都要和 Buttoncȝ内部打交道?br />
Zq种考虑Q实现自l按钮的抽象cd下:

package org.eclipse.swt.widgets;

import org.eclipse.swt.internal.win32.*;

public abstract class OwnerDrawButton extends Button
{
public OwnerDrawButton( Composite parent, int style )
{
super( parent, style );

int osStyle = OS.GetWindowLong( handle, OS.GWL_STYLE );
osStyle |= OS.BS_OWNERDRAW;
OS.SetWindowLong( handle, OS.GWL_STYLE, osStyle );
}

LRESULT wmDrawChild( int wParam, int lParam )
{
super.wmDrawChild( wParam, lParam );
DRAWITEMSTRUCT struct = new DRAWITEMSTRUCT();
OS.MoveMemory( struct, lParam, DRAWITEMSTRUCT.sizeof );
ownerDraw( struct );
return null;
}

protected abstract void ownerDraw( DRAWITEMSTRUCT dis );
}

注意q个抽象cL作的工作。在构造函CQ它调用操作pȝҎ己加入了BS_OWNERDRAW风格。如果没有这一步,那么操作pȝ不 会把q个按钮视ؓ自绘的按钮,也不会向其发送Q何绘制消息。接下来是WM_DRAWITEM消息的响应函数。在q个函数中,我们单的把必要的l制参数? 取出来,然后调用抽象ҎownerDraw去进行实际的l制工作。Q何从OwnerDrawButtoncL生的按钮对象必须重蝲此ownerDraw ҎQ来军_如何l制自n?br /> 作ؓ一个例子,我实C一个具体的按钮cR这个按钮用从上至下的渐变色背景d整个按钮Q然后绘制出按钮的文字? 如果当前按钮被按下,该类q调整了一下文字的位置Q以昄?#8220;按下”的外观效果。代码稍微有些长Q这是因为消息函数所提供的是一个操作系l才了解的原? HDC对象Q而不是我们所熟悉的GCc,因此也需要相应的用原生APIq行处理。不q,其原理是相当单的——你只需要在l出的HDC上画Z惌的Q? 效果p了?br />
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.win32.*;
import org.eclipse.swt.widgets.*;

public class TestButton extends OwnerDrawButton
{
TestButton( Composite parent )
{
super( parent, SWT.PUSH );
}

@Override
protected void ownerDraw( DRAWITEMSTRUCT dis )
{
Rectangle rc = new Rectangle( dis.left, dis.top, dis.right - dis.left,dis.bottom - dis.top );
Color clr1 = new Color( getDisplay(), 0, 255, 128 );
Color clr2 = new Color( getDisplay(), 0, 128, 255 );
fillGradientRectangle( dis.hDC, rc, true, clr1, clr2 );
clr1.dispose();
clr2.dispose();

SIZE size = new SIZE();
String text = getText();
char[] chars = text.toCharArray();
int oldFont = OS.SelectObject( dis.hDC, getFont().handle );
OS.GetTextExtentPoint32W( dis.hDC, chars, chars.length, size );
RECT rcText = new RECT();
rcText.left = rc.x;
rcText.top = rc.y;
rcText.right = rc.x + rc.width;
rcText.bottom = rc.y + rc.height;
if ( (dis.itemState & OS.ODS_SELECTED) != 0 )
OS.OffsetRect( rcText, 1, 1 );
OS.SetBkMode( dis.hDC, OS.TRANSPARENT );
OS.DrawTextW( dis.hDC, chars, -1, rcText, OS.DT_SINGLELINE | OS.DT_CENTER | OS.DT_VCENTER );
OS.SelectObject( dis.hDC, oldFont );
}

private void fillGradientRectangle( int handle, Rectangle rc,boolean vertical, Color clr1, Color clr2 )
{
final int hHeap = OS.GetProcessHeap();
final int pMesh = OS.HeapAlloc( hHeap, OS.HEAP_ZERO_MEMORY,GRADIENT_RECT.sizeof + TRIVERTEX.sizeof * 2 );
final int pVertex = pMesh + GRADIENT_RECT.sizeof;

GRADIENT_RECT gradientRect = new GRADIENT_RECT();
gradientRect.UpperLeft = 0;
gradientRect.LowerRight = 1;
OS.MoveMemory( pMesh, gradientRect, GRADIENT_RECT.sizeof );

TRIVERTEX trivertex = new TRIVERTEX();
trivertex.x = rc.x;
trivertex.y = rc.y;
trivertex.Red = (short)(clr1.getRed() << 8);
trivertex.Green = (short)(clr1.getGreen() << 8);
trivertex.Blue = (short)(clr1.getBlue() << 8);
trivertex.Alpha = -1;
OS.MoveMemory( pVertex, trivertex, TRIVERTEX.sizeof );

trivertex.x = rc.x + rc.width;
trivertex.y = rc.y + rc.height;
trivertex.Red = (short)(clr2.getRed() << 8);
trivertex.Green = (short)(clr2.getGreen() << 8);
trivertex.Blue = (short)(clr2.getBlue() << 8);
trivertex.Alpha = -1;
OS.MoveMemory( pVertex + TRIVERTEX.sizeof, trivertex, TRIVERTEX.sizeof );

boolean success = OS.GradientFill( handle, pVertex, 2, pMesh, 1,vertical ? OS.GRADIENT_FILL_RECT_V : OS.GRADIENT_FILL_RECT_H );
OS.HeapFree( hHeap, 0, pMesh );

if ( success )
return;
}

@Override
protected void checkSubclass()
{}
}

如果你用的是JDK 1.4或者更低的版本Q请把@Override标记L以后才能~译Q因是一?a target="_blank">Java 5.0中才有的Ҏ。此外,我重载了checkSubclassҎq提供了一个空的实玎ͼ如果不这么做的话Q那么SWT在默认情况下是不允许你从Buttoncȝ承的?br />
q个地方请允许我E稍跑一下题。上面代码中的fillGradientRectangleҎ——从它的名字你大概可以猜刎ͼq个Ҏ的作用是d一? 渐变色的矩Ş区域。我是从GC.fillGradientRectangle?#8220;?#8221;来的代码Q针Ҏ钮类作了一些修改就可以了。让我感到讶异的是,在整 理这D代码的时候,我发CSWT中调用Win32 API实在是太方便了——比我原先猜想的q要Ҏ得多。即便是微Y的P/Invoke也要比这ȝ。当Ӟq很大程度上要归功于SWT系l函数很好的? 装在了一个OS静态类中。(如果你不知道P/Invoke是什么的话,单的说它是微Y?Netq_中提供的、用来调用系lAPI和自定义DLL中的 Ҏ的技术)?br />
上面那些l图的代码基本上是Windows SDK的编E风根{因为我本h有很多这斚w的开发经验,所以这些代码对我来说是相当清晰且直观的。不q我估计Ua的JavaE序员或许对q段代码不会有很 大的好感。理ZԌ我可以把q些代码用更加OO的方式包装v来,从而看上去能好看一些。不q,本文的目的在于讲q实现技术,用包装的话反而会破坏效果? 如果你感兴趣的话Q也可以试自己来包装一下?br />
需要讲解的地方到这里就全部l束了。ؓ了完整v见,我把E序框架cȝ代码也列在下面,但是不做什么说明——基本上每个SWTE序中这D代码都是大同小异的?br />
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;

public class Application
{
public static void main( String[] args )
{
Display display = Display.getDefault();
Shell shell = new Shell( display );
init( shell );

shell.pack();
shell.open();
while ( !shell.isDisposed() )
{
if ( !display.readAndDispatch() )
display.sleep();
}
}

private static void init( Shell shell )
{
shell.setText( "Owner Draw Button Test" );
FillLayout layout = new FillLayout();
layout.marginWidth = layout.marginHeight = 8;
shell.setLayout( layout );

Button btn = new TestButton( shell );
btn.setText( "Owner Draw Button" );
btn.setToolTipText( "Hello, I'm a OwnerDraw Button!" );
}
}

下面是程序运行的界面。尽这q远不上完——真正的按钮q应该考虑Q是否能够和用户的Q何配|下Q特别是有窗口主题的时候也能正常工作? 完美的按钮实现可能需要至数百行的代码才行。不q对本文的目的来_q样已经_了。可惜的是按下按钮的效果无法从图中体玎ͼ你可以自p行一下这个程 序来体验一下实际的感觉?

seal 2008-04-10 22:41 发表评论
]]>
Eclipse SWT应用E序目的打包与部vQ{载)http://www.aygfsteel.com/sealyu/archive/2008/04/10/191999.htmlsealsealThu, 10 Apr 2008 14:40:00 GMThttp://www.aygfsteel.com/sealyu/archive/2008/04/10/191999.htmlhttp://www.aygfsteel.com/sealyu/comments/191999.htmlhttp://www.aygfsteel.com/sealyu/archive/2008/04/10/191999.html#Feedback0http://www.aygfsteel.com/sealyu/comments/commentRss/191999.htmlhttp://www.aygfsteel.com/sealyu/services/trackbacks/191999.htmlEclipse SWT应用E序目的打包与部v                                      

当项目完成后接下来的是打包发行了,应用E序QApplicationQ项目和Eclipse插g目QpluginQ的打包是不同的Q本章将分别介绍两者的打包ҎQƈl出实际的打包例子?br />

7.1  应用E序目的打包与发行

7.1.1  ?/h3>

       Java应用E序目完成后是可以qEclipseq行的,要运行程序先要打它打成一个JAR包,它打包的大部份方法和标准Java的AWT/SWING的打包方法一P主要有以下几个要?/p>

l           MANIFEST.MF Q? 打包清单。它是打包的关键性文Ӟ主要是设|执行入口类和支持库的\径,在运行Java应用E序时是要根据此文g中给出的信息来查扑օ口类和支持库?/p>

l           支持? Q如果Java应用E序用到了一些Eclipse包,那么必dq些包也复制到程序运行目录,否则E序无法运行。如swtlg支持包swt.jarQ? jfacelg支持包jface.jar。这些包都要在MANIFEST.MF文g中设|好?/p>

l           本地化文?Q?如果用到了SWTlgQ则q需要将SWT的本地化文gswt-win32-3063.dllQ?063是版本号Q复制到E序q行目录Q否则程序将无法q行?/p>

7.1.2  打包的具体操作步?/h3>

本节用前几章开发的SWT/JFace目"myswt"的打包ؓ例,来介l打包应用程序项目的Ҏ?/p>

1、编辑清单MANIFEST.MF

Q?QEclipse提供了用于打包项目的"导出"向导Q但本例q行此向g前先需要创Z个MANIFEST.MF清单文gQ其内容如下Q?/p>

Manifest-Version: 1.0

Main-Class: book.chapter_4.wizard_dialog.WizardDialog1

Class-Path: ./lib/swt.jar ./lib/jface.jar ./lib/runtime.jar

说明Q?/p>

l           Manifest-Version Q?指定清单文g的版本号

l           Main-Class Q?指定E序q行的入口类。本例设?.5.2节开发的向导式对话框。注意:cd后不要加class扩展?/p>

l           Class-Path Q? 指定支持库的路径?."指程序运行目录,卛_出的JAR包所在目录。程序运行时依据Class-Path的讄路径来查找支持库。每一个支持库之间? I格隔开。在q里jface.jar需要用到runtime.jar包,所以runtime.jar包也要加入到Class-Path中?/p>

l           除了入口cȝ包名和类名之外,其他讄w不分大小写,比如QClass-Path写成class-path或CLASS-PATH也可以,swt.jar写成SWT.JAR也行?/p>

Q?Q将清单文g保存下来Q徏议放在myswt目的根目录下。它的文件名可以L取,本例取名为manifes.txtQEclipse向导在打包时会自动的manifes.txt的内容复制到JAR包的META-INF目录下的MANIFEST.MF文g中?/p>

2、用Eclipse"导出"向导来打包项?/p>

Q?Q右键单击myswt目的项目名Q在弹出菜单中选择"导出"。在弹出的如下图7.1所C的对话框中Q选择"JAR文g"Q单?下一??/p>

?.1  导出对话?/p>

Q?Q如下图7.2所C,右边不需要的文g都取消勾选。在"选择导出目标"Ҏ本框中设|JAR包的输出路径和包名(可以L取名Qؓ"D:"myswt_application"myswt.jar"。接受其他的默认讄不变Q单?下一??/p>

附注Q左边虽焉择了src目录Q但源文件ƈ不会导出到包中,除非N了"导出Java源代码文件和资源"V?/p>

?.2  选择导入文g

Q?Q如下图7.3所C,接受默认讄不变Q单?下一??/p>

?.3  导出cȝ选项

Q?Q这一步较关键。如下图7.4所C,选择"从工作空间中使用现有清单",创建的清单文g输入Q也可以通过旁边?览"按钮来选择清单文g。输入清单文件后Q单?完成"QEclipse开始将目打包?/p>

?.4  清单文g讄

       l过以上四步后,?D:"myswt_application"路径下生成了一个名?myswt.jar"的文件。myswt.jar是一个ZIP? 式的压羃文gQ可以用WinRAR或WinZip软g打开Q也是说用q两个Y件也可以替代Eclipse向导来打包文件。如果用WinRAR来打包文 Ӟ则压~格式要选择ZIP格式而非RAR格式Q压~率倒可以Q意选?/p>

用WinRAR打开myswt.jar文g后其内部的目录结构如下图7.5所C:

?.5  myswt.jar文g的内部目录结?/p>

       在myswt.jar文g的内部目录META-INF中仅一个文ӞMANIFEST.MFQ它和以前创建的清单文gmanifest.txt的内Ҏ一LQ如下:

Manifest-Version: 1.0

Class-Path: ./lib/swt.jar ./lib/jface.jar ./lib/runtime.jar

Main-Class: book.chapter_4.wizard_dialog.WizardDialog1

3、复制Java应用E序的支持包及本地化文g

在MANIFEST.MF文g中的Class-Path设|了三个包,从Eclipse的plugins目录中将此三个支持包复制到D:" myswt_application"lib目录Q本地化文gswt-win32-3063.dll复制到D:"myswt_application目录 中。此三个文g在Eclipse中的路径为:

plugins"org.eclipse.swt.win32_3.0.1"ws"win32"swt.jar

plugins"org.eclipse.jface_3.0.0"jface.jar

plugins"org.eclipse.core.runtime_3.0.1"runtime.jar

plugins"org.eclipse.swt.win32_3.0.1"os"win32"x86"swt-win32-3063.dll

       复制完成后的目录l构如下?.6所C:

?.6  目录l构?/p>

4、编写运行myswt.jar包的批处理程?run.bat"

在myswt_application目录下创Z个批处理E序run.batQ名字Q取,扩展名必LbatQ,其内容仅一句语句,如下Q?/p>

javaw -jar myswt.jar

       说明Q?/p>

l           javaw对应c:"jdk"jre"bin"javaw.exe文gQ如果windows提示命o未发玎ͼ则需要将c:"jdk"jre"bin路径加入到windows环境变量path中?/p>

l           在运行程序的时候有一个讨厌的黑色命o行窗口,要去掉它Q可以将run.bat内容更改如下Q?start javaw -jar myswt.jar"Qstart是指调用了windows?q行"命o?/p>

l           如果惛_swt-win32-3063.dll也放在单独的目录中,?D:"myswt_application"native"目录Q则需run.bat内容更改为:

start javaw -Djava.library.path=./native/ -jar myswt.jar

5、运行程?/p>

双击run.bat文gQ得到如下图7.7所C的E序界面?/p>

?.7  E序q行效果?/p>

6、注意事?/p>

本例只需要三个支持包Q但你的E序也许会需要更多的支持包才能运行。如果你想一ơ到位,则可以将"Java构徏路径"??选项卡中所有引用的? 都复制到lib目录中。如果你喜欢用到什么包才加入什么包Q希望维持打包文件的z,则需要自׃步步的去试:如果~少某支持包Q运行程序时会输出的未找 到类的错误信息,从信息中的包名可得知E序~少哪一个支持包。比?Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jface/wizard/IWizard"Q从错误信息中很明显的就能知道程序缺jface?/p>

7.1.3  其他得到JAR包的方式

       要得到JAR包除了以上所说的用Eclipse"导出"向导、用WinZip和WinRARQ另外还能用Java自带的命令行式打包Y件jar.exeQ位于c:"jdk"bin目录Q,其打包命令ؓQ?/p>

c:"jdk"bin"jar cvfm myswt.jar C:"eclipse3.0.1"eclipse"workspace"myswt"manifest.txt -C C:"eclipse3.0.1"eclipse"workspace"myswt"bin .

       说明Q?/p>

l           c:"jdk"bin"jar Q?׃本书没有把c:"jdk"bin加入到windows环境变量path中,所以手工指定jar.exe的\?/p>

l           cvfm Q?jar.exe的参敎ͼ"c"创徏新的jar包;"v"调试信息打印在屏幕上;"f"指定生成的jar文g名;"m"使用清单文g。注意它们都是小?/p>

l           myswt.jar Q?打包后的JAR包名

l           在前面是把清单文件manifest.txt攑֜C:"eclipse3.0.1"eclipse"workspace"myswt"目录下。如果将它和批处理文件放在一个目录就不必指定镉K的\径了?/p>

l           "-C 路径 . "指将路径下(包括子目录)的所有文件打包,׃class文g是输出在目的bin目录下,所以\径指定到目的bin目录Q注意三者之间是用空格隔开Qƈ且最后一个字W是数炏V?/p>

q种方式的优Ҏ没有Eclipse导出向导的操作那么麻烦,适合l常需要导出JAR包的情况?/p>

7.1.4  使用W三Ҏ件对目打包

开源组l(http://sourceforge.net/Q中有一Ƒ֏Eclipse支持包和目~译文g一hC个包中的插gQ叫"Fat Jar"Q它的下载地址?http://fjep.sourceforge.net/"Q具体下载不再说明,安装步骤参阅W?章SWT Designer的安装?/p>

Fat Jar的用步骤如下:

Q?Q右键单击myswt目的项目名Q可见菜单中多了一?Build Fat Jar"Q如下图7.8所C,选择"Build Fat Jar"V?/p>

?.8  右键菜单

Q?Q在下图7.9所C的对话框中Q?Jar-Name"填入JAR包的输出路径。文件清?Manifest"不用填Q默认会自动创徏一个?Main-Class"填入程序的入口cR其他都接受默认|单击"下一??/p>

?.9  输出配置

       Q?Q如下图7.10所C,H口中将myswt目所用到的支持包都列了出来。我们仅N图中runtime.jar、swt.jar? jface.jarq三即可,当然全选也q尝不可Q只是最后得到的JAR包会更大一些,因ؓFat Jar会将所有支持包合ƈ在一个JAR包中?/p>

?.10  选择要打包的文g

单击?.10?完成"按钮后, JAR包myswt.jar输出到D:"myswt_applicationh目录中。和以前一P要运行此JAR包需要一个批处理文g以及本地化文? swt-win32-3063.dllQ唯一不同的是不再需要Eclipse支持包,其目录结构如下图7.11所C:

?.11  目录l构

       Z么不需要Eclipse支持包了呢?那是因ؓ支持包已l在myswt.jar文g中了Q从下图7.12可以看到swt.jar{都被拆散成目录Qƈ包含在myswt.jar包中?/p>

?.12  myswt.jar的内部目录结?/p>

       其中META-INF目录的MANIFEST.MF文g内容如下Q可以发现和以前不同的地ҎQClass-PathҎ有了?/p>

Manifest-Version: 1.0

Created-By: Fat Jar Eclipse Plug-In

Main-Class: book.chapter_4.wizard_dialog.WizardDialog1

7.1.4  让用L脑不必安装JRE环境

       通常q行JavaE序有个前提条gQ用L脑必d安装JRE环境。虽然安装JRE环境非常单,但毕竟多了一步,是有一点点的瑕c这里给Z个不必让用户安装JRE环境的方法,其实现步骤如下:

       Q?Q将原JDK中的"jre"目录复制?D:"myswt_application"java1.4.2"目录下(java1.4.2也可换成其他名称Q?/p>

Q?Q将JDK和JRE从本机卸载掉Q这栯C本机没有安装JAVAq行环境?/p>

Q?Q修Ҏ处理文grun.bat中的命o?start java1.4.2"jre"bin"javaw -jar myswt.jar"Q仅仅是在javaw前加上了一个相对应路径?/p>

双击run.bat卛_在不安装JRE环境的电脑运行此Java应用E序?/p>

7.1.5  更进一步的完善

1、抛弃批处理文gQ?.batQ?/p>

用批处理文gq行E序g不够专业Q虽然它以完成q行d。但习惯p一U毒药一旦染上就很难摆脱它的影响QWindowsl治下的Z早已l习惯运行扩展名是EXE的程序,?.bat他们׃感觉别扭?/p>

我们可以用一个叫JavaLauncher的免费小E序来代替批处理文g去运行JavaE序。JavaLauncher的下载网址是:

http://www.rolemaker.dk/nonRoleMaker/javalauncher/marner_java_launcher.htm

下蝲下来的文件是一个名JavaLauncher.zip的压~包Q解压后的目录结构如下图7.13所C:

?.13  JavaLauncher.zip目录l构

在上囄目录?/p>

l           source目录包含了JavaLauncher的源E序Q是用C语言写的

l           changes.txt是新版的修改说明

l           launch.exe是主E序

l           launcher.cfg是配|文?/p>

l           readme.txt是一些说明和CZ

我们只需要launch.exe、launcher.cfg两个文gQ将q两个文件复制到打包文g所在的目录。launcher.cfg是一个仅三行内容的文本文Ӟ它修改如下Q?/p>

.

."java1.4.2"jre"bin"javaw.exe

-jar myswt.jar

l           W一行设|指向JAR包myswt.jar的目录,׃launch.exe和myswt.jar同在一个目录,所以用"."卛_前目录?/p>

l           W二行设|指向jre"bin"javaw.exe的\径。在上一节Q?.1.4节)已将jre目录复制Cjava1.4.2子目录中

配置好launcher.cfg后,双击launch.exe卛_q行java应用E序?/p>

如果仔佃研究eclipse的启动方式,发现eclipse和JavaLauncher的原理一Peclipse.exe相当? launch.exeQstartup.jar相当于myswt.jar。只不过eclipse.exe不象launch.exe要具有通用性,所以它? ?.cfgq样的配|文Ӟ而是启动信息固化在eclipse.exe中?/p>

2、美化图?/p>

launch.exe文g的图标太单调了,让我们给它换个好看点的。换E序的图标需要用C个免费的软gQResource HackerQ它有中文版Q下载网址是:

http://www.users.on.net/johnson/resourcehacker/

用Resource Hacker来替换launch.exe的图标的步骤如下Q?/p>

Q?Q运行Resource HackerQ得到如下图7.14所C的H口?/p>

?.14  Resource Hacker的主界面

Q?Q单M菜单"文g→打开"Q将launch.exe载入到程序中Q结果如下图7.15所C?/p>

?.15  载入Lanunch.exe之后的界?/p>

Q?Q如上图Q选择左边?图标→1→1030"Q然后右键单?1030",选择"替换资源..."。如下图7.16所C,在弹出窗口中单击"打开新图标文?Q选择一个满意的图标Q然后单?替换"按钮?/p>

附注Q图标文件可以是exe、dll、res、icoQ该软g可以从exe、dll、res抽取出图标,本例选择的是java的一个图标文件JavaCup.ico?/p>

?.16  选择图标文g

Q?Q如下图7.17所C,选择"文g→另存?Q取名myswt.exe?/p>

附注Q按理说选择"保存"也是可以的,q时Resource Hacker会将老的launch.exe备䆾成launch_original.exe。但也许是刷C有问题,?保存"方式有时launch.exe无法昄出新图标Q但有时又可以?/p>

?.17  保存修改

Q?Q最后的目录如下?.18所C,可见myswt.exeQ也是launch.exe改了个名Uͼ的图标换成了Java的图标。双击myswt.exe卛_q行Java应用E序?/p>

?.18  最后的效果

3、最后的打包

发送给用户之前Q通常要用WinZip或WinRAR所有的文g全部打成一个压~包Q然后用户得到这个压~包后,其解压~后卛_q行E序QEclipse软g是q种方式?/p>

另一U方式是用InstallShield、InstallAnyWhereq样的安装程序制作Y件来创徏一个单一的setup.exe文gQ它h向导式的安装界面Q而且q可以往windows的程序栏插入菜单,关于q些安装E序制作软g的具体用请参阅相关书籍?/p>



seal 2008-04-10 22:40 发表评论
]]>
修改 SWT browserc,dgetText()Ҏhttp://www.aygfsteel.com/sealyu/archive/2008/04/10/191997.htmlsealsealThu, 10 Apr 2008 14:35:00 GMThttp://www.aygfsteel.com/sealyu/archive/2008/04/10/191997.htmlhttp://www.aygfsteel.com/sealyu/comments/191997.htmlhttp://www.aygfsteel.com/sealyu/archive/2008/04/10/191997.html#Feedback0http://www.aygfsteel.com/sealyu/comments/commentRss/191997.htmlhttp://www.aygfsteel.com/sealyu/services/trackbacks/191997.html阅读全文

seal 2008-04-10 22:35 发表评论
]]>
վ֩ģ壺 ͤ| ͸| ѽ| | Ҧ| ۰| | | | | ٲ| ն| | ƽ| | ³ľ| Ž| | | ɽ| | | | | ͨɽ| ʡ| Ƥɽ| | ƽ| | γ| ͼ| | | | ʢ| | | ̰| ԭƽ| ǰ|