2012-08-28 66 views
7

JTable的默認行爲的改變重點,下一個單元格,我想迫使它在按下TAB鍵將焦點移到下一個組件(例如JTextField中)。
我overrided isCellEditable方法DefaultTableModel總是返回false:焦點轉到下一個組件TAB

public boolean isCellEditable(int rowIndex, int columnIndex) { 
    return false; 
} 

但它仍然不會改變焦點的下一個組件!
我應該怎麼做JTable焦點轉到下一個組件,而不是下一個單元格?

+0

,我們談論的焦點1)內部的JTable中間人從JTable中移動焦點到電池2)(例如)的JTextField反之亦然 – mKorbel

+0

@mKorbel:#2,JTable中的默認行爲正在改變聚焦到下一個單元,我想迫使它將焦點移動到下一個組件(例如'JTextField')按下TAB鍵。 – RYN

回答

5

如果你真的想這樣,你需要更改表格動作地圖的默認行爲。

ActionMap am = table.getActionMap(); 
am.put("selectPreviousColumnCell", new PreviousFocusHandler());  
am.put("selectNextColumnCell", new NextFocusHandler());  

然後,你需要一對夫婦的行動來處理遍歷

public class PreviousFocusHandler extends AbstractAction { 
    public void actionPerformed(ActionEvent evt) { 
     KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
     manager.focusPreviousComponent(); 
    } 
} 

public class NextFocusHandler extends AbstractAction { 
    public void actionPerformed(ActionEvent evt) { 
     KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
     manager.focusNextComponent(); 
    } 
} 

另一種方法是禁用底層Action ...

ActionMap am = table.getActionMap(); 
am.get("selectPreviousColumnCell").setEnabled(false); 
am.get("selectNextColumnCell").setEnabled(false); 

(沒有測試)

這種方法的好處是可以啓用/禁用的行爲,因爲你需要它而無需維護舊Actions

+0

沒有..(15個字符) – kleopatra

+0

? KeyboardFocusManager?會提到Componet.transferFocusXXX(),但有4個月的打嗝:P – MadProgrammer

4

要重置該標準鍵盤綁定(通常TAB和SHIFT + TAB),只需指定nullkeystrokes參數Component.setFocusTraversalKeys

table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null); 
table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null); 
相關問題