# JFrame > JTabbedPane > JPanel > addKeyListener



## Anony (2. Sep 2010)

tag die herren

habe die im titel genannte hierarchie: JFrame > JTabbedPane > JPanel > addKeyListener

leider kommt beim KeyListener nie ein event an. wenn ich den KeyListener aber an das JFrame oder das JTabbedPane packe, bekomme ich wie gewünscht meine events - nur halt an der falschen stelle. habe auch schon setFocusable(true) und requestFocus() für das JPanel nach dem hinzufügen des KeyListener ausprobiert - leider ohne erfolg.

wenn ich aber ein KeyEvent mit getInputMap bzw getActionMap im JPanel registiere, kommen da auch events an - nur leider brauche ich die keyPressed und keyReleased events, welche ich über diesen weg nicht erhalte.

natürlich könnte ich einen KeyListener an den JFrame hängen und die events weitergeben. das ist aber ziemlich unschön und ich bekomme auch events aus anderen tabs.

so langsam bin ich mit meinem latein am ende - hat von euch jemand eventuell einen tip?

danke schonmal - anony


----------



## Gast2 (2. Sep 2010)

Was hast du denn genau vor?


----------



## Anony (2. Sep 2010)

KeyEvents in einem JPanel erhalten die in einem JTabbedPane ist?


----------



## Gast2 (2. Sep 2010)

Meine Kristallkugel sagt mir, dass das JPanel dafür den Focus braucht...
Mach ein KSKB...


----------



## Anony (2. Sep 2010)

wie oben geschrieben habe ich es bereits mit setFocusable(true) und requestFocus() für das JPanel versucht - wenn ich danach nicht den focus habe weis ich auch nicht weiter.

was ist kskb?


----------



## Anony (2. Sep 2010)

ah ok, jetzt weis ich was ein kskb ist. werd mich dann mal drüber machen.


----------



## Gast2 (2. Sep 2010)

Ja Focus sachen sind immer schwer einfach so nachzuvollziehen...

Aber bei solchen Sachen benutze ich gerne KeyBindings, aber ich kenn deine Anforderung nicht...

http://www.java-forum.org/awt-swing-swt/105067-keyevents-fuer-numpad.html


----------



## Anony (2. Sep 2010)

classFrame.java

```
package packageTest;

import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JTabbedPane;

public class classFrame extends JFrame {
	private JTabbedPane tabbedPaneHandle = null;
	
	public static void main(String[] args) {
		new classFrame();
	}
	
	public classFrame() {
		this.setSize(200, 200);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		this.tabbedPaneHandle = new JTabbedPane();
		
		this.tabbedPaneHandle.addTab("Test", new classPanelTest());
		
		this.add(this.tabbedPaneHandle);
		
		this.setVisible(true);
	}
}
```

classPanelTest.java

```
package packageTest;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

public class classPanelTest extends JPanel {
	public classPanelTest() {
		this.addKeyListener(new KeyListener() {
			public void keyPressed(KeyEvent e) {
				System.out.println(e);
			}
			
			public void keyReleased(KeyEvent e) {
				System.out.println(e);
			}

			public void keyTyped(KeyEvent e) {
				System.out.println(e);
			}
		});
		
		this.setFocusable(true);
		this.requestFocus();
	}
}
```

in der console wird nie etwas ausgegeben ... hmnz


----------



## Mofi (2. Sep 2010)

uhm versuch es mal mit der Methode 
	
	
	
	





```
requestFocusInWindow()
```
 allerdings weiß ich grad nicht mehr aus dem Kopf ob die protected oder public war  
Aber genau die Methode hab ich damals benutzt, als ich für ein bestimmtes JPanel den Focus gebraucht hatte und es ging damit einwandfrei.


----------



## Anony (2. Sep 2010)

KeyBindings kann ich deshalb nicht verwenden, da ich wissen muss, wann die taste gedrückt und wann wieder losgelassen wurde - siehe erster post.

sorry für die doppelposts ...


----------



## Anony (2. Sep 2010)

requestFocusInWindow()

hab ich auch schon probiert - leider ohne erfolg


----------



## eRaaaa (2. Sep 2010)

die request Methode am Besten erst ganz am Ende aufrufen - nach dem setVisible, dann sollte auch dein Code funktionieren (Klassen groß!)

```
classPanelTest t = new classPanelTest();
        this.tabbedPaneHandle.addTab("Test", t);
        this.add(this.tabbedPaneHandle);
        this.setVisible(true);
        t.requestFocus();
```

Allerdings, wirst du spätestens dann, wenn du zu einem anderen Tab oder auf eine Komponente wie z.B. einem Button in dem aktuellen Tab drückst, den Fokus wieder verlieren...


----------



## Anony (2. Sep 2010)

danke schonmal, so funktioniert das zumindest temporär.

trotzdem kann das doch iwi nicht sein, dass das auf normalem wege nicht geht ... irgendwelche anderen vorschläge?


----------



## Mofi (2. Sep 2010)

Anony hat gesagt.:


> danke schonmal, so funktioniert das zumindest temporär.
> 
> trotzdem kann das doch iwi nicht sein, dass das auf normalem wege nicht geht ... irgendwelche anderen vorschläge?



Was ist denn der "normale weg"?
Ich kenn es nur so, dass man dem Panel den Focus geben muss.


----------



## Anony (2. Sep 2010)

ich halte es für normal, wenn das panel den focus bekommt, wenn ich es (den tab) auswähle.


----------



## Gast2 (2. Sep 2010)

Du musst dein requestFocus in einen SwingUtilities#invokeLater packen dann sollte es gehen...


----------



## Anony (2. Sep 2010)

hab die classPanelTest.java klasse erweitert:

```
package packageTest;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class classPanelTest extends JPanel {
	public classPanelTest() {
		this.addKeyListener(new KeyListener() {
			public void keyPressed(KeyEvent e) {
				System.out.println(e);
			}
			
			public void keyReleased(KeyEvent e) {
				System.out.println(e);
			}

			public void keyTyped(KeyEvent e) {
				System.out.println(e);
			}
		});
		
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				requestFocus();
			}
	    });
	}
}
```

funktioniert nicht und wenn ich das richtig interpretiere, würde das ja auch nur so lang gut gehen, bis das panel den focus wieder verliert.


----------



## Gast2 (2. Sep 2010)

Klar verliert das Panel den Fokus irgendwann wieder wäre ja schlimm wenn nicht sonst könntest ja nie mehr was in ein textfeld eintragen^^...


```
tabbedPaneHandle.addFocusListener(new FocusListener() {
			
			@Override
			public void focusLost(FocusEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void focusGained(FocusEvent e) {
				classPanelTest.requestFocus();
				
			}
		});
```

oder besser noch


```
tabbedPaneHandle.addFocusListener(new FocusListener() {
			
			@Override
			public void focusLost(FocusEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void focusGained(FocusEvent e) {
				tabbedPaneHandle.getSelectedComponent().requestFocus();
				
			}
		});
```


----------



## Anony (2. Sep 2010)

danke - funktioniert einwandfrei


----------

