發表文章

目前顯示的是有「java」標籤的文章

Java ActionEvent getModifiers()

前些日子學弟來問怎麼判斷按下Button時,是否有同時按下Ctrl+Alt。學弟是在actionPerformed裡,用ActionEvent的getModifiers()與ActionEvent.ALT_MASK和ActionEvent.CTRL_MASK來判斷,不過他執行出來的結果卻是錯的。由於以前也沒有用過getModifiers(),所以花了點時間研究,再加上這過程還發生怎麼在Mac上可以用,但在Win上反而不行的情況,因此在這邊整理了一下學習心得。 首先是getModifiers()的值,我自己遇到的狀況是根據平台以及使用AWT還是Swing的Button而不同,所以debug的時間一直栽在這邊.... Key Mac, Win(Swing JButton) Win(AWT Button) only click, 16 0 with Ctrl, 16|2=18 0|128=128 with Alt, 16|8=24 0|512=512 with Shift, 16|1=17 0|64=64 with Alt+Ctrl, 16|8|2=26 0|512|128=640 得到了Modifiers的值後,接著就是用MASK來比對。如果是上表左邊的情況,使用ActionEvent提供的ALT_MASK和CTRL_MASK等等即可;但如果是右邊的情況,就變成要使用InputEvent的ALT_DOWN_MASK和CTRL_DOWN_MASK等等。使用方法是Modifiers值與mask值的AND運算結果是否等於mask值,就知道Modifiers是否有按下該Modifier。寫成函式就是: private boolean checkModifiers(int modifiers, int mask) { return((modifiers & mask) == mask); } 如何是要判斷是否有兩個Modifier key,例如是Alt+Ctrl,則mask就是這兩個Modifier Mask值的OR運算。 例如 int altWithCtrlMask=ActionEvent.ALT_MASK | ActionEvent.CTRL_MASK; altWithCtrlMask再來跟getModifiers的值進...

Custom Stories with Open Graph

註:當初寫這篇的時候是2014/09/12,那時Facebook sdk還是3.X,現在(2015/06/25)已更新到4.X版,一些方法需要改寫。 舊: 最近在練習寫android app with Facebook SDK, 想用FB的Custom Stories with Open Graph功能, 讓使用者會自動在動態時報(Timeline)上發佈跟這個app的Story, 照著官網Posting using API calls的範例寫, OpenGraphObject book = OpenGraphObject.Factory.createForPost("books.book"); OpenGraphAction readAction = OpenGraphAction.Factory.createForPost("books.reads"); 其中的object("books.book")和action("books.reads")都是FB原本提供的。 想說來用自己定義的story (action是Take ,object是 Bus), 卻不知道createForPost裡的參數分別要填什麼, 填了("take")和("bus")都不行, 找了好久, 注意到books.book(FB提供)和take(自定義)這兩個action的Graph API URL不一樣, 才知道原來要加app的Namespace。 例如這個app的namespace是xx-yy, 那想用自己定義的action和object, 就是要填("xx-yy:take")和("xx-yy:bus")。 更新(2015/06/25): 原本的寫法是OpenGraphObject、OpenGraphAction配合RequestBatch,但到了4.X,這三個類別被替換掉了 而發佈custom stories 也變更簡單 根據官網範例,變成: // Create an object ShareOpenGraphObject object = new ShareOpenGra...

Improve TheONE ExternalMovementReader

雖然我覺得Java的Scanner滿方便的,但是似乎讀檔效率不是很好。在用ONE simulator時,若是使用ExternalMovement時,大部份的模擬時間都卡在ExternalMovementReader,原因就是ONE Simulator使用Scanner來逐行讀取資料,並且再用Scanner分析每行的location資料,所以大部份的模擬時間都花在讀檔案!!! 所以稍微改寫了ExternalMovementReader,利用BufferedReader讀行,再用字串分割和Double.parseDouble(),果然模擬時間有變快了一點。 完整檔案下載