Fokus auf Oberfläche setzen

Saban

Erfahrenes Mitglied
Guten Morgen zusammen!

Ich habe einen Taschenrechner programmiert, welcher auch einwandfrei funktioniert. Diesen möchte ich jetzt aber auch mit der Tastatur ansteuern können, deshalb implementierte ich einen KeyListener der auch funktioniert. Das einzige Problem ist das der KeyListener erst funktioniert wenn ich einmal mit der Maus auf irgendeinen Button Klicke.
Ich habe den Fokus schon auf einige Elemte (Panel, Frame, Button, ...) gesetzt das Ergebnis blieb jedoch immer das gleiche.
Könnt ihr mir vllt helfen das ich gleich wenn der Taschenrechner erscheint mit der Tastatur loslegen könnte!?

Ich bedanke mich schon mal im voraus für die Mühe!

MfG
Saban
 
Hi!

erst mal Danke für deine Antwort! Ich hab mir den Link grad angesehen und da heißt es vom maddin "Nabend! Das Problem ist, dass du den Focus auf dem Button hast" genau das will ich ja erreichen! ich habe ja 20 Buttons oder so und denen soll ein KeyListener zugewiesen werden. Wenn ich also den Focus auf einen Button setze sollte es doch eigentlich funktionieren oder?
Hab ich auch schon gemacht geht aber nicht... :(

MfG
Saban
 
Hi,
so wie ich dich verstehe, möchtest du, dass man den Rechner komplett ohne Maus bedienen kann.
Wen dem so ist, würde ich den Listener nicht auf einen Button, sondern auf den kompletten Frame setzen. Das hat zumindest bei mir funktioniert.
Und noch ein kleiner Tipp:
Ich implementiere nicht KeyListener, sondern ich erweitere die Klasse KeyAdapter, welche KeyListener implementiert und überschreibe einfach nur die gewünschte Methode. Erspart Schreibkram :).
Ciao
DosCoder
 
Hey!

genau das will ich! Der Rechner soll wenn er aufgerufen wird komplett Maus frei gesteuert werden können.
Könntest du mir vllt ein bisschen Code zu deinem KeyAdapter posten hört sich interessant an!

Danke schon mal!

MfG
Saban
 
Klar. Hier ein Beispiel.
Java:
import java.awt.event.*;
public class MyKeyListener extends KeyAdapter{

     JFrame parent;

     public MyKeyListener(JFrame frame){
         parent = frame; // um mit den Methoden auf den Elternframe zuzugreifen zu können
     }

     //Hier wird nur die Methode implementiert, die du haben willst, du musst nicht
     //alle auf einmal verwenden.
    @Override public void MousePressed(KeyEvent e){
        tuWas();
        tuNochMehr();
    }
}

Mit e.getKeyCode() kannst du die gedrückte Taste filtern und mit switch dann die Operation wählen.
Hier ein Link zu den KeyCodes.

Verwendet wird der obige Listener wie gewohnt:
Java:
public class MyFrame  extends JFrame{
 public MyFrame(){
  super();
  add(new MyKeyListener(this));
 }
}

Diese Methode ist aber bei deinem Beispiel nicht zu verwenden, da durch den switch-Aufruf das ganze OO-Konzept übern Haufen geworfen wird. Ich würde dir raten, Mnemonics zu verwenden:

Java:
JButton b = new JButton();
b.setMnemonic('A');// der ActionListener des Buttons wird aufgerufen, wenn Alt-A gedrückt wird.
Die Methode setMnemonic() besitzen alle Unterklassen von AbstractButton.

Ciao
DosCoder
 
Zuletzt bearbeitet:
Guten Morgen!

Vielen Dank für die tollen Tips! Ich werde die heute Abend daheim gleich mal genauer unter die Lupe nehmen :)
Leider funktioniert das mit dem Fokus aber immer noch nicht... :(

ich habe frame.requestFocus und frame.requestFocusInWindow() ausprobiert und leider hilft des alles nichts... :( :( :(
hat sonst noch jemand eine idee!

Danke nochmal!

MfG
Saban
 
Zuletzt bearbeitet:
Hi, wozu brauchst du denn jetzt noch den Fokus? Die Mnemonics greifen immer, es muss nur der Frame fokusiert sein.
Ciao
DosCoder
 
Hi!

Ich möchte den Taschenrechner über den Ziffernblock benutzen können. Das Problem bei dem Mnemonics ist das ich dann noch die Alt-Taste mit drücken müsste... Die KeyListern greifen halt ob ich den Ziffernblock nutze oder die Zahlenreihe über den Buchstaben auf der Tastatur...
Ich hoffe das du jetzt meine Problem verstehst

MfG
Saban
 
Hi,
ja jaetzt verstehe ich es. aber für den KeyListener brauchst du nur den Fokus auf dem Frame (in Windows: Titelleiste blau). Am simpelsten und der OOP passend gemacht würde ich dir dies empfehlen. Diesmal gebe ich keinen Code vor, es bringt viel mehr wenn du es selbst in die Tat umsetzt. Oben hast du ja schon ein Listener-Beipsiel.

Code:
1. Schreibe Eigene Buttons, die die Methode ausführen() ouder so impemtieren.
2. Nachdem auf deiner Form alle Buttons erstellt worden sind, packst du sie ein ein Array.
    Am besten geht das mit JFrame.getComponents(index i) einem Cast in einen Button.    Dieses Prinzip geht natürlich nur, wenn du alle Buttons hintereinander eingefügt hast.
3. Schreibe dir einen KeyListener, den den obigen Array entgegen nimmt.
4. Bei Tastendruck errechne dir aus dem KeyCode die gedrückte Zahl und speichere sie als int.
5. Nimm den Button aus dem Array und führe die Methode ausführen() aus.

Ich hoffe ich konnte dir weiterhelfen. Du kannst gerne weiterfragen, aber versuch das erst einmal in die Tat umzusetzen.

Ciao
DosCoder
 
Zurück