# STRG + TAB KeyEvent abfangen



## sylo (29. Jul 2010)

Hi zusammen

Ich habe wie hier

http://www.java-forum.org/awt-swing-swt/7221-tab-funktion-fenster-aendern-genauer-strg-tab.html

genau das gleiche Problem. Da dieser Thread bereits geschlossen war muss ich leider einen neuen aufmachen.

Folgendes Problem:
Ich würde gerne die TastenKombo STRG+TAB abfangen und irgendwas auslösen.

Die Antwort von thE_29 war daraufhin:

```
import java.util.HashSet;
import javax.swing.KeyStroke;
import javax.swing.FocusManager;


    FocusManager fm = FocusManager.getCurrentManager();
    Set newKeys = new HashSet(fm.getDefaultFocusTraversalKeys(FocusManager.
        FORWARD_TRAVERSAL_KEYS));
    newKeys.remove(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,0));
    fm.setDefaultFocusTraversalKeys(FocusManager.FORWARD_TRAVERSAL_KEYS,
                                newKeys);
```

daraufhin schrieb der Themenstarter, 


> Hah! Geknackt!!!
> 
> Ich liebe Java
> Mann, hat das gedauert! Also, dass mit den FocusManager und den DefaultFocusTraversalKeys war schon gut, aber statt TAB musste ich "ctrl TAB" rausnehmen! Ich wußte gar nicht, dass es so eine Kombination auch dort gibt ... :?
> ...



So wie ich das verstehe, muss man hier die Zeile

```
newKeys.remove(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,0));
```
einfach ändern in das mit "ctrl TAB". Unter KeyEvent finde ich da aber leider nichts. Was verstehe ich den hier falsch?

Grüße
sylo


----------



## XHelp (29. Jul 2010)

```
newKeys.remove(KeyStroke.getKeyStroke("ctrl TAB"));
```
?
Wie es genau abläuft siehst du da: KeyStroke (Java Platform SE 6)


----------



## sylo (2. Aug 2010)

Hi

also ich habe es nicht hinbekommen. Ich weiß echt nicht wo mein Fehler ist. Mach jetzt folgendes.

Zuerst definiere ich auch die Action:

```
Action machWas = new AbstractAction() {
                                public void actionPerformed(ActionEvent e) {
                                    System.out.println(" JIPPIE: TASTENKOMBI ANGEKOMMEN!!!");
                                }
                            };
```
Dann entferne ich die TastenKombo

```
FocusManager fm = FocusManager.getCurrentManager();
                            Set newKeys = new HashSet(fm.getDefaultFocusTraversalKeys(FocusManager.
                                FORWARD_TRAVERSAL_KEYS));
                            newKeys.remove(KeyStroke.getKeyStroke("ctrl TAB"));
                            fm.setDefaultFocusTraversalKeys(FocusManager.FORWARD_TRAVERSAL_KEYS,
                                                        newKeys);
```
Und zu letzt überprüfe ich im KeyListener

```
public void keyReleased(KeyEvent e) {  
                                    if(e.isControlDown()){
                                        if(e.getKeyCode()==KeyEvent.VK_TAB)
                                            System.out.println("Endlich!!! TAB(released) mit STRG");
                                    }

                                }
```

Grüße
sylo


----------



## Michael... (2. Aug 2010)

Was ist mit der Action machWas die hat ja mit dem anderen Code nichts zu tun.

Was Du mit dem Code bisher gemacht hast ist, dass die Tastenkombination STRG+TAB im FocusManager nicht mehr als "Forward_Traversal_Key" behandelt wird. Mehr nicht.

Der Code des KeyListeners schwebt ja auch irgendwie im luftleeren Raum, aber wenn der KeyListener an einer Textkomponte registriert ist, dann würde er beim Loslassen vom TAB (bei gedrückter STRG Taste) anspringen.

Wie z.B. in folgendem Code:

```
FocusManager fm = FocusManager.getCurrentManager();
Set newKeys = new HashSet(fm.getDefaultFocusTraversalKeys(FocusManager.FORWARD_TRAVERSAL_KEYS));
newKeys.remove(KeyStroke.getKeyStroke("ctrl TAB"));
fm.setDefaultFocusTraversalKeys(FocusManager.FORWARD_TRAVERSAL_KEYS, newKeys);
JTextField text = new JTextField();
text.addKeyListener(new KeyAdapter() {
	public void keyReleased(KeyEvent e) {
		if (e.isControlDown()) {
			if (e.getKeyCode() == KeyEvent.VK_TAB)
				System.out.println("Endlich!!! TAB(released) mit STRG");
		}
	}
});
```


----------



## sylo (2. Aug 2010)

Hi

stimmt. Die Action tut nichts zur Sache, deswegen weg damit.  

Der KeyListener wird natürlich vorher erzeugt und meiner JTable, um die es sich dreht, zugewiesen.


```
KeyListener kl = new KeyListener() {
    public void keyTyped(KeyEvent e) {

    }

    public void keyReleased(KeyEvent e) {
      if(e.isControlDown()){
              if(e.getKeyCode()==KeyEvent.VK_TAB)
                   System.out.println("Endlich!!! TAB(released) mit STRG");
              }
      }

    public void keyPressed(KeyEvent e) {
                                   
    }
};

jTable.addKeyListener(kl);
```



> Was Du mit dem Code bisher gemacht hast ist, dass die Tastenkombination STRG+TAB im FocusManager nicht mehr als "Forward_Traversal_Key" behandelt wird. Mehr nicht.


Was meintest du damit. Was muss ich den noch machen?


----------



## Michael... (2. Aug 2010)

Wenn's um die JTable geht musst Du den Code ein bisschen abändern, da diese Ihre eigene FocusTraversalPolicy benutzt:

```
Set newKeys = new HashSet(table.getFocusTraversalKeys(FocusManager.FORWARD_TRAVERSAL_KEYS));
	newKeys.remove(KeyStroke.getKeyStroke("ctrl TAB"));
	table.setFocusTraversalKeys(FocusManager.FORWARD_TRAVERSAL_KEYS, newKeys);
	table.addKeyListener(new KeyAdapter() {
		public void keyReleased(KeyEvent e) {
			if (e.isControlDown()) {
				if (e.getKeyCode() == KeyEvent.VK_TAB)
					System.out.println("Endlich!!! TAB(released) mit STRG");			}
		}
	});
```


----------



## sylo (2. Aug 2010)

Hi

Danke Michael. Die Zeile wars.


```
Set newKeys = new HashSet(table.getFocusTraversalKeys(FocusManager.FORWARD_TRAVERSAL_KEYS));
```

Grüße
sylo


----------

