??xml version="1.0" encoding="utf-8" standalone="yes"?>jizz一区二区三区,久久国内精品视频,九色网友自拍视频手机在线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)Q然后再对被选取的文件有效性进行验证(例如Q文件的文g名是否合法、选取的\径下是否已有同名文g存在{等Q,如果验证不通过Q需要再ơ打开文g选择对话框进行选取?br /><br />昄Q验证没有通过的情况下Q文仉取对话框被反复的打开和关闭,影响用户体验?br /><br />我现在介l一个方法,在点M文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这个方法会在用户单?Approve 按钮时由 UI 调用此方法。导致用等?<code>APPROVE_SELECTION</code> 的命令字W串Ȁ发一个操作事件?br /><br />那么Q我们现在可以选择l承JFileChooser再覆写这个方法,对选中文g的有效性验证写入这个方法中Q只有当验证通过时才调用类的approveSelection() 完成文g选取Q否则直接返回,l箋选择新的文g?br /><br />下面是我写的一个demo以供参考:<br /><br />import java.io.File;<br />import javax.swing.JOptionPane;</font></p> <p> <font face="Times New Roman">/**<br /> * ?JFileChooser 中进行文仉证的技?br /> * @author Chen Wei<br /> * @email <a href="mailto:chenwei.mobi@gmail.com">chenwei.mobi@gmail.com</a><br /> */<br />public class JFileChooserDemo extends javax.swing.JFileChooser{<br />    <br />    public void approveSelection(){<br />        File file = getSelectedFile();<br />        <br />        // 验证文g名是否合?br />        if (!validateFileName(file.getName())) {<br />            JOptionPane.showMessageDialog(getParent(), "文g名不能包含下列Q何字W之一Q\n \\ / : * ? \" < > |");<br />            return;<br />        }else{<br />            super.approveSelection();<br />        }<br />    }<br />    <br />    /**<br />     * 验证输入字符串参数是否ؓ有效文g名?br />     * @param name 待验证的文g名字W串?br />     * @return 通过验证Q文件名无效q回 falseQ有效返?true?br />     */<br />    public static boolean validateFileName(String name) {<br />        if (name.indexOf('\\') != -1 || name.indexOf('/') != -1 ||<br />            name.indexOf(':') != -1 || name.indexOf('*') != -1 ||<br />            name.indexOf('?') != -1 || name.indexOf('"') != -1 ||<br />            name.indexOf('<') != -1 || name.indexOf('>') != -1 ||<br />            name.indexOf('|') != -1) {</font> </p> <p> <font face="Times New Roman">            return false;<br />        } else {<br />            return true;<br />        }<br />    }<br />    <br />    public static void main(String[] args){<br />        JFileChooserDemo chooser = new JFileChooserDemo();<br />        chooser.showOpenDialog(null);<br />    }<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">    </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">/** */</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" />     * ~放 - 参数指定目标囄放比例?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * </span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> srcImage 源图像对象?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * </span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> xscale 囑փ x _宽度Q上的的~放比例?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * </span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> yscale 囑փ y _高度Q上的的~放比例?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * </span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> hints 重新l图使用的 RenderingHints 对象?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * </span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000"> ~放后的囑փ对象?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     </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" />    </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000"> BufferedImage scaleJ2D(BufferedImage srcImage, </span> <span style="COLOR: #0000ff">double</span> <span style="COLOR: #000000"> xscale, </span> <span style="COLOR: #0000ff">double</span> <span style="COLOR: #000000"> yscale, RenderingHints hints) </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" />        </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> width </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">) ((</span> <span style="COLOR: #0000ff">double</span> <span style="COLOR: #000000">) srcImage.getWidth() </span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> xscale);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> height </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">) ((</span> <span style="COLOR: #0000ff">double</span> <span style="COLOR: #000000">) srcImage.getHeight() </span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> yscale);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        AffineTransform affineTransform </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> AffineTransform();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        affineTransform.scale(xscale, 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" />        </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(hints </span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000"> </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" />            hints </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        AffineTransformOp affineTransformOp </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> AffineTransformOp( affineTransform, hints);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        BufferedImage dstImage </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> BufferedImage(width, height, srcImage.getType());<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> affineTransformOp.filter(srcImage, dstImage);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</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">    </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">/** */</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" />     * 彩色图像{换ؓ灰度图?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * </span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> srcImage 源彩色图像?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * </span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000"> hints 重新l图使用的 RenderingHints 对象?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />     * </span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000"> 目标灰度图?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     </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" />    </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000"> BufferedImage transformGrayJ2D(BufferedImage srcImage,RenderingHints hints) </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" />        BufferedImage dstImage </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> BufferedImage(srcImage.getWidth(), srcImage.getHeight(), srcImage.getType());<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <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" />        </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> (hints </span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">) </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" />            Graphics2D g2 </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> dstImage.createGraphics();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            hints </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> g2.getRenderingHints();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            g2.dispose();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            g2 </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        ColorSpace grayCS </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> ColorSpace.getInstance(ColorSpace.CS_GRAY);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        ColorConvertOp colorConvertOp </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000"> ColorConvertOp(grayCS, hints);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        colorConvertOp.filter(srcImage, dstImage);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> dstImage;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</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      /**
     * 取得囑փ上指定位|像素的 rgb 颜色分量?br />     * 
@param  image 源图像?br />     *  @param  x 囑փ上指定像素位|的 x 坐标?br />     *  @param  y 囑փ上指定像素位|的 y 坐标?br />     *  @return  q回包含 rgb 颜色分量值的数组。元素 index 由小到大分别对应 rQgQb?br />      */

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

        
        
return  rgb;
    }


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

try   {
    BufferedImage bi 
=  ImageIO.read( new  File( "  test.jpg  " ));
}
  catch  (IOException ex)  {
    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[不管你的目是否用到了Swing技术,我都要说QSwing是一个设计优U的Java包,它充满了大师的智慧。如果你学了Java却连一个Buttonq不会写Q就象你学习Visual Basic却不会用ButtonQ那可绝Ҏ(gu)不能被原谅的。Swing技术的应用已经在国外大行其道,׃java的免贏V易学以及大家对于java技术的充分信赖Q好多公司早早的把应用E序的一切,从后台服务到前台人机交互界面Q统l移Cjava开发上。Swing出现了快10q了Q凭借其先进的设计思想Q一直未曾落后于哪种语言的界面开发技术,使用和理解Swing的设计思想Q对软g开发者大有裨益?<br /><br />Swing的设计是MVC的典范。虽然MVC的概忉|Ҏ(gu)滥,可是真正能够理解q熟l掌握、在设计和开发里面自然流露的q不多见。记得用VCQ+开发程序时候,MFC向导也是生成Document和View两个c,当时一直奇怪ؓ什么这么绕圈子。再看Swing的设计,则到处充满了MVC的痕qV仔l研ISwing中事件监听、Model-View分离、Renderer/Editor机制、可插拔的LookAndFeel{机Ӟ直就是一门艺术,充满了美感。而如果你非常痛恨q些设计q觉得他们怪异Q很可能你是刚从VB或者Delphi转过来,q些快速开发工具帮助了你也“害”了你?<br /><br />Swing设计的不错,不过可能q度学术化的设计也得Swing跑v来ƈ不灵巧,学习隑ֺ也大。这客观上确实得Swing一直没有被q泛使用Q而且q受诟病。记得以前“Swing有什么成功的应用吗?”之cȝ帖子一直是热门话题。IBM{则机抓住辫子弄了SWT吸引了不hQ得Java GUI技术面临分裂的危险?<br /><br />不过随着JAVA的不断升U和优化QSwing的速度一直在提高Q美观性也在改善,ZSwing的成功应用也来多了。关于Swing是否消亡或被SWT代替或是否能作桌面应用的争论逐渐了。不q喜Ƣƈ_NSwing技术的开发者,其在国内,依旧非常?<br /><br />好在情况在{好。Sun正意识到Eclipse和SWT所带来的威胁,下了大力气发展NetBeansQ其最新版本对Swing GUI可视化设计的支持已经过了所有对手,其Rich Client框架也走向成熟,q对Swing的发展和应用是一个很大的推动。随着WEB热潮的减退Qh们又更多的开始理性的思考B/S和C/S架构的选择Q某些领域Swing技术已l成为首选的解决Ҏ(gu)。随着JGoodies、JIDE、TWaver{优USwing产品的不断涌玎ͼSwing会以更快速度在桌面应用中普及?<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" /> <span style="COLOR: #008000">//</span><span style="COLOR: #008000"> q回一个数l,它包含此 GraphicsEnvironment 中所有可用字体的像素U实例?/span><span style="COLOR: #008000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #000000"><span style="COLOR: #000000">Font[] fonts </span></span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> 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"> q回一个包含此 GraphicsEnvironment 中所有字体系列名U的数组Q它针对默认语言环境q行了本地化Q由 Locale.getDefault() q回?/span><span style="COLOR: #008000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span><span style="COLOR: #000000">String fontNames </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  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之间。横_X_?.0代表lg的左侧面Q?.0代表lg的右侧面Q纵_Y_?.0?.0分别代表lg的顶部和底部?BR>
构造函?BR>public OverlayLayout(Container target)

因ؓ构造函C会ؓ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属性设|ؓ0.5Q原本左侧面的位|对?.0Q现在变成了0.5Q那么,现在lg的位|就要向左移动width/2的距,使左侧面的位|对应现在的0.0。纵轴亦是如此,明白了吗Q?/U>

ZҎ(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了一个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  java.io. * ;
import  java.awt. * ;
import  java.awt.image. * ;
import  javax.imageio. * ;

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

      Robot robot 
=   new  Robot();
      BufferedImage image 
=  robot.createScreenCapture(screenRect);
      ImageIO.write(image, 
" jpg " new  File( " screen.jpg " ));
    }

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

  }

}


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又多了一些对?ImageProducer / ImagConsumer 模式的一些理解,试着用文字ȝ了一下,接着q想再写一介l?AWT 中图像过滤的原理和方法。你可能认ؓ现在学习 AWT 中的成像Ҏ(gu)对于开发中已经没有太大的意义,因ؓ已经有了 Java 2D ?JAI Q但是我在实际工作中感到q是无法完全d AWTQ特别是在一些基本的应用上。而且我觉得理?AWT ?Producer / Consumer (push) model 对于理解 Java 2D ?Immediate mode model ?JAI ?Pipeline (pull) model 的都是有好处的?BR>
因ؓ水^有限Q这斚w学习资料相对也不丰富Q我也不知道我的理解或想法是否完全正或者表q清楚,感兴的朋友可以当作学习参考,希望能够和我联系q行q一步的讨论?/EM>


AWT 使用 ImageProducer / ImagConsumer 模式Q支持加载和昄 GIF 囑փ文g格式?JPEG 囑փ文g格式。因为图像的加蝲和显C是异步方式q行的,所以有大量加蝲和显C的技术?BR>
?AWT 中,提供了一?java.awt.Image cRjava.awt.Image cM表一个图像对象被作ؓ参数传递给其他用来昄和处理图像的其他 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  加蝲和显C图像用的?ImageProducer / ImagConsumer 模式Q我们必M?个术语,ImageProducerQ图像生产者)QImageConsumerQ图像消费者)和ImageObserverQ图像观察者)?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 包ؓ ImageProducerQImagConsumer ?ImageObserver 都定义了接口?BR>
ImageProducer
和图像相关的位ƈ不存储在 java.awt.Image 中,每个囑փ都维护一个和一?ImageProducer 的关联。这?ImageProducer 的责L生囑փ的位q将它们传送给 ImagConsumerQ用于过滤该囑փ?BR>
java.awt.image软g包中QFilteredImageSourceQ被qo的图像源Q和 MemoryImageSourceQ内存的囑փ源)实现?ImageProducer  接口Q是 ImageProducer ?BR>

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

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


ImageObserver
ImageObserver接口中,定义了一个常数集合和一个方法:

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 囑փ的羃攑֏体的多个位已l可?/TD>
WIDTH 囑փ的宽度已l可?/TD>

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

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

import java.net.URL;
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

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

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

}

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

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

?Q图像异步生?/P>

import java.net.URL;
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

public class ImageTestAppletSimple2 extends Applet{
    
private Image im;
    
    
public void init(){
        im 
= getImage(getCodeBase(),"flower.jpg");
    }

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

}

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

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

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

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

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

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

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

    }

}



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

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

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

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

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

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

}

 



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>

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

现在看一个例子:

import java.net.URL;
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;

public class ImageTestAppletSimple2
    
extends Applet {
  
private Image im;

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

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

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

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

?drawImage() q回之后Q只要有囑փ的新的部分被加蝲QImageObserver 中的 imageUpdate() Ҏ(gu)׃被调用。当 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了囑փ的异步加载,现在介绍2个方法囑փ完全加蝲前不昄?br />
·重蝲 ImageObserver 中的 imageUpdate() Ҏ(gu)Q其在囑փ完全加蝲前不调用 repaint()?/font>


import  java.applet.Applet;
import  java.awt.Graphics;
import  java.awt.Image;

public   class  ImageTestAppletWithUpdate
    
extends  Applet {
  
private  Image im;

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

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

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

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

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


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

public   class  ImageTestAppletWithMediaTracker
    
extends  Applet {
  
private  Image im;

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

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

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

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

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

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



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>