星期二, 12月 08, 2009

結束 JTable 的編輯狀態

通常使用者在結束編輯 JTable 中某一格時,程式是無法察覺的。除非使用者有以下動作:
  • 按了Enter
  • 使用 Tab 鍵跳到下一格
  • 用滑鼠點擊表格里的其他欄位
以上動作發生時,表格會結束編輯狀態,並且把欄位裡頭的值存入 table model 裡。但是萬一使用者點擊了畫面上的其他地方或按鍵呢?

這時抓取 table 內的值可能是錯誤的,因為這些值尚未存入 table model裡。這個問題可以透過下列方法解決。

替 table 多加 terminateEditOnFocusLost 的 Client Property:




當其他元件獲得 focus 時,便會停止編輯狀態。但僅限於視窗內的元件,點擊"縮小"或"放大"視窗的按鈕則無法作用。
如果你想要透過某些元件來停止編輯狀態,比如說一個 "next" 按鈕,你可以在按鈕的 listener 中加上:



另外,點擊 JTableHeader 並不會搶走 focus,要解決這個問題你可以替 table header 加上 mouse listener。