我有一個面板包含許多組件,其中之一是JTable
。當JTable
具有焦點並按下TAB鍵時,默認行爲是將焦點從表格中的單元格移動到單元格。我需要改變這個以專注於下一個組件,也就是完全保留JTable
。Taber over JTable組件
Ctrl-TAB達到了預期的效果,但不被用戶接受。我可以在表格中添加一個關鍵的監聽器,並在按Tab鍵時改變焦點,但感覺好像有一種更好的方法可以做到這一點。
任何想法?
謝謝...
我有一個面板包含許多組件,其中之一是JTable
。當JTable
具有焦點並按下TAB鍵時,默認行爲是將焦點從表格中的單元格移動到單元格。我需要改變這個以專注於下一個組件,也就是完全保留JTable
。Taber over JTable組件
Ctrl-TAB達到了預期的效果,但不被用戶接受。我可以在表格中添加一個關鍵的監聽器,並在按Tab鍵時改變焦點,但感覺好像有一種更好的方法可以做到這一點。
任何想法?
謝謝...
那麼你可能不想擺脫標籤操作,因爲它有其他責任。例如,在編輯單元格時,Tab Action停止單元格編輯,然後移至下一個單元格。因此,您可能希望保留此行爲,同時添加額外的行爲以將焦點更改爲下一個組件。
我將此稱爲「包裝動作」,您可以通過檢出Table Tabbing操作找到此示例。您應該可以輕鬆地自定義代碼以使用KeyboardFocusManager傳輸焦點。
您通常通過添加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);
}
這是我需要的提示。無法弄清楚爲什麼TAB不起作用,但有一個想法是因爲FocusPolicy。 – 2010-05-12 20:48:10
我認爲正確的解決辦法張貼在這裏:http://stackoverflow.com/a/12157344/140278 – Daniel 2012-09-06 23:19:33