# Listener Suche für F1



## Gast2 (12. Dez 2007)

Hallo,

ich hatte das Problem schon einmal und wollte jetzt mal Fragen ob einer eine Antowort bzw.Idee hat, was damals nicht der Fall war.

Ich habe ein Hauptframe auf dem mehrer Panels sind und diese Panels weitere komponeneten haben. Nun will ich egal auf welcher komponete gerade der focus ist wenn man F1 drückt eine Hilfe(extra frame) aufgeht....
Das Problem ist ich kann doch nicht jeder meiner Komponenten einen KeyListener anhängen ...also können schon funktioniert auch, aber ich ist ziemlich unpraktisch....
Ein keyListener auf den Hauptframe bringt nichts weil dieser "fast" nie den Focus hat und darum nie das Keyevent dort erfolgt...

Hat jemand eine bessere Lösung ???


----------



## Wildcard (12. Dez 2007)

InputMap und ActionMap heißen die Zauberwörter.


----------



## Gast2 (12. Dez 2007)

ja aber diese muss ich ja auch auf jede Komponentenklasse(button,textfeld) einfügen oder????
oder reagiert der Action den ich in der inputmap setze auf meine hauptframe wenn dieser kein focus hat???


----------



## Wildcard (12. Dez 2007)

Ein einfacher Blick in die API hätte schon genügt diese Frage zu beantworten:
http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#getInputMap(int)


----------



## Gast2 (12. Dez 2007)

ja schon...
ABER was ich nicht ganz verstehe ist WHEN_IN_FOCUSED_WINDOW ... 
heißt dass ich die inputmap meines hauptframe ändere ... meine frage ist funktionier die sache dann auch wenn mein hauptframe keinen focus mehr hat ????oder ist das das hauptframe dann die condition WHEN_IN_FOCUSED_WINDOW was bedeutet es würde funktionieren?????


----------



## Wildcard (12. Dez 2007)

Nimm zB die Content Pane mit der Condition WHEN_ANCESTOR_OF_FOCUSED_COMPONENT. WHEN_IN_FOCUSED_WINDOW würde natürlich auch funktionieren.


----------



## Gast2 (13. Dez 2007)

ok alles klar ich versuchs mal...
d.h dass meine contentPane hat immer den window focus hat????? oder was bedeudet das WHEN....


----------



## Guest (13. Dez 2007)

In meinem JFrame gibt es keine InputMap.....


----------



## Wildcard (13. Dez 2007)

Seit wann ist ein JFrame eine JComponent?


----------



## Guest (13. Dez 2007)

Also wie ich das richtig sehe kann ich nur Klassen die von JComponent erben die InputMap ändern...
Das heißt es hilft mit bei meinem Problem nicht weiter, da ich ja wieder jeden Komponenten Klasse anfassen muss....
ich wollte nur mein jFrame ändern, die keine InputMap hat


----------



## Wildcard (13. Dez 2007)

Du musst die InputMap *einer* JComponent ändern


----------



## Gast2 (13. Dez 2007)

Dass ich von meiner JFrame die InputMap NICHT ändenr kann ist mir klar, ABER ich muss jetzt die Inputmap aller meiner BasisKlassen ändern z.B. textfelder ,buttons etc.... 
oder ich versteh dich net ganz ...
wäre nett wenn du ein kurzes Beispiel posten kannst...(wie das mit der Inputmap funktioniert ist mir klar) nur nicht wie ich die oberklasse mache....

Mein Ziel ist nicht in jeder Basisklasse die Inputmap zu änder...
Aber ich weiß nicht wie ich die obeklasse von den JComponenten hinbekomme....

ich hoffe es war jetzt verständlicher =) =)


----------



## Wildcard (13. Dez 2007)

Ich hab doch schon gesagt das du zB die ContentPane nehmen kannst, da sie der Parent aller JComponents in deinem JFrame ist.


----------



## Gast2 (13. Dez 2007)

??? Sorry versteh ich nicht....
Also die ContentPane hat auch keine inputMap???
oder meinst du ich soll mit einer schleife alle meine Componenten holen und dort die inputmap dann ändenr?


----------



## Wildcard (13. Dez 2007)

:roll: 
Irgendein JPanel als ContentPane verwenden und dort die InputMap anpassen. Von mir aus auch einfach ein JPanel auf den Frame adden und selbiges dort erledigen. Kann doch nicht so schwierig sein


----------



## Gast2 (13. Dez 2007)

ja jetzt hab ich verstanden was du meinst ok ich versuchs mal =)

ich dachet du meintest frame.getContenPane()


----------



## Niki (13. Dez 2007)

so gehts auch:

```
InputMap im = ((JComponent)getContentPane()).getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
```


----------



## Gast2 (13. Dez 2007)

ok alles klar was für einen Listener nehme ich dann?


----------



## Niki (13. Dez 2007)

gar keinen Listener sondern eine AbstractAction, du mappst einen KeyCode auf einen String, und bei der ActionMap den String auf eine AbstractAction

```
JComponent c = (JComponent)getContentPane();
InputMap im = c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = c.getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), "F1");
am.put("F1", new AbstractAction(){
  public void actionPerformed(ActionEvent e){
    System.out.println("F1 typed");
  }
});
```


----------



## Gast2 (13. Dez 2007)

okay danke 

nur zum verständniss 
in der inputmap stehen alles meine Ergeinisse , die die actionPerformed aufrufen???

und was genau passiert mit der ActionMap???


----------



## Niki (13. Dez 2007)

Du definierst für ein oder mehrere KeyCodes ein oder mehrere actions (der zweite Paramter). So ist es Möglich auf zwei verschiedene KeyCodes die gleiche Action auszuführen!


----------



## Gast2 (13. Dez 2007)

also kann ich den 2ten Parameter mehrmals vergeben????

Aber was genau steht in der ActionMap und was in der InputMap ich versteh das zusammenspiel noch nicht richtig


----------



## Niki (13. Dez 2007)

der zweite Parameter der InputMap (also der value) ist der erste Parameter der ActionMap (also der key). Über diesen String wird das Mapping erzeugt.


----------



## Gast2 (13. Dez 2007)

ok soweit ist es klar....

1.wenn ich einer jComponente aber einen ActionListern anhängen kann z.B. JButton dann muss ich in der Actionmap nichts verändern sondern nur die Inputmap erweitern?????
2. Stehen alle Action Ereignisse in der Actionmap?


----------



## Niki (13. Dez 2007)

InputMap und ActionMap sind für KeyEvents, wenn du einem Button einen ActionListener hinzufügst, hat das nichts damit zu tun. Der ActionListener beim Button reagiert auf Mouseclicks auf die Komponente. Vor Version 1.4 hat man einfach einen KeyListener dem Frame hinzugefügt und das hat funktioniert. Ab 1.4 muss man halt die Keys auf die man lauschen will über die Input- und ActionMaps registrieren.


----------



## Gast2 (13. Dez 2007)

ok alles klar...

aber wenn ich den Codeteil an einen Button anfüge funktioniert es mit einem ActionListener was ich übrgens hie rim Forum gefunden hab darum komm ich grad ein bischen durcheinander...

http://www.java-forum.org/de/viewtopic.php?p=179246


----------

