發表文章

目前顯示的是 4月, 2008的文章

Algorithm:Xor交換兩個數值變數

這是我今年春節看Java Puzzlers時才知道的技巧,有很大的delay,交換數值變數利用Xor運算就可以完成,就方法就。 b^=a; a^=b; b^=a; 這是利用xor的特性,將A xor B 或是 B xor A都會得到一個相同的值 C。若將這個值跟 A 作xor運算,就會得到 B;而若是將其跟 B 作xor運算,則會得到 A。 A xor B = C C xor B = A C xor A = B 在密碼學中,資料與key的混合也常常用xor運算達到還原的效果。 這個方法的優點是不消耗額外記憶體空間,只需要a和b兩個變數即可完成。 程式碼如下: #include <stdio.h > #include  < stdlib.h > int main() {     int x = 10;     int y = 20;     printf ("origin: x=%d, y=%d\n", x, y);     x = x ^ y;     y = x ^ y;     x = x ^ y;     printf ("swap:   x=%d, y=%d\n", x, y);     return 0; } https://en.wikipedia.org/wiki/XOR_swap_algorithm 延伸連結 (原創) 如何交換兩個變數,而不動用第三個變數? (C/C++) (C#) - 真 OO无双 - 博客园 達可鴨的池塘: XOR奇文共賞─變數直接互換、無線網路編碼

Java: 視窗置中的方法

假設JFrame的實體是frame,則可以用下面兩種方法使視窗置中 方法一、利用Toolkit類別取得螢幕大小後,再計算出JFrame中間的位置 java.awt.Dimension scr_size = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation( (scr_size.width - frame.getWidth()) / 2, (scr_size.height - frame.getHeight()) / 2); 使用這個方法的缺點,是必須要先設定好視窗的寬高屬性,或是仙呼叫pack方法自動設定,否則就沒辦法使視窗顯示在螢幕中央。 方法二、利用JFrame的其中一個方法 frame.setLocationRelativeTo(null); 這個方法我還是頭一次知道,而且這方法還不是新的API所增加的,在Java Document 1.4中久已經有描述, JFrame.setLocationRelativeTo(Component) ,只要將參數給null值,就可以使視窗置中,而且 Java Tutorial 也有提到用這個方法。

Java: 反鋸齒繪圖 Paint with graphics using anti-aliasing

圖片
大一的時候寫小遊戲時,發現Java顯示出來的大型中文字怎麼都不甚美觀,文字邊會有鋸齒狀,應該像遊戲一樣要 anti aliasing 一下才對嘛?可是到底要怎麼用,當時就沒繼續研究下去,直到今天才無在 小範例 中發現到它,都過這麼久了說起來還真是汗顏。 實際效果 範例程式碼 import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JPanel; import javax.swing.JFrame; public class UnicodeText { public static void main(String[] args) { JFrame frm = new JFrame("反鋸齒效果 demo"); JPanel jpn = new JPanel(){ public void paint(Graphics g) { super.paint(g); Graphics2D g2 = (Graphics2D) g; Font Anit = new Font("Monospace", Font.PLAIN, 62); g2.setFont(Anit); g2.drawString("沒用反鋸齒!!", 10, 50); Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.drawString("使用反鋸齒!!", 10, 145); } }; frm.add(jpn); frm.setSize(350,200); frm.setResizable(false); frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frm.setVisible(true); } } 重要的就只是兩行,將Graphics強制轉成Graphics2D,

Note:我的Ruby學習筆記

這是兩個禮拜前,我花了幾天的時間研究Ruby,用PPT所寫下的Ruby學習筆記,由於是筆記,所以就比較簡短,再者,由於我挑的書不是很好(寫在簡報的第一頁),簡報內容有錯誤煩請糾正。 下面是我整理的投影片,如果看不到投影片請再下面留言跟我說

Java Sinppets:CharacterLimitedTextField

package org.tedluxd.mirror.javaplus; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultStyledDocument; /** * 此TextField可限制輸入的字數。 * * @author Mirror Chiu * @last-revise 2008-04-19 */ public class CharacterLimitedTextField extends JTextField { /** * 以指定的欄位寬度與可輸入字元數量,建立含有指定字串的TextField * @param text 字串。 * @param columns 欄位寬度與可輸入字元數量。 * @param limit 欄位寬度與可輸入字元數量。 */ public CharacterLimitedTextField(String text, int columns, int limit) { super(new CharacterLimitedDocument(limit), text, columns); } /** * 以指定的欄位寬度與可輸入字元數量,建立TextField物件。 * * @param columns 欄位寬度。 * @param limit 可輸入字元數量。 */ public CharacterLimitedTextField(int columns, int limit) { super(new CharacterLimitedDocument(limit),null, columns); } /**

注意事項:使用getResource產生的URL作為讀取Jar內檔案的圖檔

1. URL要使用正斜線(/)作為目錄分隔 URL使用正斜線作為目錄分隔,所以若是用反斜線就會被當作名稱的一部份,這個問題會出現在Windows系統上,因為Windows是使用反斜線\作為目錄分隔符號。 若是使用反斜線, 在執行class時,URL會交由檔案系統解析,所以就「可能」讀取到圖檔(實際上我救是讀的到)。 但是執行jar時,URL是給URL相關的解析器,所以就把反斜線當作名稱的一部份,也就會找不到jar中圖片檔案。 2. 路徑上不要有驚嘆號(!) 在URL路徑中千萬不要包含驚嘆號(!) 因為這個符號是用來辨別jar檔案內的檔案用的,如果你取一個專案的資料夾名稱為 foo!! ,並將你的程式碼或jar放在裡面,你將會發現,執行jar檔案就是會發生錯誤,會說找不到檔案,但是當你把jar檔案移到一個不包含驚嘆號的目錄後,他就可以正常執行了。 因為在執行class時的URL列印出來是長這樣子 file:/{路徑名稱}/foo!!/foo.class/{圖片路徑} 而執行jar檔案時,URL列印出來會是這個樣子 jar:file:/{路徑名稱}/foo!!/foo.jar!/{圖片路徑} 今天遭遇了第二個問題,又讓我搞了一陣子 JarImageFetcher 。