﻿<?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-lishen226-随笔分类-Swing</title><link>http://www.blogjava.net/lishen226/category/39439.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 Oct 2009 04:37:09 GMT</lastBuildDate><pubDate>Tue, 20 Oct 2009 04:37:09 GMT</pubDate><ttl>60</ttl><item><title>[转]Swing学习笔记之swing渲染基本原理</title><link>http://www.blogjava.net/lishen226/archive/2009/10/20/298927.html</link><dc:creator>锋行</dc:creator><author>锋行</author><pubDate>Tue, 20 Oct 2009 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/lishen226/archive/2009/10/20/298927.html</guid><wfw:comment>http://www.blogjava.net/lishen226/comments/298927.html</wfw:comment><comments>http://www.blogjava.net/lishen226/archive/2009/10/20/298927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lishen226/comments/commentRss/298927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lishen226/services/trackbacks/298927.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf">Swing学习笔记之swing渲染基本原理</font></p>
<p><font style="background-color: #cce8cf">主要内容：事件，绘制，渲染，双缓冲，线程</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">一、 事件</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">1、事件来源：本地系统，应用程序本身</font></p>
<p><font style="background-color: #cce8cf">2、所有的事件都存储在一个队列里面</font></p>
<p><font style="background-color: #cce8cf">3、Java.awt.EventQueue从队列中取数据并派发，EventQueue的派发机制由单独的线程EDT（Event Dispatch Thread）处理。</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">二、绘制</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">1、绘制请求发起：awt或者swing本身、对swing发起请求</font></p>
<p><font style="background-color: #cce8cf">2、异步重绘请求：所有异步请求都是repaint()的变体，包括整个组建的绘制和组建某个区域的绘制</font></p>
<p><font style="background-color: #cce8cf">3、同步绘制请求：Jcomponent.paintImmediately()和Component.paint()</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">三、渲染</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">1、画家算法</font></p>
<p><font style="background-color: #cce8cf">2、paintComponent()</font></p>
<p><font style="background-color: #cce8cf">3、paint()</font></p>
<p><font style="background-color: #cce8cf">4、setpaque()</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">四、双缓冲</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">五、线程</font></p>
<p><font style="background-color: #cce8cf">1、swing线程包括：主线程（应用程序的主方法），工具包线程（扑获系统事件），EDT（将扑获的线程派发）</font></p>
<p><font style="background-color: #cce8cf">2、线程模型：单一的规则，所以要遵从此规则，尽量将事件让EDT进行派发。</font></p>
<p><font style="background-color: #cce8cf">3、invokeLater()</font></p>
<p><font style="background-color: #cce8cf">4、isEventDispatchThread()</font></p>
<p><font style="background-color: #cce8cf">5、invokeAndWait</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">六、定时器和事件派发</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">1、java.util.Timer</font></p>
<p><font style="background-color: #cce8cf">2、javax.swing.Timer</font></p>
<p><font style="background-color: #cce8cf">&nbsp;</font></p>
<p><font style="background-color: #cce8cf">七、SwingWorker</font></p>
<p><font style="background-color: #cce8cf">1、done()</font></p>
<p><font style="background-color: #cce8cf">2、doInBackground()</font></p>
<p><font style="background-color: #cce8cf">3、get</font></p>
<p><font style="background-color: #cce8cf">4、process</font></p>
<img src ="http://www.blogjava.net/lishen226/aggbug/298927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lishen226/" target="_blank">锋行</a> 2009-10-20 09:26 <a href="http://www.blogjava.net/lishen226/archive/2009/10/20/298927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]GridBagLayout和GridBagConstraints</title><link>http://www.blogjava.net/lishen226/archive/2009/05/21/271992.html</link><dc:creator>锋行</dc:creator><author>锋行</author><pubDate>Thu, 21 May 2009 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/lishen226/archive/2009/05/21/271992.html</guid><wfw:comment>http://www.blogjava.net/lishen226/comments/271992.html</wfw:comment><comments>http://www.blogjava.net/lishen226/archive/2009/05/21/271992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lishen226/comments/commentRss/271992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lishen226/services/trackbacks/271992.html</trackback:ping><description><![CDATA[<p>自己想做个小程序，却在布局上犯了难，使用FlowLayout和BorderLayout这些功能不够强大，使用GridBagLayout却不会，只好求助于文档了。</p>
<p>文档对这个布局管理器介绍很详细，但是最痛苦的是英文。不过幸好它有实例，经过在网上查阅和推敲实例，终于对GridBagLayout的使用有了一个成型的了解，拿出来与大家分享。</p>
<p>GridBagLayout是一个灵活的布局管理器，部件如果想加入其中需借助GridBagConstraints，其中有若干个参数，解释如下：</p>
<p>gridx/gridy：组件的横纵坐标</p>
<p>gridwidth：组件所占列数，也是组件的宽度</p>
<p>gridheight：组件所占行数，也是组件的高度</p>
<p>fill：当组件在其格内而不能撑满其格时，通过fill的值来设定填充方式，有四个值</p>
<p>ipadx： 组件间的横向间距</p>
<p>ipady：组件间的纵向间距</p>
<p>insets：当组件不能填满其格时，通过insets来指定四周（即上下左右）所留空隙</p>
<p>anchor：同样是当组件不能填满其格时，通过anchor来设置组件的位置，anchor有两种值，绝对和相对的值分别有&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 若干个，文档中有，可自行查看</p>
<p>weightx：行的权重，通过这个属性来决定如何分配行的剩余空间</p>
<p>weighty：列的权重，通过这个属性来决定如何分配列的剩余空间</p>
<p>&nbsp;</p>
<p>还是文档实用，用例子来说话</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>import java.awt.*;</p>
<p>&nbsp;import java.util.*;</p>
<p>&nbsp;import java.applet.Applet;</p>
<p>&nbsp;</p>
<p>&nbsp;public class GridBagEx1 extends Applet {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; protected void makebutton(String name,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridBagLayout gridbag,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridBagConstraints c) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Button button = new Button(name);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gridbag.setConstraints(button, c);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add(button);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public void init() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridBagLayout gridbag = new GridBagLayout();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridBagConstraints c = new GridBagConstraints();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setFont(new Font("SansSerif", Font.PLAIN, 14));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setLayout(gridbag);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.fill = GridBagConstraints.BOTH;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.weightx = 1.0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button1", gridbag, c);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button2", gridbag, c);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button3", gridbag, c);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.gridwidth = GridBagConstraints.REMAINDER; //end row</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button4", gridbag, c);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.weightx = 0.0;&nbsp;&nbsp; //reset to the default</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button5", gridbag, c); //another row</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last in row</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button6", gridbag, c);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; c.gridwidth = GridBagConstraints.REMAINDER; //end row</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button7", gridbag, c);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; c.gridwidth = 1;&nbsp;&nbsp;&nbsp;&nbsp; //reset to the default</p>
<p>&nbsp;&nbsp;&nbsp; c.gridheight = 2;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.weighty = 1.0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button8", gridbag, c);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.weighty = 0.0;&nbsp;&nbsp; //reset to the default</p>
<p>&nbsp;&nbsp;&nbsp; c.gridwidth = GridBagConstraints.REMAINDER; //end row</p>
<p>&nbsp;&nbsp;&nbsp; c.gridheight = 1;&nbsp;&nbsp; //reset to the default</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button9", gridbag, c);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makebutton("Button10", gridbag, c);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setSize(300, 100);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {</p>
<p>&nbsp;&nbsp;&nbsp; Frame f = new Frame("GridBag Layout Example");</p>
<p>&nbsp;&nbsp;&nbsp; GridBagEx1 ex1 = new GridBagEx1();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; ex1.init();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; f.add("Center", ex1);</p>
<p>&nbsp;&nbsp;&nbsp; f.pack();</p>
<p>&nbsp;&nbsp;&nbsp; f.setSize(f.getPreferredSize());</p>
<p>&nbsp;&nbsp;&nbsp; f.setVisible(true);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;}</p>
<p>&nbsp;</p>
<p>可以自行运行，查看其结果</p>
<p>文档对其各个按钮的参数设定解释如下：</p>
<p><br />
Button1, Button2, Button3: weightx = 1.0 <br />
Button4: weightx = 1.0, gridwidth = GridBagConstraints.REMAINDER <br />
Button5: gridwidth = GridBagConstraints.REMAINDER <br />
Button6: gridwidth = GridBagConstraints.RELATIVE <br />
Button7: gridwidth = GridBagConstraints.REMAINDER <br />
Button8: gridheight = 2, weighty = 1.0 <br />
Button9, Button 10: gridwidth = GridBagConstraints.REMAINDER </p>
<p>&nbsp;</p>
<p>对照着程序和运行结果，还有其参数设定，我的理解如下： </p>
<p>第一行：第一行之所以有四个按钮，关键点在于，weightx=1.0，这样就可以在前边的按钮后继续加入按钮，而button4成为行尾是因为其gridwidth = GridBagConstraints.REMAINDER，这句话就设定它是行的末尾。 <br />
第二行：既然第一行都有末尾了，那么再加入按钮的话，必定是另起一行了（这个道理）。此时加入了button5，而button5又被设定为了本行的最后一个（gridwidth = GridBagConstraints.REMAINDER），加之它又是第二行的第一个按钮，所以第二行只有一个按钮，就是button5。 <br />
第三行：button6不可避免的成为了第一个按钮，它被设定了gridwidth = GridBagConstraints.RELATIVE，表明button6要紧挨它前边的那个按钮和最后的那个按钮，也就是说它一定是倒数第二个按钮（为最后一个按钮的出现做好了准备）。button7出现了，由于有gridwidth = GridBagConstraints.REMAINDER，它就为第三行封了口。第三行结束。 <br />
第四行：这一行有一个特殊的按钮button8，它的设定为gridheight = 2, weighty = 1.0，即它占用两行一列（其实这个一列和两行都是相对的）。这一行还没封口，所以后面来的button9加在了这一行，因为它gridwidth = GridBagConstraints.REMAINDER，所以第四行封口。 <br />
第五行：这一行button8已经占据了第一个的位置（因为button8的gridheight=2），所以后来的button10加在第二，同样由于gridwidth = GridBagConstraints.REMAINDER，第五行封口。 </p>
<p>要理解GridBagLayout，最好从例子的理解开始，呵呵。 <br />
网上还有另外几篇介绍它的文章，大家也可参考 <br />
http://blog.163.com/everlee@126/blog/static/263574220089621157826/ <br />
http://hi.baidu.com/zml1003/blog/item/43728f6ee02a7bd980cb4afc.html <br />
文章出处：DIY部落(http://www.diybl.com/course/3_program/java/javajs/20090405/164188.html)</p>
 <img src ="http://www.blogjava.net/lishen226/aggbug/271992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lishen226/" target="_blank">锋行</a> 2009-05-21 15:34 <a href="http://www.blogjava.net/lishen226/archive/2009/05/21/271992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]困扰了我一天的GridBagLayout终于解决了！</title><link>http://www.blogjava.net/lishen226/archive/2009/05/21/271854.html</link><dc:creator>锋行</dc:creator><author>锋行</author><pubDate>Thu, 21 May 2009 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/lishen226/archive/2009/05/21/271854.html</guid><wfw:comment>http://www.blogjava.net/lishen226/comments/271854.html</wfw:comment><comments>http://www.blogjava.net/lishen226/archive/2009/05/21/271854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lishen226/comments/commentRss/271854.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lishen226/services/trackbacks/271854.html</trackback:ping><description><![CDATA[首先GridBagLayout这个布局治理器类只有一个构造函数；但是它必须和GridBagConstraints这个它的约束对象一起使用来设置组件的大小和位置！ <br />
<br />
说到这里不得不说GridBagConstraints的几个至关重要的属性fill , anchor, gridx, gridy, weightx, weighty , gridwidth, gridheight , insets ipdax ,ipday <br />
<br />
首先FILL的作用就是当组件的大小小于它的显示区域的时候设置是否改变它的大小由它的几个常量值GridBagConstraints.BOTH/NONE/VERTICAL/HORIZONTAL决定！ <br />
<br />
接着就是gridx,gridy这是组件的放置位置就不用说了 <br />
<br />
gridwidth ,gridheight这是扩大组件的显示区域的大小的一个是水平一个是垂直的 <br />
<br />
还有就是anchor是组件小于显示区域的时候组件的默认放置位置也就是东南西北中几个属性值 <br />
<br />
还有就是insets是几个组件的间距它有个构造函数new INSETS(a,b,c,d) 分别是上中下右的间距 <br />
<br />
还有就是内部的艰巨ipdax ipday 还有weightx weighty用来设置窗口变大时，各组件跟着变大的比例，当数字越大，表示组件能得到更多的空间，默认值皆为0。当然还有其它很多小细节 我很懒所以自己去官方的API
<div class="Hir246"></div>
<br />
<br />
你不要看说得这么简单但你要深刻体会其中的精髓却不轻易！！！！！！！！！！！ <br />
<br />
我自己的总结：当你设置组件的大小的时候务必要设置FILL属性假如不设那么任你怎么设置GRIDWIDTH 和GRIDHEIGHT的值那个组件是肯定不会变的还是默认值给 <br />
<br />
莫慌啊在想想啊 哦 还有当你设置了FILL为GridBagConstraints.BOTH的话你假如其它的组件不重新改设FILL那肯定水平会随着你的应用程序窗口慢慢拉大而变长！所以要记者 假如不想被拉大就必须重设它的值 <br />
<br />
还有gridwidth 和gridheight官方说的是改变显示区域的大小 但是我自己认为应该是长和宽的比例给 <br />
<br />
还有REMAINDER和RELATIVE这两个属性也很重要其中的自己慢慢体会因为用在GridBagConstraints的不同的属性上效果也不同所 <br />
<br />
RELATIVE <br />
指定此组件为其行或列（gridwidth、gridheight）中的倒数第二个组件，或者让此组件紧跟在以前添加的组件（gridx、gridy）之后 <br />
<br />
REMAINDER <br />
指定此组件是其行或列中的最后一个组件 <br />
<br />
（（ 而且默认拉大窗口不会增大显示区域 而且假如设置了 gridwidth = GridBagConstraints.REMAINDER那么即使设置了WEIGHTX=0.0这个组件和它的左面一个也会拉大！ <br />
<br />
其中的好处自己以后设计GUI是就会慢慢体会了 <br />
<br />
似乎现在只记得这么多了 <br />
<br />
假如以后想起会写的 <br />
<br />
因为我当初为了这个去BAIDU GOOGLE去搜遍了感觉都是些书书上的样 说得不太清楚 <br />
<br />
所以希望学这个的不要走弯路！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！祝大家设计GUI做得越来越漂亮！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！ <br />
<img src ="http://www.blogjava.net/lishen226/aggbug/271854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lishen226/" target="_blank">锋行</a> 2009-05-21 09:30 <a href="http://www.blogjava.net/lishen226/archive/2009/05/21/271854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>