??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品一区二,蜜桃麻豆www久久国产精品 ,婷婷久久国产对白刺激五月99http://www.aygfsteel.com/ruislan/一字解天下Q一文释情愁zh-cnTue, 17 Jun 2025 00:06:38 GMTTue, 17 Jun 2025 00:06:38 GMT60表达式求解的思?/title><link>http://www.aygfsteel.com/ruislan/archive/2011/11/09/363270.html</link><dc:creator>ruislan</dc:creator><author>ruislan</author><pubDate>Wed, 09 Nov 2011 02:36:00 GMT</pubDate><guid>http://www.aygfsteel.com/ruislan/archive/2011/11/09/363270.html</guid><wfw:comment>http://www.aygfsteel.com/ruislan/comments/363270.html</wfw:comment><comments>http://www.aygfsteel.com/ruislan/archive/2011/11/09/363270.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ruislan/comments/commentRss/363270.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ruislan/services/trackbacks/363270.html</trackback:ping><description><![CDATA[     摘要: 很久没有回来q里写技术BLOG了,q里的氛围还行,大家都对一个问题积极的思考(臛_之前q里l我的感觉是q样的)Q?q里面自׃忙着做些事情Q没有写Q最q有IZ写写,偶尔会去oschine.net看看新闻Q然后就在那里看C一个h提出的问题很有意思,是怎么表达式求解,例如(1 + 2) / 3 - 1 * 2 + 5 / (3 + 2)q样的字W串输入Q怎么栯析之后输出结果。说来也好笑Q对于我...  <a href='http://www.aygfsteel.com/ruislan/archive/2011/11/09/363270.html'>阅读全文</a><img src ="http://www.aygfsteel.com/ruislan/aggbug/363270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ruislan/" target="_blank">ruislan</a> 2011-11-09 10:36 <a href="http://www.aygfsteel.com/ruislan/archive/2011/11/09/363270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vista风格的Buttonhttp://www.aygfsteel.com/ruislan/archive/2009/09/12/294829.htmlruislanruislanSat, 12 Sep 2009 04:54:00 GMThttp://www.aygfsteel.com/ruislan/archive/2009/09/12/294829.htmlhttp://www.aygfsteel.com/ruislan/comments/294829.htmlhttp://www.aygfsteel.com/ruislan/archive/2009/09/12/294829.html#Feedback3http://www.aygfsteel.com/ruislan/comments/commentRss/294829.htmlhttp://www.aygfsteel.com/ruislan/services/trackbacks/294829.html阅读全文

ruislan 2009-09-12 12:54 发表评论
]]>
利用server.xml来做路径映射http://www.aygfsteel.com/ruislan/archive/2008/02/15/180105.htmlruislanruislanFri, 15 Feb 2008 08:41:00 GMThttp://www.aygfsteel.com/ruislan/archive/2008/02/15/180105.htmlhttp://www.aygfsteel.com/ruislan/comments/180105.htmlhttp://www.aygfsteel.com/ruislan/archive/2008/02/15/180105.html#Feedback3http://www.aygfsteel.com/ruislan/comments/commentRss/180105.htmlhttp://www.aygfsteel.com/ruislan/services/trackbacks/180105.html
最q客h了个改动,客户|站上图片存攄目录需要改动一下。例如在|上讉K是www.aygfsteel.com/images/*.*Q在服务器上的目录是D:/<webroot>/images/*.*,客户xq个images目录下的资源全部Ud到E:/data/里面去,但是在网上www.aygfsteel.com/images/*.*q是同样可以讉K得到Q我刚开始犯了Ş式主义的错误Q老是想用E序解决Q一会filterQ一会servlet/actionQ后来我配置E序的时候突然看Cserver.xmlQ于是我惛_了选择用映的方式。正好,server.xml中的<Context>是做这个事情的。于是乎我们?lt;Host></Host>中增加了一?lt;Context docBase="E:/data/images" path="/images">,OK,重启之后Q所有检索www.aygfsteel.com/images路径下的资源实际上都由E:/data/images下的资源提供了?br />


ruislan 2008-02-15 16:41 发表评论
]]>
NIO的DeadLockhttp://www.aygfsteel.com/ruislan/archive/2007/12/13/167574.htmlruislanruislanThu, 13 Dec 2007 10:31:00 GMThttp://www.aygfsteel.com/ruislan/archive/2007/12/13/167574.htmlhttp://www.aygfsteel.com/ruislan/comments/167574.htmlhttp://www.aygfsteel.com/ruislan/archive/2007/12/13/167574.html#Feedback3http://www.aygfsteel.com/ruislan/comments/commentRss/167574.htmlhttp://www.aygfsteel.com/ruislan/services/trackbacks/167574.html
/**
 * @(#)DeadLock.java  v0.1.0  2007-12-13
 
*/
package ruislan.rswing.test;

import java.net.InetSocketAddress;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.concurrent.Executors;

/**
 * NIO DeadLock
 * 
 * 
@author ruislan <a href="mailto:z17520@126.com"/>
 * 
@version 0.1.0
 
*/
public class DeadLock {
    
public static void main(String[] args) throws Exception {
        Service service 
= new Service();
        Executors.newSingleThreadExecutor().execute(service);

        SocketChannel channel 
= SocketChannel.open();
        channel.configureBlocking(
false);
        channel.connect(
new InetSocketAddress("http://www.aygfsteel.com"80));
        service.addChannel(channel);
    }

    
static class Service implements Runnable {
        Selector selector;

        
public Service() {
        }

        
public void run() {
            
try {
                selector 
= Selector.open();
                
while (true) {
                    selector.select();
                    System.out.println(selector.selectedKeys().size());
                }
            } 
catch (Exception e) {
            }
        }

        
public void addChannel(SocketChannel channel) {
            
try {
                channel.register(selector, SelectionKey.OP_CONNECT
                        
| SelectionKey.OP_READ);
                System.out.println(
"can reach here?when pigs fly!");
            } 
catch (ClosedChannelException e) {
                e.printStackTrace();
            }
        }
    }
}


乍看之下Q我们的代码没有问题Q但是运行之后你会发玎ͼq句System.out.println("can reach here?when pigs fly!");永远无法执行Q也是说register()Ҏ被阻塞了QOh god blessQ让我们看看JavaDoc是怎么说的Q?br />
...
可在L旉调用此方法。如果调用此Ҏ的同时正在进行另一个此Ҏ?configureBlocking Ҏ的调用,则在另一个操作完成前首先阻塞该调用。然后此Ҏ在选择器的键集上实现同步,因此如果调用此方法时q发地调用了涉及同一选择器的另一个注册或选择操作Q则可能d此方法的调用?br /> ...

看这?#8220;可在L旉调用此方法?#8221;Q也是说我们调用的旉没有M限制Q而阻塞的情况只会出现?#8220;如果调用此方法的同时正在q行另一个此Ҏ?configureBlocking Ҏ的调?#8221;的情况下Q即便是d了,我相?#8220;正在q行另一个此Ҏ或configureBlocking”也不会花掉太多的旉Q况且这里没有上面这L情况出现。那register()是被谁挡住了Q或者是BUGQ?br />
我们来分析一下程序,E序有两个线E主U程和ServiceU程Q主U程启动后启动了ServiceU程QServiceU程启动Selector然后ServiceU程陷入select()的阻塞中Q同ӞȝE调用Service的addChannel()Ҏ来添加一个SocketChannelQ嗯Q两个线E之间唯一的联pd是selectorQ看来要从selectorLU烦Q很可惜Qselector的实现没有源代码可查Q不q可以肯定是channel的register()会调用selector的register()Q虽然此时持有selector的ServiceU程被select()Ҏ所dQ但是ƈ不媄响其他线E对其操作吧Q那么,剩下的解释就是Selector的select()Ҏ和register()Ҏ公用了一个锁Qselect()Ҏd住了Q所以register()拿不到这个锁了,那么q样一来我们就只能保证让select()或者register()不能同时调用或者register()调用的时候select()不持有这个锁Q也是说我们要用ServiceU程自己来执行addChannel()ҎQ所以改q如下:

/**
 * @(#)DeadLock.java  v0.1.0  2007-12-13
 
*/
package ruislan.rswing.test;

import java.net.InetSocketAddress;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * NIO DeadLock
 * 
 * 
@author ruislan <a href="mailto:z17520@126.com"/>
 * 
@version 0.1.0
 
*/
public class DeadLock {
    
public static void main(String[] args) {
        Service service 
= new Service();
        
new Thread(service).start();
        
for (int i = 0; i < 5; i++) {
            
new Thread(new ChannelAdder(service)).start();
        }
    }

    
static class ChannelAdder implements Runnable {
        
private Service service;

        
public ChannelAdder(Service service) {
            
this.service = service;
        }

        @Override
        
public void run() {
            
try {
                SocketChannel channel 
= SocketChannel.open();
                channel.configureBlocking(
false);
                channel.connect(
new InetSocketAddress(
                        
"http://www.aygfsteel.com"80));
                service.addChannel(channel);
            } 
catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    
static class Service implements Runnable {
        
private Selector selector;
        
private Queue<SocketChannel> pendingRegisters;

        
public Service() {
            pendingRegisters 
= new LinkedBlockingQueue<SocketChannel>();
        }

        
public void run() {
            
try {
                selector 
= Selector.open();
                
while (true) {
                    selector.select();
                    System.out.println(selector.selectedKeys().size());
                    handlePendingRegisters();
                }
            } 
catch (Exception e) {
            }
        }

        
public void handlePendingRegisters() {
            
while (!pendingRegisters.isEmpty()) {
                SocketChannel channel 
= pendingRegisters.poll();
                
try {
                    channel.register(selector, SelectionKey.OP_CONNECT);
                    System.out.println(
"can reach here?yeah!");
                } 
catch (ClosedChannelException e) {
                    e.printStackTrace();
                }
            }
        }

        
public void addChannel(SocketChannel channel) {
            pendingRegisters.offer(channel);
            selector.wakeup();
        }
    }
}


新的代码Q我们在Service的线E提供了一个待处理Channel队列Q然后在d一个SocketChannel到队列中时唤醒这个selectorQ取消阻塞,然后在Service的@环中处理q个pendingChannelQ这样就避免q个Deadlock的发生了。当然我们亦可以在那个代码上select的超时时间设|非常的短,然后让两个线E去竞争Q这样做有太多的不可控性,不推荐了?br />


ruislan 2007-12-13 18:31 发表评论
]]>
UI的h性设?/title><link>http://www.aygfsteel.com/ruislan/archive/2007/11/11/159705.html</link><dc:creator>ruislan</dc:creator><author>ruislan</author><pubDate>Sun, 11 Nov 2007 05:36:00 GMT</pubDate><guid>http://www.aygfsteel.com/ruislan/archive/2007/11/11/159705.html</guid><wfw:comment>http://www.aygfsteel.com/ruislan/comments/159705.html</wfw:comment><comments>http://www.aygfsteel.com/ruislan/archive/2007/11/11/159705.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ruislan/comments/commentRss/159705.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ruislan/services/trackbacks/159705.html</trackback:ping><description><![CDATA[    UI作ؓ用户与电脑的交互界面Q如何更好的服务于hQ让Z用v来方ѝ简单、快捷一直是UI开发者应该有的觉悟,作ؓ开发h员的我们来说Q不应该只是把UI推给电脑q面设计人员Q更不应该一手包办了Q如果你不是一个h的话Q。我们开发h员常常在开发UI的时候避重就轻,基本上都在强调code的美学,模式的应用而忽略了真实用户的感受。我们常常得意于自己技术的丽Q而将一些比自己水^低的应用嗤之以E。但是用户却从来不关心代码是如何写的Q他们关心这个应用是否对他们有用Q顺手乎Q聪明乎Q所以如果我们只是美丽于自己的设计,太关注Y件的本n而忽略了用户的感受,p某些象牙塔里拿着钱做些无用的研究的h没什么两P或许有个丽的名词,ZU学?br />     那么如何才能是好的UI人性化的设计呢Q这个得看针对的用户主要是哪些。我们熟知的操作pȝWindows XP,Windows VistaQVista是微软最新的操作pȝQ包含了很多开发h员辛苦的l晶Q但是在我n边的很多人都不愿意装它,也包括一些新ȝ调查也说Vista不如当年XPZ那般火爆Q他们大多数不愿装的都说了同L话,XP都还有很多不懂,怕Vista更搞不懂Q说实话我用qVistaQ就我这么一个算是业内h士用h当然驾轻qQ再加上我们都有勇于创新的精,所以常常去用新的东西,而普通客户就不这么想了,我问了几个不懂电脑才安装了Vista的用L感受Q?#8220;开始菜单的‘开?#8217;两个字没有了Q我q以为换了位|?#8221;Q?#8220;界面比XP漂亮啊,但是我的机器好像有点慢,是不是要讄个什么啊”……再来我们熟知的AJAXQ我已经接到q很多次不同的hl我的电话,?#8220;Z么网|开的时候突然好卡了Q以前不q样啊?”Q?#8220;|页览不了Q老说L候,数据加蝲中,{了很久Q就是不出现”……面对q些电话或许我们会说Q你们怎么那么W啊Q它卡是因ؓ在下东西Q在执行JSQ写JS的h太垃圾,费了资源,不出现就h啊,不要览那个不专业的|站了,{等OK了等{回{,其实很多时候我们可以避免用L问题出现Q例如你的AJAX的JS太大的时候,可以先提C用戯Q数据量较大Q请E后Q如果长旉无反应,h览器的h按钮Q或者尝试按下F5键?br />     我还见过许多软g鼓吹自己的功能如何强大,如何厉害Q多么的人性化Q但是我打开他们的YӞ居然发现只能用鼠标操作!Q这是多么大的UI设计p|Q在举一个例子,MSN和QQ两个IMQ如果你用MSNQ在联系人框里按上下的话QMSN会很聪明的明白你是要选择上一位或者下一位联pMhQ而QQ会很聪明的明白你是要拖动滑动?@#$Q还有很多Y件记忆力太差Q不我如何操作Q它是C住,关闭软g重新启动后又回到了最初的模样Q还有的软g自信心不I一再问?#8220;你确定吗Q?#8221;Q?#8220;真的要这样做吗?”Q?#8220;或许您不心点了Q?#8221;而我只是在点关闭q个׃性质的Y件而已Q而有些Y件又特胆肥,做了一个不可恢复的操作然q提C都没有Q还有的软g文化太差Q常常把一个按钮或者图标该表达的含义弄得模׃可,以至于常常让我们会错意,做错操作Q或者把一些高风险的操作放在常用操作的旁边Q很Ҏ炚wQ还有的把不常用的操作也攑ֈ常用操作区,q不告诉用户怎么LQ这L例子不胜枚D?br />     出现q些问题的原因在于我们与用户之间的思维方式有着很大的不同。例如在写文章之前我才将老爸从我的电脑椅上请下来Q请下来之前他正在看我吃饭前的网—?#8220;界面九宫?#8221;Q我说您能看得懂嘛,他说“不懂Q不q这软g的界面不都这样嘛Q再说了Q一张纸?个方位,加上中间正好九个Q你的东西不摆这里摆哪里啊?”Q我正要解释一下这与Y件设计的关系Q但是突然一惻I是啊Q有道理啊,要是我给他老h家再解释一下可以放在上面和下面Q那不就?D的了。再比如我一直都很不屑一儡|络实名Q但是当它被我在很多人的机器里面消灭之后Q很多h都打电话问我Q怎么在地址栏里面输入汉字,跛_搜烦界面了,不是那个汉字的网站了Q以前是有的Q原来我只看C它流氓的一面,忽略了普通用hҎC住网址在哪里,甚至有些用户不懂英文Q你怎么让他记得住全是英文的|址呢?不过q了几天Q他们都说不用了Q有一个网站导航网址做了他们的主,他们qx惛_的网站都在上面列着的,我后来才知道Q就是被我以前同寝室的删除了半天的hao123。所以我们必d分考虑我们的应用是针对哪些用户Q他们是哪一cMhQ习惯是什么,当然q有是UI设计的一些基本的东西Q例如鼠标能够完成的动作Q同样键盘也能完成等{?br /> <br /> <img src ="http://www.aygfsteel.com/ruislan/aggbug/159705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ruislan/" target="_blank">ruislan</a> 2007-11-11 13:36 <a href="http://www.aygfsteel.com/ruislan/archive/2007/11/11/159705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Swing中的U程http://www.aygfsteel.com/ruislan/archive/2007/11/04/158055.htmlruislanruislanSun, 04 Nov 2007 04:40:00 GMThttp://www.aygfsteel.com/ruislan/archive/2007/11/04/158055.htmlhttp://www.aygfsteel.com/ruislan/comments/158055.htmlhttp://www.aygfsteel.com/ruislan/archive/2007/11/04/158055.html#Feedback2http://www.aygfsteel.com/ruislan/comments/commentRss/158055.htmlhttp://www.aygfsteel.com/ruislan/services/trackbacks/158055.html
Swing中的U程有三U:初始U程Q事件线E,工作U程

q三U线E基本上包括了让一个GUI完美工作的方斚w面,首先Q初始线E被用来创徏GUIlg、资源加载和启动GUIlgQ众所周知QSwing是事仉动的Q所以当UI出现了之后,初始U程完成了它的使命Qƈ接力棒交给了事件线E?Event Dispatch ThreadQ这个时候所有组件的事g行ؓ都交l了q个U程d理,当然我们自己也要需要用U程来运行许多Q务,优秀的GUIE序是绝不能让界面被卡死不动的,那会让用户崩溃,所以这个时候就需要工作线E了Q也可以说是在背后运行的U程Q这U线E是力_阶QQ劳Q怨的执行者长旉的工作?br />
初始U程的写法很单,q样可以了Q?br />
SwingUtilities.invokeLater(new Runnable() {
    
public void run() {
        initGUI();
        showGUI();
    }
}

但是Applet中,你可能需要调用SwingUtilities.invokeAndWaitq个ҎQ要是initҎq回了,览器开始展现AppletQ但是GUI的创在thread中,出错也是可想而知的?br /> 至于invokeLater和invokeAndWaitq两个线E的单点的区别就是invokeLater是异步的Q你不知道它什么时候会开始执行,invokeAndWait则是同步的,它会{到动作执行完成之后才返回?br />
Event Dispatch Thread不是U程安全的,所以要用线E来与它打交道要注意了,同步问题L让h头痛?br />
?.5之前应该说工作线E都是由开发h员自己去定义的,但是现在Swing推荐了SwingWorkerq个c,包括Swing最新的W合JSR标准的Swing AppFramework也用了SwingWorkerq个cL处理所有在GUI背后做的事情?br />
了解了Swing中的U程定义Q能够让我们更好的写Z的ZSwing的GUIE序?br />


ruislan 2007-11-04 12:40 发表评论
]]>
UI的癫狂(FengGUI介绍Q?/title><link>http://www.aygfsteel.com/ruislan/archive/2007/10/27/156393.html</link><dc:creator>ruislan</dc:creator><author>ruislan</author><pubDate>Sat, 27 Oct 2007 12:34:00 GMT</pubDate><guid>http://www.aygfsteel.com/ruislan/archive/2007/10/27/156393.html</guid><wfw:comment>http://www.aygfsteel.com/ruislan/comments/156393.html</wfw:comment><comments>http://www.aygfsteel.com/ruislan/archive/2007/10/27/156393.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ruislan/comments/commentRss/156393.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ruislan/services/trackbacks/156393.html</trackback:ping><description><![CDATA[很多人都说我们这行的人是偏执狂,我也觉得我是有一点倔脾气,像看连l剧Q从W一集开始一直到最后一集才会关上电脑,一旦一个研I开始,׃定要有一个结果或者o自己满意的结果才l束Q但是当我看到这?#8220;偏执?#8221;之后Q我觉得我只是稍微有一点偏执而已?br /> 研究UIl制的时候很Ҏ陷入另外一个领域,囑փ领域Q或者是游戏领域Q我不喜Ƣ做游戏是因为我q游戏Q如果玩和工作绑在一起了的话Q那么工作之后的休闲׃是工作了?br /> 好了Q说了点废话Q下面是对FengGUI的介l?<br /> FengGUI是一个徏立在OpenGL上的GUI的APIQFengGUI提供了很多标准的UIlgQ像ButtonQTextField,Panel之类的,下面先看看截图:<img alt="" src="http://www.fenggui.org/lib/exe/detail.php?id=doc%3Aexamples%3Aexamples&cache=cache&media=doc:examples:buttonexample.png" /><br /> <img alt="" src="http://www.fenggui.org/lib/exe/fetch.php?cache=cache&media=doc:examples:buttonexample.png" height="469" width="592" /><br /> GridLayout的截?br /> <img alt="" src="http://www.fenggui.org/lib/exe/fetch.php?cache=cache&media=doc:examples:gridlayoutexample.png" height="469" width="592" /><br /> 可分割的面板<br /> <img alt="" src="http://www.fenggui.org/lib/exe/fetch.php?cache=cache&media=doc:examples:splitcontainerexample.png" /><br /> <br /> 要说到最大的特色Q莫q于FengGUIZOpenGLQƈ且可以在lg里面直接使用OpenGLQ可以轻杄集成jME(java Monkey EngineQ一个非常棒的Java 3D游戏引擎Q?jogl(Java OpenGL API),lwjglQ轻量Java游戏库)QjPCT(同样非常的Java 3D游戏引擎Q,但是在跑它的demo时我也感受到了CPU 80% 工作率的压力Q所以就目前的我肤浅的了解,用它来做普通的GUIE序估计qؓ时有ҎQ但是如果是游戏中的lg的话实是与上述引擎和API的非常好的补充?br /> <img src ="http://www.aygfsteel.com/ruislan/aggbug/156393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ruislan/" target="_blank">ruislan</a> 2007-10-27 20:34 <a href="http://www.aygfsteel.com/ruislan/archive/2007/10/27/156393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Swing透明和变?/title><link>http://www.aygfsteel.com/ruislan/archive/2007/10/21/154689.html</link><dc:creator>ruislan</dc:creator><author>ruislan</author><pubDate>Sun, 21 Oct 2007 05:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/ruislan/archive/2007/10/21/154689.html</guid><wfw:comment>http://www.aygfsteel.com/ruislan/comments/154689.html</wfw:comment><comments>http://www.aygfsteel.com/ruislan/archive/2007/10/21/154689.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ruislan/comments/commentRss/154689.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ruislan/services/trackbacks/154689.html</trackback:ping><description><![CDATA[    以前或许大家对一个UIlg是否透明没有那么兛_Q但是自从Vista的毛ȝ出现后,UI透明成了大安常关注的一个话题,于是Java阵营开始了铺天盖地的讨论如何实现透明的效果,但是很不q的是无论组件如何透明和变换,但是能够攄于屏qQ何位|的Window一族就是没法透明和变形,原生代码的问题还是交l原生代码来解决吧?br />     自己写原生代码是可怕的Q特别是Ҏq种只知道Java的^凡程序员Q所以我们得借助一个非常方便的跨^台的调用OS function方便的LibQJNA便是最佳选择Q那个谁Q这里不是讨论JRuby&JPython的)?br />     so, all robots, transform!<br />     下面我们要做一个界面是圆角四边形的Q中间有一个滑动条来滑动调节透明度。先看看做好的截图?br />      <img src="http://www.aygfsteel.com/images/blogjava_net/ruislan/tr1.jpg" alt="" border="0" height="182" width="238" /> <img src="http://www.aygfsteel.com/images/blogjava_net/ruislan/tr2.jpg" alt="" border="0" height="173" width="230" /> <img src="http://www.aygfsteel.com/images/blogjava_net/ruislan/tr3.jpg" alt="" border="0" height="170" width="216" /><br />     注意图中的JFrame边角已经变成了圆弧,滑动滑块QJFrame开始透明Q桌面的图标昄出来Q下面是代码?br />     <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;"><br />  * @(#)TransparentFrame.java  v0.1.0  2007-10-21<br />  </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">package</span><span style="color: #000000;"> ruislan.rswing.test;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.BorderLayout;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.Color;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.Container;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.Dimension;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.Toolkit;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.event.ActionEvent;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.event.ActionListener;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.geom.RoundRectangle2D;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> javax.swing.JButton;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> javax.swing.JFrame;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> javax.swing.JLabel;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> javax.swing.JPanel;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> javax.swing.JSlider;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> javax.swing.border.LineBorder;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> javax.swing.event.ChangeEvent;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> javax.swing.event.ChangeListener;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> com.sun.jna.examples.WindowUtils;<br /> <br /> </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />  * Transparent JFrame use JNA<br />  * <br />  * </span><span style="color: #808080;">@author</span><span style="color: #008000;"> ruislan <a href="mailto:z17520@126.com"/><br />  * </span><span style="color: #808080;">@version</span><span style="color: #008000;"> 0.1.0<br />  </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> TransparentFrame {<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> JFrame frame;<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> JPanel container;<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> JSlider slider;<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> JPanel titleBar;<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> JLabel titleLabel;<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> JButton closeButton;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {<br />         </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> TransparentFrame().launch();<br />     }<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> launch() {<br />         createUI();<br />         launchUI();<br />     }<br /> <br />     </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> launchUI() {<br />         frame.setVisible(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />     }<br /> <br />     </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> createUI() {<br />         System.setProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">sun.java2d.noddraw</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         frame </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> JFrame();<br />         frame.setSize(</span><span style="color: #000000;">200</span><span style="color: #000000;">, </span><span style="color: #000000;">150</span><span style="color: #000000;">);<br />         frame.setAlwaysOnTop(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />         frame.setUndecorated(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br /> <br />         container </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> JPanel();<br />         frame.setContentPane(container);<br />         container.setLayout(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BorderLayout());<br />         container.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> JLabel(</span><span style="color: #000000;">"</span><span style="color: #000000;">Ubunto vs Vista, I like both.</span><span style="color: #000000;">"</span><span style="color: #000000;">),<br />                 BorderLayout.CENTER);<br />         container.setBorder(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> LineBorder(Color.BLACK));<br /> <br />         titleBar </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> JPanel();<br />         titleBar.setLayout(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BorderLayout());<br />         titleLabel </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> JLabel(</span><span style="color: #000000;">"</span><span style="color: #000000;">JNA is great!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         titleBar.add(titleLabel, BorderLayout.CENTER);<br />         titleBar.setBorder(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> LineBorder(Color.GRAY));<br />         closeButton </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> JButton(</span><span style="color: #000000;">"</span><span style="color: #000000;">X</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         closeButton.setFocusPainted(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />         closeButton.addActionListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ActionListener() {<br />             @Override<br />             </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> actionPerformed(ActionEvent e) {<br />                 System.exit(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />             }<br />         });<br />         titleBar.add(closeButton, BorderLayout.EAST);<br />         container.add(titleBar, BorderLayout.NORTH);<br /> <br />         slider </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> JSlider(</span><span style="color: #000000;">0</span><span style="color: #000000;">, </span><span style="color: #000000;">100</span><span style="color: #000000;">);<br />         slider.setValue(</span><span style="color: #000000;">100</span><span style="color: #000000;">);<br />         slider.addChangeListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ChangeListener() {<br />             @Override<br />             </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> stateChanged(ChangeEvent e) {<br />                 </span><span style="color: #0000ff;">float</span><span style="color: #000000;"> value </span><span style="color: #000000;">=</span><span style="color: #000000;"> slider.getValue();<br />                 WindowUtils.setWindowAlpha(frame, value </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">0.01f</span><span style="color: #000000;">);<br />             }<br />         });<br />         container.add(slider, BorderLayout.SOUTH);<br />         RoundRectangle2D.Float mask </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> RoundRectangle2D.Float(</span><span style="color: #000000;">0</span><span style="color: #000000;">, </span><span style="color: #000000;">0</span><span style="color: #000000;">, frame<br />                 .getWidth(), frame.getHeight(), </span><span style="color: #000000;">20</span><span style="color: #000000;">, </span><span style="color: #000000;">20</span><span style="color: #000000;">);<br />         WindowUtils.setWindowMask(frame, mask);<br />         centerWindow(frame);<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> centerWindow(Container window) {<br />         Dimension dim </span><span style="color: #000000;">=</span><span style="color: #000000;"> Toolkit.getDefaultToolkit().getScreenSize();<br />         </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> w </span><span style="color: #000000;">=</span><span style="color: #000000;"> window.getSize().width;<br />         </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> h </span><span style="color: #000000;">=</span><span style="color: #000000;"> window.getSize().height;<br />         </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> x </span><span style="color: #000000;">=</span><span style="color: #000000;"> (dim.width </span><span style="color: #000000;">-</span><span style="color: #000000;"> w) </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />         </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> y </span><span style="color: #000000;">=</span><span style="color: #000000;"> (dim.height </span><span style="color: #000000;">-</span><span style="color: #000000;"> h) </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />         window.setLocation(x, y);<br />     }<br /> }<br /> </span></div> <br />     利用JNA来制作透明效果非常单,只需要调?span style="color: #000000;">WindowUtils.setWindowAlpha(window, alpha</span><span style="color: #000000;">)可以了。当然这是JNA特别为UI写的工具代码。如果要改变形状Q用WindowUtils.setWindowMask(window, shape)或者WindowUtils.setWindowMask(window, icon)可以了Q但是要注意一点必设|?/span><span style="color: #000000;">System.setProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">sun.java2d.noddraw</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">)Q否则JNA会告诉你q个E序不支持透明。当然要q行hQ还得需要两个JarQ?a title="jna.jar" >jna.jar</a> ?<a title="examples.jar" >examples.jar</a> Q都不是很大Q只?00多K?br />     虽然q篇文章只是介绍了一下JNA关于Swing的简单用法,但是有了q个我最先到的便是可以做cM于Yahoo Widget和Google Widget之类的东西了Q还可以做好看的fishEye,SideBarQJNA的JAR两个合v来不q?00KQ却能让q么多复杂的事情单化Q真是精湛的艺术啊,嗯?br /> </span><br /> <img src ="http://www.aygfsteel.com/ruislan/aggbug/154689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ruislan/" target="_blank">ruislan</a> 2007-10-21 13:43 <a href="http://www.aygfsteel.com/ruislan/archive/2007/10/21/154689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>悄悄的我回来了正如我悄悄的离开http://www.aygfsteel.com/ruislan/archive/2007/10/20/154513.htmlruislanruislanSat, 20 Oct 2007 08:30:00 GMThttp://www.aygfsteel.com/ruislan/archive/2007/10/20/154513.htmlhttp://www.aygfsteel.com/ruislan/comments/154513.htmlhttp://www.aygfsteel.com/ruislan/archive/2007/10/20/154513.html#Feedback1http://www.aygfsteel.com/ruislan/comments/commentRss/154513.htmlhttp://www.aygfsteel.com/ruislan/services/trackbacks/154513.html
回来了先报告一个Blogjava的BUGQ就是用Opera9览器写文章时不能用鼠标点击~辑区,q好用TAB可以切换q来Q然后就是用Google输入法的话,标点W号和数字输入一ơ,~辑Z出来两个Q最后就是编辑完之后好像内容也保存不了,所以我又换回FF来编辑了?br />
回来了却不知从何开始了Q组件的攚w也抛砖引玉了Q当然如果你们喜Ƣ,我还可以l箋攚w)Q冰的E序要l改造的话就要开一个工E了大家集体参与了,所以那p是先从上ơ哪位仁兄提到的lg透明的问题,从那个开始吧Qshow time?br />


ruislan 2007-10-20 16:30 发表评论
]]>
改进“千里冰”的截屏E序之二——增加操作框http://www.aygfsteel.com/ruislan/archive/2007/09/14/145219.htmlruislanruislanFri, 14 Sep 2007 10:48:00 GMThttp://www.aygfsteel.com/ruislan/archive/2007/09/14/145219.htmlhttp://www.aygfsteel.com/ruislan/comments/145219.htmlhttp://www.aygfsteel.com/ruislan/archive/2007/09/14/145219.html#Feedback10http://www.aygfsteel.com/ruislan/comments/commentRss/145219.htmlhttp://www.aygfsteel.com/ruislan/services/trackbacks/145219.html 下面是改q后的截图:

正常的情况,右下角出C一个操作框

在三个(左、右、底Q边际的情况Q我们重新计了位置?br />
三个按钮q没有功能,也不是图片,但是我们QQ的截屏程序又q一步了Q嗯Q?br />


ruislan 2007-09-14 18:48 发表评论
]]>
վ֩ģ壺 | ʲ| | ̫| ľ| | Ͻ| | | ÷ӿ| | ƽ| | ƽ| Զ| ǭ| | Դ| | | | | | ٰ| | | ͬ| | | ͨ| ɽ| | | | «| | ¬| ͩ| ٳ| ָɽ| |