??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品成人精品456,国产精品男女,中文字幕一区二区三区电影http://www.aygfsteel.com/leon/category/2109.html<br> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;像写情书一样codingzh-cnTue, 27 Feb 2007 12:19:36 GMTTue, 27 Feb 2007 12:19:36 GMT60[Swing]?JFileChooser 中进行文仉证的技?/title><link>http://www.aygfsteel.com/leon/archive/2006/11/23/83023.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Thu, 23 Nov 2006 06:15:00 GMT</pubDate><guid>http://www.aygfsteel.com/leon/archive/2006/11/23/83023.html</guid><wfw:comment>http://www.aygfsteel.com/leon/comments/83023.html</wfw:comment><comments>http://www.aygfsteel.com/leon/archive/2006/11/23/83023.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/leon/comments/commentRss/83023.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/leon/services/trackbacks/83023.html</trackback:ping><description><![CDATA[ <p>我们在做GUI~程的时候经帔R要用到JFileChooserlg构造一个文仉取对话框来为用h供打开文g、保存文件等操作?br /><br />通常的做法是调用JFileChooser.showXXX()Ҏ(gu)昄文g选取对话框ƈ且选择一个文件后Q点?font face="Courier New"><font face="Times New Roman">Approve 按钮Q默认情况下标有 "Open" ?"Save"Q?/font>Q?/font>当对话框关闭后用JFileChooser.getSelectedFile()Ҏ(gu)得到选取的文Ӟ或用JFileChooser.getSelectedFiles()取得选取的文件数l)(j)Q然后再对被选取的文件有效性进行验证(例如Q文件的文g名是否合法、选取的\径下是否已有同名文g存在{等Q,如果验证不通过Q需要再ơ打开文g选择对话框进行选取?br /><br />昄Q验证没有通过的情况下Q文仉取对话框被反复的打开和关闭,影响用户体验?br /><br />我现在介l一个方法,在点M(jin)文g选取对话框上?font face="Courier New"><font face="Times New Roman">Approve 按钮</font>后,</font><font face="Times New Roman">文g选取对话框关闭前寚w取的文件进行验证,如果验证没有通过Q那么对话框不关闭,直接q行下一ơ选择?br /><br />查看JFileChooser的APIQ可以发现这样一个方?<u><font color="#000000"><strong>public void approveSelection()</strong></font></u> Q这个方法会(x)在用户单?Approve 按钮时由 UI 调用此方法。导致用等?<code>APPROVE_SELECTION</code> 的命令字W串Ȁ发一个操作事件?br /><br />那么Q我们现在可以选择l承JFileChooser再覆写这个方法,对选中文g的有效性验证写入这个方法中Q只有当验证通过时才调用类的approveSelection() 完成文g选取Q否则直接返回,l箋(hu)选择新的文g?br /><br />下面是我写的一个demo以供参考:(x)<br /><br />import java.io.File;<br />import javax.swing.JOptionPane;</font></p> <p> <font face="Times New Roman">/**<br /> (tng)* ?JFileChooser 中进行文仉证的技?br /> (tng)* @author Chen Wei<br /> (tng)* @email <a href="mailto:chenwei.mobi@gmail.com">chenwei.mobi@gmail.com</a><br /> (tng)*/<br />public class JFileChooserDemo extends javax.swing.JFileChooser{<br /> (tng) (tng) (tng) <br /> (tng) (tng) (tng) public void approveSelection(){<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) File file = getSelectedFile();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) // 验证文g名是否合?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (!validateFileName(file.getName())) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) JOptionPane.showMessageDialog(getParent(), "文g名不能包含下列Q何字W之一Q\n \\ / : * ? \" < > |");<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }else{<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) super.approveSelection();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) }<br /> (tng) (tng) (tng) <br /> (tng) (tng) (tng) /**<br /> (tng) (tng) (tng) (tng) * 验证输入字符串参数是否ؓ(f)有效文g名?br /> (tng) (tng) (tng) (tng) * @param name 待验证的文g名字W串?br /> (tng) (tng) (tng) (tng) * @return 通过验证Q文件名无效q回 falseQ有效返?true?br /> (tng) (tng) (tng) (tng) */<br /> (tng) (tng) (tng) public static boolean validateFileName(String name) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (name.indexOf('\\') != -1 || name.indexOf('/') != -1 ||<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) name.indexOf(':') != -1 || name.indexOf('*') != -1 ||<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) name.indexOf('?') != -1 || name.indexOf('"') != -1 ||<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) name.indexOf('<') != -1 || name.indexOf('>') != -1 ||<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) name.indexOf('|') != -1) {</font> </p> <p> <font face="Times New Roman"> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return false;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) } else {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return true;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) }<br /> (tng) (tng) (tng) <br /> (tng) (tng) (tng) public static void main(String[] args){<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) JFileChooserDemo chooser = new JFileChooserDemo();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) chooser.showOpenDialog(null);<br /> (tng) (tng) (tng) }<br />}</font> <br /> <br />E序q行截图Q?br /><img title="JFileChooserDemo.jpg" height="360" alt="JFileChooserDemo.jpg" src="http://www.aygfsteel.com/images/blogjava_net/leon/program/JFileChooserDemo.jpg" width="508" border="0" /></p> <img src ="http://www.aygfsteel.com/leon/aggbug/83023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/leon/" target="_blank">leon</a> 2006-11-23 14:15 <a href="http://www.aygfsteel.com/leon/archive/2006/11/23/83023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Image]使用 Java 2D 对图像进行羃?/title><link>http://www.aygfsteel.com/leon/archive/2006/08/27/66017.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Sun, 27 Aug 2006 10:41:00 GMT</pubDate><guid>http://www.aygfsteel.com/leon/archive/2006/08/27/66017.html</guid><wfw:comment>http://www.aygfsteel.com/leon/comments/66017.html</wfw:comment><comments>http://www.aygfsteel.com/leon/archive/2006/08/27/66017.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/leon/comments/commentRss/66017.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/leon/services/trackbacks/66017.html</trackback:ping><description><![CDATA[ <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"> <img id="Codehighlighter1_4_221_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_221_Open_Text.style.display='none'; Codehighlighter1_4_221_Closed_Image.style.display='inline'; Codehighlighter1_4_221_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_4_221_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_221_Closed_Text.style.display='none'; Codehighlighter1_4_221_Open_Image.style.display='inline'; Codehighlighter1_4_221_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #000000"> (tng) (tng) (tng) (tng)</span> <span id="Codehighlighter1_4_221_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** (tng)*/</span> <span id="Codehighlighter1_4_221_Open_Text"> <span style="COLOR: #008000">/**</span> <span style="COLOR: #008000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)~放 (tng)- (tng)参数指定目标囄放比例?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)</span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> (tng)srcImage (tng)源图像对象?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)</span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> (tng)xscale (tng)囑փ (tng)x (tng)_(d)宽度Q上的的~放比例?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)</span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> (tng)yscale (tng)囑փ (tng)y (tng)_(d)高度Q上的的~放比例?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)</span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> (tng)hints (tng)重新l图使用的?tng)RenderingHints (tng)对象?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)</span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000"> (tng)~放后的囑փ对象?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)</span> <span style="COLOR: #008000">*/</span> </span> <span style="COLOR: #000000"> <br /> <img id="Codehighlighter1_340_1007_Open_Image" onclick="this.style.display='none'; Codehighlighter1_340_1007_Open_Text.style.display='none'; Codehighlighter1_340_1007_Closed_Image.style.display='inline'; Codehighlighter1_340_1007_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_340_1007_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_340_1007_Closed_Text.style.display='none'; Codehighlighter1_340_1007_Open_Image.style.display='inline'; Codehighlighter1_340_1007_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> (tng) (tng) (tng) (tng)</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000"> (tng)BufferedImage (tng)scaleJ2D(BufferedImage (tng)srcImage, (tng)</span> <span style="COLOR: #0000ff">double</span> <span style="COLOR: #000000"> (tng)xscale, (tng)</span> <span style="COLOR: #0000ff">double</span> <span style="COLOR: #000000"> (tng)yscale, (tng)RenderingHints (tng)hints) (tng)</span> <span id="Codehighlighter1_340_1007_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_340_1007_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> (tng)width (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">) (tng)((</span> <span style="COLOR: #0000ff">double</span> <span style="COLOR: #000000">) (tng)srcImage.getWidth() (tng)</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> (tng)xscale);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> (tng)height (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">) (tng)((</span> <span style="COLOR: #0000ff">double</span> <span style="COLOR: #000000">) (tng)srcImage.getHeight() (tng)</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> (tng)yscale);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)AffineTransform (tng)affineTransform (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> (tng)AffineTransform();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)affineTransform.scale(xscale, (tng)yscale);<br /><img id="Codehighlighter1_624_741_Open_Image" onclick="this.style.display='none'; Codehighlighter1_624_741_Open_Text.style.display='none'; Codehighlighter1_624_741_Closed_Image.style.display='inline'; Codehighlighter1_624_741_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_624_741_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_624_741_Closed_Text.style.display='none'; Codehighlighter1_624_741_Open_Image.style.display='inline'; Codehighlighter1_624_741_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(hints (tng)</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)</span> <span id="Codehighlighter1_624_741_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_624_741_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)hints (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> (tng)RenderingHints(RenderingHints.KEY_RENDERING, (tng)RenderingHints.VALUE_RENDER_DEFAULT);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)AffineTransformOp (tng)affineTransformOp (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> (tng)AffineTransformOp( (tng)affineTransform, (tng)hints);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)BufferedImage (tng)dstImage (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> (tng)BufferedImage(width, (tng)height, (tng)srcImage.getType());<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> (tng)affineTransformOp.filter(srcImage, (tng)dstImage);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> (tng) (tng) (tng) (tng)}</span> </span> </div> <img src ="http://www.aygfsteel.com/leon/aggbug/66017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/leon/" target="_blank">leon</a> 2006-08-27 18:41 <a href="http://www.aygfsteel.com/leon/archive/2006/08/27/66017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Image]使用 Java 2D 彩色图像{换成灰度?/title><link>http://www.aygfsteel.com/leon/archive/2006/08/27/65992.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Sun, 27 Aug 2006 06:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/leon/archive/2006/08/27/65992.html</guid><wfw:comment>http://www.aygfsteel.com/leon/comments/65992.html</wfw:comment><comments>http://www.aygfsteel.com/leon/archive/2006/08/27/65992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/leon/comments/commentRss/65992.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/leon/services/trackbacks/65992.html</trackback:ping><description><![CDATA[ <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"> <img id="Codehighlighter1_4_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_133_Open_Text.style.display='none'; Codehighlighter1_4_133_Closed_Image.style.display='inline'; Codehighlighter1_4_133_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_4_133_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_133_Closed_Text.style.display='none'; Codehighlighter1_4_133_Open_Image.style.display='inline'; Codehighlighter1_4_133_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #000000"> (tng) (tng) (tng) (tng)</span> <span id="Codehighlighter1_4_133_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** (tng)*/</span> <span id="Codehighlighter1_4_133_Open_Text"> <span style="COLOR: #008000">/**</span> <span style="COLOR: #008000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)彩色图像{换ؓ(f)灰度图?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)</span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> (tng)srcImage (tng)源彩色图像?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)</span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> (tng)hints (tng)重新l图使用的?tng)RenderingHints (tng)对象?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)* (tng)</span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000"> (tng)目标灰度图?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> (tng) (tng) (tng) (tng) (tng)</span> <span style="COLOR: #008000">*/</span> </span> <span style="COLOR: #000000"> <br /> <img id="Codehighlighter1_229_787_Open_Image" onclick="this.style.display='none'; Codehighlighter1_229_787_Open_Text.style.display='none'; Codehighlighter1_229_787_Closed_Image.style.display='inline'; Codehighlighter1_229_787_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_229_787_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_229_787_Closed_Text.style.display='none'; Codehighlighter1_229_787_Open_Image.style.display='inline'; Codehighlighter1_229_787_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> (tng) (tng) (tng) (tng)</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000"> (tng)BufferedImage (tng)transformGrayJ2D(BufferedImage (tng)srcImage,RenderingHints (tng)hints) (tng)</span> <span id="Codehighlighter1_229_787_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_229_787_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)BufferedImage (tng)dstImage (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> (tng)BufferedImage(srcImage.getWidth(), (tng)srcImage.getHeight(), (tng)srcImage.getType());<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<br /><img id="Codehighlighter1_382_540_Open_Image" onclick="this.style.display='none'; Codehighlighter1_382_540_Open_Text.style.display='none'; Codehighlighter1_382_540_Closed_Image.style.display='inline'; Codehighlighter1_382_540_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_382_540_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_382_540_Closed_Text.style.display='none'; Codehighlighter1_382_540_Open_Image.style.display='inline'; Codehighlighter1_382_540_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> (tng)(hints (tng)</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">) (tng)</span> <span id="Codehighlighter1_382_540_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_382_540_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)Graphics2D (tng)g2 (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)dstImage.createGraphics();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)hints (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)g2.getRenderingHints();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)g2.dispose();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)g2 (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)ColorSpace (tng)grayCS (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)ColorSpace.getInstance(ColorSpace.CS_GRAY);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)ColorConvertOp (tng)colorConvertOp (tng)</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (tng)</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> (tng)ColorConvertOp(grayCS, (tng)hints);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)colorConvertOp.filter(srcImage, (tng)dstImage);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> (tng)dstImage;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> (tng) (tng) (tng) (tng)}</span> </span> </div> <img src ="http://www.aygfsteel.com/leon/aggbug/65992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/leon/" target="_blank">leon</a> 2006-08-27 14:33 <a href="http://www.aygfsteel.com/leon/archive/2006/08/27/65992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Image]使用 Java 2D 取得囑փ上指定位|像素的 rgb 颜色分量http://www.aygfsteel.com/leon/archive/2006/08/16/63838.htmlleonleonWed, 16 Aug 2006 02:55:00 GMThttp://www.aygfsteel.com/leon/archive/2006/08/16/63838.htmlhttp://www.aygfsteel.com/leon/comments/63838.htmlhttp://www.aygfsteel.com/leon/archive/2006/08/16/63838.html#Feedback0http://www.aygfsteel.com/leon/comments/commentRss/63838.htmlhttp://www.aygfsteel.com/leon/services/trackbacks/63838.html  (tng) (tng) (tng) (tng) /**
 (tng) (tng) (tng) (tng) (tng)* (tng)取得囑փ上指定位|像素的 (tng)rgb (tng)颜色分量?br /> (tng) (tng) (tng) (tng) (tng)* (tng)
@param  (tng)image (tng)源图像?br /> (tng) (tng) (tng) (tng) (tng)* (tng) @param  (tng)x (tng)囑փ上指定像素位|的 (tng)x (tng)坐标?br /> (tng) (tng) (tng) (tng) (tng)* (tng) @param  (tng)y (tng)囑փ上指定像素位|的 (tng)y (tng)坐标?br /> (tng) (tng) (tng) (tng) (tng)* (tng) @return  (tng)q回包含 (tng)rgb (tng)颜色分量值的数组。元素?tng)index (tng)由小到大分别对应 (tng)rQgQb?br /> (tng) (tng) (tng) (tng) (tng) */

 (tng) (tng) (tng) (tng)
public  (tng) static  (tng) int [] (tng)getRGB(BufferedImage (tng)image, int  (tng)x, int  (tng)y) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
int [] (tng)rgb (tng) =  (tng) null ;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
if (image (tng) !=  (tng) null  (tng) &&  (tng)x (tng) <  (tng)image.getWidth() (tng) &&  (tng)y (tng) <  (tng)image.getHeight()) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)rgb (tng)
=  (tng) new  (tng) int [ 3 ];
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
int  (tng)pixel (tng) =  (tng)image.getRGB(x,y);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)rgb[
0 ] (tng) =  (tng)(pixel (tng) &  (tng) 0xff0000 ) (tng) >>  (tng) 16 ;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)rgb[
1 ] (tng) =  (tng)(pixel (tng) &  (tng) 0xff00 ) (tng) >>  (tng) 8 ;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)rgb[
2 ] (tng) =  (tng)(pixel (tng) &  (tng) 0xff );
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return  (tng)rgb;
 (tng) (tng) (tng) (tng)}


使用q个Ҏ(gu)前需要先图像文件从盘?sh)读C?java.awt.image.BufferedImage 对象中,我们可以?J2SE 包含?ImageIO 库?/p>

try  (tng) {
 (tng) (tng) (tng) (tng)BufferedImage (tng)bi (tng)
=  (tng)I(yng)mageIO.read( new  (tng)File( "  (tng)test.jpg (tng) " ));
}
 (tng) catch  (tng)(IOException (tng)ex) (tng) {
 (tng) (tng) (tng) (tng)ex.printStackTrace();
}



leon 2006-08-16 10:55 发表评论
]]>
[Download] Java 2 囑Ş设计卷ⅠQAWThttp://www.aygfsteel.com/leon/archive/2006/06/21/54138.htmlleonleonWed, 21 Jun 2006 03:07:00 GMThttp://www.aygfsteel.com/leon/archive/2006/06/21/54138.htmlhttp://www.aygfsteel.com/leon/comments/54138.htmlhttp://www.aygfsteel.com/leon/archive/2006/06/21/54138.html#Feedback2http://www.aygfsteel.com/leon/comments/commentRss/54138.htmlhttp://www.aygfsteel.com/leon/services/trackbacks/54138.html
Java 2 囑Ş设计卷ⅠQAWT
Graphic Java 1.2 Mastering the JFC Volume ?AWT
[]David M.Geary ?马欣民等?br />机械工业出版C?br />
http://www.aygfsteel.com/Files/leon/Java2囑Ş设计?AWT.rar



leon 2006-06-21 11:07 发表评论
]]>
[zt] Swing是MVC设计的典?/title><link>http://www.aygfsteel.com/leon/archive/2006/06/13/52360.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Tue, 13 Jun 2006 02:28:00 GMT</pubDate><guid>http://www.aygfsteel.com/leon/archive/2006/06/13/52360.html</guid><wfw:comment>http://www.aygfsteel.com/leon/comments/52360.html</wfw:comment><comments>http://www.aygfsteel.com/leon/archive/2006/06/13/52360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/leon/comments/commentRss/52360.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/leon/services/trackbacks/52360.html</trackback:ping><description><![CDATA[不管你的目是否用到?jin)Swing技术,我都要说QSwing是一个设计优U的Java包,它充满了(jin)大师的智慧。如果你学了(jin)Java却连一个Buttonq(sh)?x)写Q就象你学习(fn)Visual Basic却不?x)用ButtonQ那可绝Ҏ(gu)不能被原谅的。Swing技术的应用已经在国外大行其道,׃java的免贏V易学以?qing)大家对于java技术的充分信赖Q好多公司早早的把应用E序的一切,从后台服务到前台人机交互界面Q统l移C(jin)java开发上。Swing出现?jin)?0q了(jin)Q凭借其先进的设计思想Q一直未曾落后于哪种语言的界面开发技术,使用和理解Swing的设计思想Q对软g开发者大有裨益?<br /><br />Swing的设计是MVC的典范。虽然MVC的概忉|Ҏ(gu)滥,可是真正能够理解q熟l掌握、在设计和开发里面自然流露的q不多见。记得用VCQ+开发程序时候,MFC向导也是生成Document和View两个c,当时一直奇怪ؓ(f)什么这么绕圈子。再看Swing的设计,则到处充满了(jin)MVC的痕qV仔l研ISwing中事件监听、Model-View分离、Renderer/Editor机制、可插拔的LookAndFeel{机Ӟ直就是一门艺术,充满?jin)美感。而如果你非常痛恨q些设计q觉得他们怪异Q很可能你是刚从VB或者Delphi转过来,q些快速开发工具帮助了(jin)你也“害”了(jin)你?<br /><br />Swing设计的不错,不过可能q度学术化的设计也得Swing跑v来ƈ不灵巧,学习(fn)隑ֺ也大。这客观上确实得Swing一直没有被q泛使用Q而且q受诟病。记得以前“Swing有什么成功的应用吗?”之cȝ帖子一直是热门话题。IBM{则机抓住辫子弄?jin)SWT吸引?jin)不hQ得Java GUI技术面临分裂的危险?<br /><br />不过随着JAVA的不断升U和优化QSwing的速度一直在提高Q美观性也在改善,ZSwing的成功应用也来多?jin)。关于Swing是否消亡或被SWT代替或是否能作桌面应用的争论逐渐了(jin)。不q喜Ƣƈ_NSwing技术的开发者,其在国内,依旧非常?<br /><br />好在情况在{好。Sun正意识到Eclipse和SWT所带来的威胁,下了(jin)大力气发展NetBeansQ其最新版本对Swing GUI可视化设计的支持已经过?jin)所有对手,其Rich Client框架也走向成熟,q对Swing的发展和应用是一个很大的推动。随着WEB热潮的减退Qh们又更多的开始理性的思考B/S和C/S架构的选择Q某些领域Swing技术已l成为首选的解决Ҏ(gu)。随着JGoodies、JIDE、TWaver{优USwing产品的不断涌玎ͼSwing?x)以更快速度在桌面应用中普及(qing)?<br /><img src="http://www.matrix.org.cn/resource/upload/article/2006_05_12_141218_sKDgLpeqNT.png" /><br /><img style="WIDTH: 700px; HEIGHT: 600px" height="600" src="http://www.matrix.org.cn/resource/upload/article/2006_05_12_141304_LLuClmqhGM.png" width="708" /><br /><br /><br />原文地址<a >http://www.matrix.org.cn/resource/article/44/44417_Swing+MVC.html</a><img src ="http://www.aygfsteel.com/leon/aggbug/52360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/leon/" target="_blank">leon</a> 2006-06-13 10:28 <a href="http://www.aygfsteel.com/leon/archive/2006/06/13/52360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[tips] 获取当前pȝ的所有可用字?/title><link>http://www.aygfsteel.com/leon/archive/2006/06/03/50126.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Sat, 03 Jun 2006 06:51:00 GMT</pubDate><guid>http://www.aygfsteel.com/leon/archive/2006/06/03/50126.html</guid><wfw:comment>http://www.aygfsteel.com/leon/comments/50126.html</wfw:comment><comments>http://www.aygfsteel.com/leon/archive/2006/06/03/50126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/leon/comments/commentRss/50126.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/leon/services/trackbacks/50126.html</trackback:ping><description><![CDATA[ <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"> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> (tng)<span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (tng)q回一个数l,它包含此 (tng)GraphicsEnvironment (tng)中所有可用字体的像素U实例?/span><span style="COLOR: #008000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> (tng)</span><span style="COLOR: #000000"><span style="COLOR: #000000">Font[] (tng)fonts </span></span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng)GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> (tng)q回一个包含此 (tng)GraphicsEnvironment (tng)中所有字体系列名U的数组Q它针对默认语言环境q行?jin)本地化Q由 (tng)Locale.getDefault() (tng)q回?/span><span style="COLOR: #008000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> (tng)</span><span style="COLOR: #000000">String fontNames (tng)</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (tng) (tng)GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();</span></div> <img src ="http://www.aygfsteel.com/leon/aggbug/50126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/leon/" target="_blank">leon</a> 2006-06-03 14:51 <a href="http://www.aygfsteel.com/leon/archive/2006/06/03/50126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Swing] 布局理?- OverlayLayout http://www.aygfsteel.com/leon/archive/2005/11/02/17885.htmlleonleonWed, 02 Nov 2005 15:08:00 GMThttp://www.aygfsteel.com/leon/archive/2005/11/02/17885.htmlhttp://www.aygfsteel.com/leon/comments/17885.htmlhttp://www.aygfsteel.com/leon/archive/2005/11/02/17885.html#Feedback0http://www.aygfsteel.com/leon/comments/commentRss/17885.htmlhttp://www.aygfsteel.com/leon/services/trackbacks/17885.html
lg的横轴和Uu的对齐点介于0.0?.0之间。横_(d)X_(d)(j)?.0代表lg的左侧面Q?.0代表lg的右侧面Q纵_(d)Y_(d)(j)?.0?.0分别代表lg的顶部和底部?BR>
构造函?BR>public OverlayLayout(Container target)

因ؓ(f)构造函C?x)?f)target对象安装l果布局理器,所以我们还必须调用setLayout()来完成此功能?BR>
JPanel p1 = new JPanel();
OverlayLayout overlay 
= new OverlayLayout(p1);
p1.setLayout(overlay); 

在OverlayLayout布局理器中Q每个组仉有一Ҏ(gu)U坐标|每个lg的位|只和它本n的横U坐标值有养I换句话说是lg以他自己的位|作为基准,横u?.0?.0分别代表lg的左侧面和右侧面Q纵轴上0.0?.0分别代表lg的顶部和底部Q和容器位置无关。如果一个组件的alignmentX属性设|ؓ(f)0.5Q原本左侧面的位|对?.0Q现在变成了(jin)0.5Q那么,现在lg的位|就要向左移动width/2的距,使左侧面的位|对应现在的0.0。纵轴亦是如此,明白?jin)吗Q?/U>

Z(jin)Ҏ(gu)理解Q我们来看《Java Swing》中关于OverlayLayout的一D|例程序,它可以编译运行。如图,你可以在输入框中调节容器?个按钮的XQY轴的值来看他们在容器中的位置是怎样改变的,多试几次Q你可以完全理解OverlayLayout?BR>
OverlayTest.jpg
// OverlayTest.java
// A test of the OverlayLayout manager allowing experimentation.
//

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OverlayTest extends JFrame {

    
public OverlayTest() {
        
super("OverlayLayout Test");
        setSize(
500300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        
final Container c = getContentPane();
        c.setLayout(
new GridBagLayout());

        
final JPanel p1 = new GridPanel();
        
final OverlayLayout overlay = new OverlayLayout(p1);
        p1.setLayout(overlay);

        
final JButton jb1 = new JButton("B1");
        
final JButton jb2 = new JButton("B2");
        
final JButton jb3 = new JButton("B3");

        Dimension b1 
= new Dimension(6050);
        Dimension b2 
= new Dimension(8040);
        Dimension b3 
= new Dimension(10060);

        jb1.setMinimumSize(b1);
        jb1.setMaximumSize(b1);
        jb1.setPreferredSize(b1);
        jb2.setMinimumSize(b2);
        jb2.setMaximumSize(b2);
        jb2.setPreferredSize(b2);
        jb3.setMinimumSize(b3);
        jb3.setMaximumSize(b3);
        jb3.setPreferredSize(b3);

        SimpleReporter reporter 
= new SimpleReporter();
        jb1.addActionListener(reporter);
        jb2.addActionListener(reporter);
        jb3.addActionListener(reporter);

        p1.add(jb1);
        p1.add(jb2);
        p1.add(jb3);

        JPanel p2 
= new JPanel();
        p2.setLayout(
new GridLayout(2,6));
        p2.add(
new JLabel("B1 X", JLabel.CENTER));
        p2.add(
new JLabel("B1 Y", JLabel.CENTER));
        p2.add(
new JLabel("B2 X", JLabel.CENTER));
        p2.add(
new JLabel("B2 Y", JLabel.CENTER));
        p2.add(
new JLabel("B3 X", JLabel.CENTER));
        p2.add(
new JLabel("B3 Y", JLabel.CENTER));
        p2.add(
new JLabel(""));

        
final JTextField x1 = new JTextField("0.0"4); // Button1 x alignment
        final JTextField y1 = new JTextField("0.0"4); // Button1 y alignment
        final JTextField x2 = new JTextField("0.0"4); 
        
final JTextField y2 = new JTextField("0.0"4); 
        
final JTextField x3 = new JTextField("0.0"4); 
        
final JTextField y3 = new JTextField("0.0"4); 

        p2.add(x1);
        p2.add(y1);
        p2.add(x2);
        p2.add(y2);
        p2.add(x3);
        p2.add(y3);


        GridBagConstraints constraints 
= new GridBagConstraints();
        c.add(p1, constraints);

        constraints.gridx 
= 1;
        JButton updateButton 
= new JButton("Update");
        updateButton.addActionListener(
new ActionListener() {
            
public void actionPerformed(ActionEvent ae) {
                jb1.setAlignmentX(
                    Float.valueOf(x1.getText().trim()).floatValue());
                jb1.setAlignmentY(
                    Float.valueOf(y1.getText().trim()).floatValue());
                jb2.setAlignmentX(
                    Float.valueOf(x2.getText().trim()).floatValue());
                jb2.setAlignmentY(
                    Float.valueOf(y2.getText().trim()).floatValue());
                jb3.setAlignmentX(
                    Float.valueOf(x3.getText().trim()).floatValue());
                jb3.setAlignmentY(
                    Float.valueOf(y3.getText().trim()).floatValue());

                p1.revalidate();
            }

        }
);
        c.add(updateButton, constraints);

        constraints.gridx 
= 0;
        constraints.gridy 
= 1;
        constraints.gridwidth 
= 2;
        c.add(p2, constraints);
    }


    
public static void main(String args[]) {
        OverlayTest ot 
= new OverlayTest();
        ot.setVisible(
true);
    }


    
public class SimpleReporter implements ActionListener {
        
public void actionPerformed(ActionEvent ae) {
            System.out.println(ae.getActionCommand());
        }

    }


    
public class GridPanel extends JPanel {
        
public void paint(Graphics g) {
            
super.paint(g);
            
int w = getSize().width;
            
int h = getSize().height;

            g.setColor(Color.red);
            g.drawRect(
0,0,w-1,h-1);
            g.drawLine(w
/2,0,w/2,h);
            g.drawLine(
0,h/2,w,h/2);
        }

    }

}



最后提醒,使用OverlayLayout布局理器关键要CXQY轴对应组件位|,和容器没有关pR只要明白这一点,使用q是很简单方便的Q我用OverlayLayout布局理器clone?jin)一个PhotoShop的工具面ѝ?IMG height=19 src="http://www.aygfsteel.com/Emoticons/red_smile.gif" width=19 border=0>
ToolWidget.jpg

leon 2005-11-02 23:08 发表评论
]]>
[Image] 屏q截图保存成囑փ文ghttp://www.aygfsteel.com/leon/archive/2005/10/26/16852.htmlleonleonWed, 26 Oct 2005 03:39:00 GMThttp://www.aygfsteel.com/leon/archive/2005/10/26/16852.htmlhttp://www.aygfsteel.com/leon/comments/16852.htmlhttp://www.aygfsteel.com/leon/archive/2005/10/26/16852.html#Feedback0http://www.aygfsteel.com/leon/comments/commentRss/16852.htmlhttp://www.aygfsteel.com/leon/services/trackbacks/16852.html import  (tng)java.io. * ;
import  (tng)java.awt. * ;
import  (tng)java.awt.image. * ;
import  (tng)javax.imageio. * ;

public  (tng) class  (tng)CropScreen (tng) {
 (tng) (tng)
public  (tng) static  (tng) void  (tng)main(String[] (tng)args) (tng) {
 (tng) (tng) (tng) (tng)
try  (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng)Toolkit (tng)toolkit (tng)
=  (tng)Toolkit.getDefaultToolkit();
 (tng) (tng) (tng) (tng) (tng) (tng)Dimension (tng)screenSize (tng)
=  (tng)toolkit.getScreenSize();
 (tng) (tng) (tng) (tng) (tng) (tng)Rectangle (tng)screenRect (tng)
=  (tng) new  (tng)Rectangle(screenSize);

 (tng) (tng) (tng) (tng) (tng) (tng)Robot (tng)robot (tng)
=  (tng) new  (tng)Robot();
 (tng) (tng) (tng) (tng) (tng) (tng)BufferedImage (tng)image (tng)
=  (tng)robot.createScreenCapture(screenRect);
 (tng) (tng) (tng) (tng) (tng) (tng)I(yng)mageIO.write(image, (tng)
" jpg " , (tng) new  (tng)File( " screen.jpg " ));
 (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)
catch  (tng)(Exception (tng)ex) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng)ex.printStackTrace();
 (tng) (tng) (tng) (tng)}

 (tng) (tng)}

}


leon 2005-10-26 11:39 发表评论
]]>
[Image] AWT使用ImageProducer/ImagConsumer模式加蝲和显C图像的原理http://www.aygfsteel.com/leon/archive/2005/10/11/15217.htmlleonleonTue, 11 Oct 2005 02:35:00 GMThttp://www.aygfsteel.com/leon/archive/2005/10/11/15217.htmlhttp://www.aygfsteel.com/leon/comments/15217.htmlhttp://www.aygfsteel.com/leon/archive/2005/10/11/15217.html#Feedback2http://www.aygfsteel.com/leon/comments/commentRss/15217.htmlhttp://www.aygfsteel.com/leon/services/trackbacks/15217.html以前写过2关于AWT中图像加载显C方法的文章Q最q又多了(jin)一些对?ImageProducer / ImagConsumer 模式的一些理解,试着用文字ȝ?jin)一下,接着q想再写一介l?AWT 中图像过滤的原理和方法。你可能认ؓ(f)现在学习(fn) AWT 中的成像Ҏ(gu)对于开发中已经没有太大的意义,因ؓ(f)已经有了(jin) Java 2D ?JAI Q但是我在实际工作中感到q是无法完全d AWTQ特别是在一些基本的应用上。而且我觉得理?AWT ?Producer / Consumer (push) model 对于理解 Java 2D ?Immediate mode model ?JAI ?Pipeline (pull) model 的都是有好处的?BR>
因ؓ(f)水^有限Q这斚w学习(fn)资料相对也不丰富Q我也不知道我的理解或想法是否完全正或者表q清楚,感兴的朋友可以当作学习(fn)参考,希望能够和我联系q行q一步的讨论?/EM>


AWT 使用 ImageProducer / ImagConsumer 模式Q支持加载和昄 GIF 囑փ文g格式?JPEG 囑փ文g格式。因为图像的加蝲和显C是异步方式q行的,所以有大量加蝲和显C的技术?BR>
?AWT 中,提供?jin)一?java.awt.Image cRjava.awt.Image cM表一个图像对象被作ؓ(f)参数传递给其他用来昄和处理图像的其他 AWT 对象使用。例如,通过调用 Graphics.drawImage(java.awt.Image, int, int, ImageObserver) Ҏ(gu)Q可以在lg中画出图像?BR>
java.awt.Image 是一个定义方法的抽象c,它定义的Ҏ(gu)提供的对囑փ信息的访问。而创建和处理囑փ的基本结构则?java.awt.image 包中。注意,q里不要?java.awt.Image 发生h?BR>
AWT (tng) 加蝲和显C图像用的?ImageProducer / ImagConsumer 模式Q我们必M(jin)?个术语,ImageProducerQ图像生产者)(j)QImageConsumerQ图像消费者)(j)和ImageObserverQ图像观察者)(j)?BR>
ImageProducer 负责生囑փ的位QImagConsumer 接受囑փ的位QImageObserver 监视 ImageProducer 的图像生产过E。ImageProducer 生传递给 ImagConsumer 与图像相关的位。因为图像生产过E是异步q行的,q不是一ơ性生产所有图像位Q所以当 ImageProducer 加蝲囑փӞImageObserver 用来监视它的q展情况。因?java.awt.Component 实现?ImageObserver 接口Q所?AWT 中的每个lg都可以是ImageObserverQ当一个给定的 ImageProducer q行异步操作Ӟq个 ImageObserver 可以选择是否被更新。java.awt.image 包ؓ(f) ImageProducerQImagConsumer ?ImageObserver 都定义了(jin)接口?BR>
ImageProducer
和图像相关的位ƈ不存储在 java.awt.Image 中,每个囑փ都维护一个和一?ImageProducer (tng)的关联。这?ImageProducer (tng)的责L生囑փ的位q将它们传送给 ImagConsumerQ用于过滤该囑փ?BR>
java.awt.image软g包中QFilteredImageSourceQ被qo(h)的图像源Q和 MemoryImageSourceQ内存的囑փ源)(j)实现?ImageProducer (tng) 接口Q是 ImageProducer (tng)?BR>

ImagConsumer
java.awt.image软g包中QImageFilterQ图像过滤器Q和 PixelGrabberQ像素抓取器Q实C(jin) ImagConsumer 接口Q是 ImagConsumer?BR>

ImageProducer (tng)?ImagConsumer 的详l介l请阅读 使用 ImageProducer (tng) / ImagConsumer q行囑փqo(h)


ImageObserver
ImageObserver接口中,定义?jin)一个常数集合和一个方法:(x)

public boolean imageUpdate(image img, int flags, int x, int y, int width, int height);

ImageObserver的常?/TD>
标志 含义
ABORT 囑փ加蝲被中?/TD>
ALLBITS 所有的位都已加载给囑փ
ERROR 在加载过E中发生错误
FRAMEBITS 多囑փ的一个被传送,一般用?SPAN lang=en-us>GIF
HEIGHT 囑փ的高度已l可?/TD>
PROPERTIES 囑փ的属性已l可?/TD>
SOMEBITS 囑փ的羃攑֏?sh)的多个位已l可?/TD>
WIDTH 囑փ的宽度已l可?/TD>

参数 flags 的作用是通知囑փ观察者图像生产的q展情况。这些常C表传递给 ImageObserver.imageUpdate() ?flags 参数中的位?BR>
?Component 作ؓ(f) ImageObserver Ӟ一旦图像有新的部分被加载,׃(x)调用 Component.imageUpdate() Ҏ(gu)QimageUpdate() 再调?repaint() 重新l制囑փ。repaint() 先调用 update() Ҏ(gu)清除lg背景Q再?update() Ҏ(gu)调用 paint() Ҏ(gu)l制囑փ。我们可以通过重蝲 imageUpdate() Ҏ(gu)控制lg何时被更斎ͼ重蝲 update() Ҏ(gu)控制是否每次重绘都要清除背景囑փQ每ơ重l都清除背景囑փ?x)造成画面闪烁Q?BR>

Z(jin)更好的理解,下面我们来看几个样例E序Q?BR>
?Q图像位在需要之前不被生?/FONT>

import (tng)java.net.URL;
import (tng)java.applet.Applet;
import (tng)java.awt.Graphics;
import (tng)java.awt.Image;

public (tng)class (tng)I(yng)mageTestAppletSimple (tng)extends (tng)Applet{
 (tng) (tng) (tng) (tng)
private (tng)I(yng)mage (tng)im;
 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)void (tng)init(){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)URL (tng)codebase (tng)
= (tng)getCodeBase();
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(codebase);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)im (tng)
= (tng)getImage(codebase,"flower.jpg");
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.print(
"Image (tng)width (tng)= (tng)" (tng)+ (tng)im.getWidth(this));
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
" hight (tng)= (tng)" (tng)+ (tng)im.getHeight(this));
 (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)void (tng)paint(Graphics (tng)g){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)g.drawImage(im,
0,0,this);
 (tng) (tng) (tng) (tng)}

}

输出l果Q?BR>image width = -1 height = -1

囑փ的高度和宽度只有在图像被完全加蝲后才是有效的Q输出结果说?java.awt.image 相关的图像位在需要之前不被生产?BR>

?Q图像异步生?/P>

import (tng)java.net.URL;
import (tng)java.applet.Applet;
import (tng)java.awt.Graphics;
import (tng)java.awt.Image;

public (tng)class (tng)I(yng)mageTestAppletSimple2 (tng)extends (tng)Applet{
 (tng) (tng) (tng) (tng)
private (tng)I(yng)mage (tng)im;
 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)void (tng)init(){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)im (tng)
= (tng)getImage(getCodeBase(),"flower.jpg");
 (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)void (tng)paint(Graphics (tng)g){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
"drawing (tng)image...");
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(g.drawImage(im,
0,0,this));
 (tng) (tng) (tng) (tng)}

}

输出l果Q?BR>drawing (tng)image...
false
drawing (tng)image...
false
drawing (tng)image...
false
drawing (tng)image...
true

输出l果说明lg作ؓ(f) ImageObserver Q监?ImageProducer 异步生囑փQ一旦有新的囑փ位被生时就重绘囑փQ图像完全加载后 drawImage() Ҏ(gu)q回 true?BR>

?Q重?ImageObserver ?imageUpdate() Ҏ(gu)Q在囑փ完全加蝲前不调用 repaint()

import (tng)java.applet.Applet;
import (tng)java.awt.Graphics;
import (tng)java.awt.Image;

public (tng)class (tng)I(yng)mageTestAppletWithUpdate (tng)extends (tng)Applet{
 (tng) (tng) (tng) (tng)
private (tng)I(yng)mage (tng)im;
 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)void (tng)init(){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)im (tng)
= (tng)getImage(getCodeBase(),"flower.jpg");
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.print(
"Image (tng)width (tng)= (tng)" (tng)+ (tng)im.getWidth(this));
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
"hight (tng)= (tng)" (tng)+ (tng)im.getHeight(this));
 (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)void (tng)paint(Graphics (tng)g){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)g.drawImage(im,
0,0,this);
 (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)boolean (tng)imageUpdate(Image (tng)image,int (tng)flags,int (tng)x,int (tng)y,int (tng)w,int (tng)h){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
"imageUpdate():x=" (tng)+ (tng)x (tng)+ (tng)",y=" (tng)+ (tng)y (tng)+ (tng)",w=" (tng)+ (tng)w (tng)+ (tng)",h=" (tng)+ (tng)h);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
if((flags (tng)& (tng)ALLBITS) (tng)== (tng)0)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return (tng)true;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
else
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
{
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)repaint();
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return (tng)false;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)}

}



?Q重q?Component.update() Ҏ(gu)Q被调用时不清除背景囑փQ直接调?paint() Ҏ(gu)l制囑փQ消除闪?/P>

import (tng)java.applet.Applet;
import (tng)java.awt.Graphics;
import (tng)java.awt.Image;

public (tng)class (tng)I(yng)mageTestAppletWithSmoothDynamicUpdate (tng)extends (tng)Applet{
 (tng) (tng) (tng) (tng)
private (tng)I(yng)mage (tng)im;
 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)void (tng)init(){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)im (tng)
= (tng)getImage(getCodeBase(),"hl.jpg");
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.print(
"Image (tng)width (tng)= (tng)" (tng)+ (tng)im.getWidth(this));
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
"hight (tng)= (tng)" (tng)+ (tng)im.getHeight(this));
 (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)void (tng)paint(Graphics (tng)g){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)g.drawImage(im,
0,0,this);
 (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)boolean (tng)imageUpdate(Image (tng)image,int (tng)flags,int (tng)x,int (tng)y,int (tng)w,int (tng)h){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
"imageUpdate():x=" (tng)+ (tng)x (tng)+ (tng)",y=" (tng)+ (tng)y (tng)+ (tng)",w=" (tng)+ (tng)w (tng)+ (tng)",h=" (tng)+ (tng)h);
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)repaint();
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
if((flags (tng)& (tng)ALLBITS) (tng)== (tng)0)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return (tng)true;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
else
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return (tng)false;
 (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng)
public (tng)void (tng)update(Graphics (tng)g){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)paint(g);
 (tng) (tng) (tng) (tng)}

}

 (tng)



leon 2005-10-11 10:35 发表评论
]]>
[Download] Java 2D API E序员指?/title><link>http://www.aygfsteel.com/leon/archive/2005/09/13/12897.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Tue, 13 Sep 2005 09:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/leon/archive/2005/09/13/12897.html</guid><wfw:comment>http://www.aygfsteel.com/leon/comments/12897.html</wfw:comment><comments>http://www.aygfsteel.com/leon/archive/2005/09/13/12897.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.aygfsteel.com/leon/comments/commentRss/12897.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/leon/services/trackbacks/12897.html</trackback:ping><description><![CDATA[Programmer's Guide to the JavaTM 2D API 中文?br /><br /><a href="/Files/leon/Java2DAPIE序员指?rar">http://www.aygfsteel.com/Files/leon/Java2DAPIE序员指?rar</a><img src ="http://www.aygfsteel.com/leon/aggbug/12897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/leon/" target="_blank">leon</a> 2005-09-13 17:09 <a href="http://www.aygfsteel.com/leon/archive/2005/09/13/12897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AWT中图像的异步加蝲和等待图像的完全加蝲http://www.aygfsteel.com/leon/archive/2005/07/12/7533.htmlleonleonTue, 12 Jul 2005 02:33:00 GMThttp://www.aygfsteel.com/leon/archive/2005/07/12/7533.htmlhttp://www.aygfsteel.com/leon/comments/7533.htmlhttp://www.aygfsteel.com/leon/archive/2005/07/12/7533.html#Feedback0http://www.aygfsteel.com/leon/comments/commentRss/7533.htmlhttp://www.aygfsteel.com/leon/services/trackbacks/7533.html 囑փ的异步加?/strong>

囑փ的加载和昄是异步进行的Q图? 的生产?ImageProducer)传递给囑փ的消费?ImageConsumer)一个与囑փ相关的位Q因为图像的生q程是一个异步行为,所? AWT 也提供一个图像观?ImageObserver)Q用来监视图像生产者的囑փ生q程?/font>

因ؓ(f) java.awt.Component 实现 ImageObserver 接口Q所?AWT 中每个构仉是ImageObserver Q当一个给定的 ImageProducer 采取异步操作Ӟq个 ImageObserver 可以选择是否被更新?/font>

现在看一个例子:(x)

import (tng)java.net.URL;
import (tng)java.applet.Applet;
import (tng)java.awt.Graphics;
import (tng)java.awt.Image;

public (tng)class (tng)I(yng)mageTestAppletSimple2
 (tng) (tng) (tng) (tng)
extends (tng)Applet (tng){
 (tng) (tng)
private (tng)I(yng)mage (tng)im;

 (tng) (tng)
public (tng)void (tng)init() (tng){
 (tng) (tng) (tng) (tng)im (tng)
= (tng)getImage(getCodeBase(), (tng)"lena.jpg");
 (tng) (tng)}

 (tng) (tng)
public (tng)void (tng)paint(Graphics (tng)g) (tng){
 (tng) (tng) (tng) (tng)System.out.println(
"drawing (tng)image");
 (tng) (tng) (tng) (tng)System.out.println(g.drawImage(im, (tng)
0, (tng)0, (tng)this));
 (tng) (tng)}
}

当这?Applet W一ơ被调用Ӟ打印出下面的结果:(x)
drawing (tng)image...
false
drawing (tng)image...
false
drawing (tng)image...
false
drawing (tng)image...
true

? 行结果说?drawImage() 在第一ơ被调用Ӟ没有囑փ被加载,drawImage() 只是向和囑փ相关?ImageProducer 注册 ImageObserverQ图像被完全加蝲?drawImage() Ҏ(gu)q回 false 直到囑փ被完全加载返?true?/font>

?drawImage() q回之后Q只要有囑փ的新的部分被加蝲QImageObserver 中的 imageUpdate() Ҏ(gu)׃(x)被调用。当 ImageObserver ?AWT 构gӞComponent.imageUpdate() 调用 repaint() Ҏ(gu)清除构g背景q调?paint() Ҏ(gu)重绘刚刚得到的图像位。重复@环,ImageProducer 加蝲囑փ的下一块,调用 ImageObserver ?imageUpdate()。当囑փ被完全加载时QImageProducer 停止调用 ImageObserver ?imageUpdate()Q@环中断?/font>

load -> imageUpdate() -> repaint() -> update() -> paint()


{待囑փ的完全加?br />
上面的例子介l了(jin)囑փ的异步加载,现在介绍2个方法囑փ完全加蝲前不昄?br />
·重蝲 ImageObserver 中的 imageUpdate() Ҏ(gu)Q其在囑փ完全加蝲前不调用 repaint()?/font>


import  (tng)java.applet.Applet;
import  (tng)java.awt.Graphics;
import  (tng)java.awt.Image;

public  (tng) class  (tng)I(yng)mageTestAppletWithUpdate
 (tng) (tng) (tng) (tng)
extends  (tng)Applet (tng){
 (tng) (tng)
private  (tng)I(yng)mage (tng)im;

 (tng) (tng)
public  (tng) void  (tng)init() (tng){
 (tng) (tng) (tng) (tng)im (tng)
=  (tng)getImage(getCodeBase(), (tng) " lena.jpg " );
 (tng) (tng)}

 (tng) (tng)
public  (tng) void  (tng)paint(Graphics (tng)g) (tng){
 (tng) (tng) (tng) (tng)g.drawImage(im, (tng)
0 , (tng) 0 , (tng) this );
 (tng) (tng)}

 (tng) (tng)
public  (tng) boolean  (tng)imageUpdate(Image (tng)image, (tng) int  (tng)flags, (tng) int  (tng)x, (tng) int  (tng)y, (tng) int  (tng)w, (tng) int  (tng)h) (tng){
 (tng) (tng) (tng) (tng)System.out.println(
" imageUpdate():x= "  (tng) +  (tng)x (tng) +  (tng) " ,y= "  (tng) +  (tng)y (tng) +  (tng) " ,w= "  (tng) +  (tng)w (tng) +  (tng) " ,h= "  (tng) +
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)h);

 (tng) (tng) (tng) (tng)
if  (tng)( (tng)(flags (tng) &  (tng)ALLBITS) (tng) ==  (tng) 0 ) (tng){
 (tng) (tng) (tng) (tng) (tng) (tng)
return  (tng) true ; (tng) //  (tng)need (tng)more (tng)updates
 (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng) (tng)
else  (tng){
 (tng) (tng) (tng) (tng) (tng) (tng)repaint();
 (tng) (tng) (tng) (tng) (tng) (tng)
return  (tng) false ; (tng) //  (tng)image (tng)is (tng)fully (tng)loaded
 (tng) (tng) (tng) (tng)}
 (tng) (tng)}
}

使用 java.awt.MediaTracker c跟t图像的加蝲Q不必重?imageUpdate() Ҏ(gu)?/font>


import  (tng)java.net.URL;
import  (tng)java.applet.Applet;
import  (tng)java.awt.Graphics;
import  (tng)java.awt.Image;
import  (tng)java.awt.MediaTracker;

public  (tng) class  (tng)I(yng)mageTestAppletWithMediaTracker
 (tng) (tng) (tng) (tng)
extends  (tng)Applet (tng){
 (tng) (tng)
private  (tng)I(yng)mage (tng)im;

 (tng) (tng)
public  (tng) void  (tng)init() (tng){
 (tng) (tng) (tng) (tng)im (tng)
=  (tng)getImage(getCodeBase(), (tng) " lena.jpg " );

 (tng) (tng) (tng) (tng)MediaTracker (tng)tracker (tng)
=  (tng) new  (tng)MediaTracker( this );
 (tng) (tng) (tng) (tng)tracker.addImage(im, (tng)
0 );
 (tng) (tng) (tng) (tng)
try  (tng){
 (tng) (tng) (tng) (tng) (tng) (tng)tracker.waitForID(
0 );
 (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng) (tng)
catch  (tng)(InterruptedException (tng)e) (tng){
 (tng) (tng) (tng) (tng) (tng) (tng)e.printStackTrace();
 (tng) (tng) (tng) (tng)}

 (tng) (tng) (tng) (tng)System.out.print(
" Image (tng)width (tng)= (tng) "  (tng) +  (tng)im.getWidth( this ));
 (tng) (tng) (tng) (tng)System.out.println(
" height (tng)= (tng) "  (tng) +  (tng)im.getHeight( this ));
 (tng) (tng)}

 (tng) (tng)
public  (tng) void  (tng)paint(Graphics (tng)g) (tng){
 (tng) (tng) (tng) (tng)g.drawImage(im, (tng)
0 , (tng) 0 , (tng) this );
 (tng) (tng)}
}

我们可以把?java.awt.MediaTracker cd囑փ完全加蝲的方法包装成一个实用方?/font>

/**  (tng) *//**
 (tng) (tng) (tng)* (tng)使用 (tng)java.awt.MediaTracker (tng)图像完全加载?br /> (tng) (tng) (tng)* (tng)
@param  (tng)component (tng)Component
 (tng) (tng) (tng)* (tng)
@param  (tng)img (tng)I(yng)mage
 (tng) (tng) (tng)
*/
 (tng) (tng)
public  (tng) static  (tng) void  (tng)waitForImage(Component (tng)component, (tng)I(yng)mage (tng)img) (tng){
 (tng) (tng) (tng) (tng)MediaTracker (tng)tracker (tng)
=  (tng) new  (tng)MediaTracker(component);
 (tng) (tng) (tng) (tng)
try  (tng){
 (tng) (tng) (tng) (tng) (tng) (tng)tracker.addImage(img, (tng)
0 );
 (tng) (tng) (tng) (tng) (tng) (tng)tracker.waitForID(
0 );
 (tng) (tng) (tng) (tng)}
 (tng) (tng) (tng) (tng)
catch  (tng)(InterruptedException (tng)ex) (tng){
 (tng) (tng) (tng) (tng) (tng) (tng)ex.printStackTrace();
 (tng) (tng) (tng) (tng)}
 (tng) (tng)}



leon 2005-07-12 10:33 发表评论
]]>
AWT中加载和昄囑փ的方?/title><link>http://www.aygfsteel.com/leon/archive/2005/07/12/7532.html</link><dc:creator>leon</dc:creator><author>leon</author><pubDate>Tue, 12 Jul 2005 02:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/leon/archive/2005/07/12/7532.html</guid><wfw:comment>http://www.aygfsteel.com/leon/comments/7532.html</wfw:comment><comments>http://www.aygfsteel.com/leon/archive/2005/07/12/7532.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/leon/comments/commentRss/7532.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/leon/services/trackbacks/7532.html</trackback:ping><description><![CDATA[正文<A HREF="/leon/leon/leon/articles/7494.html"><BR>http://www.aygfsteel.com/leon/articles/7494.html</A><BR><img src ="http://www.aygfsteel.com/leon/aggbug/7532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/leon/" target="_blank">leon</a> 2005-07-12 10:31 <a href="http://www.aygfsteel.com/leon/archive/2005/07/12/7532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ͽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ߺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ֶ</a>| <a href="http://" target="_blank">غ</a>| <a href="http://" target="_blank">³</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ȷɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">봨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">⽭</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">կ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ȫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>