2009-07-09 20 views
3

我有一個面板包含許多組件,其中之一是JTable。當JTable具有焦點並按下TAB鍵時,默認行爲是將焦點從表格中的單元格移動到單元格。我需要改變這個以專注於下一個組件,也就是完全保留JTableTaber over JTable組件

Ctrl-TAB達到了預期的效果,但不被用戶接受。我可以在表格中添加一個關鍵的監聽器,並在按Tab鍵時改變焦點,但感覺好像有一種更好的方法可以做到這一點。

任何想法?

謝謝...

+0

我認爲正確的解決辦法張貼在這裏:http://stackoverflow.com/a/12157344/140278 – Daniel 2012-09-06 23:19:33

回答

1

那麼你可能不想擺脫標籤操作,因爲它有其他責任。例如,在編輯單元格時,Tab Action停止單元格編輯,然後移至下一個單元格。因此,您可能希望保留此行爲,同時添加額外的行爲以將焦點更改爲下一個組件。

我將此稱爲「包裝動作」,您可以通過檢出Table Tabbing操作找到此示例。您應該可以輕鬆地自定義代碼以使用KeyboardFocusManager傳輸焦點。

4

您通常通過添加Action到組件動作映射,然後綁定在組件的輸入映射(下面的示例代碼)與它的按鍵做到這一點。

tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet()); 

下面是完整的示例代碼:

然而,這不適用於標籤作爲本次活動是由焦點子系統 除非你添加下面的行刪除選項卡作爲焦點遍歷鍵消耗工作
public static void main(String[] args) { 
    final JTabbedPane tp = new JTabbedPane(); 

    // Remove Tab as the focus traversal key - Could always add another key stroke here instead. 
    tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet()); 

    KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0); 

    Action nextTab = new AbstractAction("NextTab") { 
     public void actionPerformed(ActionEvent evt) { 
      int i = tp.getSelectedIndex(); 
      tp.setSelectedIndex(i == tp.getTabCount() - 1 ? 0 : i + 1); 
     } 
    }; 

    // Register action. 
    tp.getActionMap().put("NextTab", nextTab); 
    tp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks, "NextTab"); 

    tp.addTab("Foo", new JPanel()); 
    tp.addTab("Bar", new JPanel()); 
    tp.addTab("Baz", new JPanel()); 
    tp.addTab("Qux", new JPanel()); 

    JFrame frm = new JFrame(); 

    frm.setLayout(new BorderLayout()); 
    frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frm.add(new JButton(nextTab), BorderLayout.NORTH); 
    frm.add(tp, BorderLayout.CENTER); 
    frm.setBounds(50,50,400,300); 
    frm.setVisible(true); 
} 
+0

這是我需要的提示。無法弄清楚爲什麼TAB不起作用,但有一個想法是因爲FocusPolicy。 – 2010-05-12 20:48:10