2009-07-09 5 views
3

Ich habe ein Panel mit einer Reihe von Komponenten, von denen eine JTable ist. Wenn der Fokus auf JTable liegt und die TAB-TASTE gedrückt wird, wird standardmäßig der Fokus von Zelle zu Zelle innerhalb der Tabelle verschoben. Ich muss dies ändern, um mich stattdessen auf die nächste Komponente zu konzentrieren, d. H. Lassen Sie die JTable vollständig.Tabbing über eine JTable-Komponente

Ctrl-TAB erzielt die gewünschten Ergebnisse, ist aber für den Benutzer nicht akzeptabel. Ich kann der Tabelle einen Tasten-Listener hinzufügen und den Fokus ändern, wenn TAB gedrückt wird, aber es scheint, als könnte es einen besseren Weg geben, dies zu tun.

Irgendwelche Ideen?

Dank ...

+0

Ich denke, die richtige Lösung ist hier veröffentlicht: http://Stackoverflow.com/a/12157344/140278 – Daniel

Antwort

1

Nun, Sie wollen wahrscheinlich nicht nur die Tab-Aktion loswerden, weil sie andere Verantwortlichkeiten hat. Wenn Sie beispielsweise eine Zelle bearbeiten, stoppt die Tab-Aktion die Bearbeitung der Zelle, bevor sie zur nächsten Zelle übergeht. Wahrscheinlich möchten Sie dieses Verhalten beibehalten, indem Sie ein zusätzliches Verhalten hinzufügen, um den Fokus auf die nächste Komponente zu ändern.

Ich beziehe mich darauf als "Wrapping eine Aktion" und Sie können ein Beispiel dafür finden, indem Sie die Table Tabbing Aktion auschecken. Sie sollten in der Lage sein, den Code einfach anzupassen, um den KeyboardFocusManager zur Übertragung des Fokus zu verwenden.

4

Sie würden dies in der Regel tun, indem sie ein Action auf die Komponenten Aktion Karte hinzufügen und dann mit ihm in der Eingangskarte der Komponente (Beispielcode unten) einen Tastendruck zu binden. Dies wird jedoch nicht für Reiter arbeiten, wie dieses Ereignis durch den Fokus Subsystem verbraucht wird es sei denn Sie die folgende Zeile hinzufügen Registerkarte als Fokus-Traversal Schlüssel zu entfernen:

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

Hier ist die vollständige Beispielcode:

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

Das war der Tipp, den ich brauchte. Konnte nicht herausfinden, warum TAB nicht funktionierte, hatte aber eine Idee, dass es wegen der FocusPolicy war. –

Verwandte Themen