# Tastatur Aktion



## DownTheHill (30. Apr 2012)

Hallo Forum,

Ich habe mal eine generelle Frage zu einem bestimmten Problem.

Und zwar habe ich mit Java eine Oberfläche erstellt, die einen Knopf hat, welcher eine bestimmte Aktion durchführt sobald auf ihn geklickt wird. 
Jetzt möchte ich aber gerne, dass ich nicht direkt mit der Maus auf den Button klicken muss, sondern eifnach eine Taste auf der Tastatur drücken kann, damit der Button aktiviert wird.

Ich hoffe ihr könnt mir weiterhelfen.

Gruß

DownTheHill


----------



## eRaaaa (30. Apr 2012)

Such mal nach Mnemonics 
-> Ein Beispiel:  Mnemonic Sample : ButtonSwing JFCJava (ALT+W)


----------



## KingOfExceptions (30. Apr 2012)

Key Listener -> JAVA API


----------



## irgendjemand (1. Mai 2012)

alternativ auch "global KeyBindings"


----------



## DownTheHill (1. Mai 2012)

Okay, danke ersteinmal. 
Die erste Antwort sieht recht einfach aus? Aber wie binde ich das nun genau in mein Java Programm ein?


----------



## Gast2 (1. Mai 2012)

deinButton.setMnemonic(...);
AbstractButton (Java 2 Platform SE v1.4.2))


----------



## DownTheHill (1. Mai 2012)

Dann bekomme ich immer eine Fehlermeldung. Der Compiler zeigt dannimme rauf den Punkt zwischen dem Namen meines Buttons und setMnemonic


----------



## DownTheHill (2. Mai 2012)

Meine bisherige Idee:


```
meinbutton.addKeyListener( new KeyListener()
    {
      public void keyPressed( KeyEvent arg0 ){

           // die Aktion, die dann durchgeführt werden soll
     }

      public void keyReleased( KeyEvent arg0 ){

          // die Aktion, die dann durchgeführt werden soll
      }

      public void keyTyped( KeyEvent arg0 ){

         // die Aktion, die dann durchgeführt werden soll
     }
    });
```

Damit habe ich ja aber nur erreicht, dass ich mit den Nummern 1-9 die Leertaste ersetzt habe.

Ich möchte aber, dass wenn ich "a" drücke der 1.Button aktiviert wird und wenn ich "b" drücke der 2.Button aktiviert wird.
Was muss ich dazu tun?

Danke für Antworten

Gruß

DTH


----------



## DownTheHill (3. Mai 2012)

Weiß denn keiner weiter??

mfG

DTH


----------



## Volvagia (3. Mai 2012)

Solche KeyListener eignen sich grundsätzlich nicht für Programme, die Komponenten beinhalten, die sich den Focus schnorren (z. B. Buttons und TextFelder), da er nur ausgelöst wird, falls der Komponent auf dem er registriert ist den Focus hat.
Globale KeyBindings sind - soweit ich sie kenne - meistens nativ implementiert und deshalb so gut wie nicht plattformunabhängig.

Zeig mal, wie du die Mnemonic registrieren wolltest.


----------



## DownTheHill (3. Mai 2012)

Danke ersteinmal für die Antwort.

So wie ich das mit den Mnemonic verstanden habe ist nur diese Zeile notwendig:

```
meinButton.setMnemonic(KeyEvent.VK_A);
```

Aber das klappt bei mir nicht. Wäre ja auch irgendiwe zu einfach 

Reicht diese Zeile oder brauche ich noch mehr?

Gruß

DTH


----------



## 127.0.0.1 (3. Mai 2012)

DownTheHill hat gesagt.:


> Und zwar habe ich mit Java eine Oberfläche erstellt, die einen Knopf hat, welcher eine bestimmte Aktion durchführt sobald auf ihn geklickt wird.



MouseEvents
*
MOUSE_CLICKED*


```
public static final int MOUSE_CLICKED

    The "mouse clicked" event. This MouseEvent occurs when a mouse button is pressed and released.
```

vielleicht hilft dir das weiter

Gruß


----------



## DownTheHill (3. Mai 2012)

Aber mein Problem aht ja nichts mit der Maus zu tun.
Ich möchte ja mit eienr Taste auf der Tastatur den Button aktivieren.

Gruß

DTH


----------



## 127.0.0.1 (3. Mai 2012)

ok, sry, mein Fehler

dann das selbe ebend mit dem KeyListener 
*
keyPressed*


```
void keyPressed(KeyEvent e)

    // Invoked when a key has been pressed. See the class description for KeyEvent for a definition of a key pressed event.
```



Gruß


----------



## DownTheHill (3. Mai 2012)

"Volvagia" meinte ja aber, dass der  KeyListener sich nicht so gut eignet.
Ich habe halt 2 Button. Beide sollen die Möglichkeit bekommen durch verschiedene Tasten aktiviert zu werden.

Er meinte mit Mnemonics komme ich eher zum Ziel.

Ich selber weiß nicht was für meine Anwendung zielführender ist.

Was denkt ihr?

Gruß

DTH


----------



## 127.0.0.1 (3. Mai 2012)

du könntest auch ein Thread im Hintergrund laufen lassen der immer "hört" ob eine Taste gedrückt wurde, und dann halt eine Aktion ausführen


----------



## DownTheHill (3. Mai 2012)

Okay klingt gut.
Aber wie mache ich das genau?

Gruß

DTH


----------



## 127.0.0.1 (3. Mai 2012)

DownTheHill hat gesagt.:


> Aber wie mache ich das genau?



gute Frage ^^
Threads in Java

Allzugut kenn ich mich bei Threads auch nicht aus, weiß nur wie sie gestartet und angehalten werden....
Würde aber versuchen den KeyListener in einen Thread zu packen


```
class TestThread extends Thread {
  
    public void run() {
      //hier die while oder for Schleife {
        try {
          sleep(100);
        }
        catch(InterruptedException e) {
        }
        // und hier der KeyListener
      }
    }
  
  }
```

bitte nicht für den Code schlagen, bin kein Thread-Experte


----------



## Volvagia (3. Mai 2012)

Du willst im Thread einen KeyListener registrieren, nur um ihm dort abzufangen, obwohl Listener-Methoden sowieso vom EDT abgearbeitet werden? :autsch:

Falls du einen KeyListener benutzt wird er am Frame nichtmehr funktionieren, sobald du in ein TextField klickst und am TextField, sobald du einen Button etc. anklickst. Du müsstest ihm quer durchs ganze Programm anheften. Bei Buttons kannst du noch deaktivieren, dass er sich den Focus schnappt, bei Textfeldern geht das aber nicht.


```
package org.javaforum.downthehill;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class KeyExample {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				build();
			}
		});
	}
	private static void build() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JButton[] buttons = new JButton[2];
		
		buttons[0] = new JButton("Alt + A");
		buttons[0].addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "Button A wurde gedrückt");
			}
		});
		buttons[0].setMnemonic('a');
		frame.add(buttons[0], BorderLayout.NORTH);
		
		buttons[1] = new JButton("Alt + B");
		buttons[1].addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "Button B wurde gedrückt");
			}
		});
		buttons[1].setMnemonic('b');
		frame.add(buttons[1], BorderLayout.SOUTH);
		
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
```


----------



## DownTheHill (3. Mai 2012)

Danke ersteinmal für die Antwort.

Sieht recht komplizeirt aus  Geht das mit Mnemonic nicht einfacher?
Bin nämlich nicht so der Genie im Programmieren.

Gruß

DTH


----------



## 127.0.0.1 (3. Mai 2012)

ich sagte ja dass ich kein Thread Experte bin 
danke für den Code

Wenn man auf dem Richtigen Weg ist lassen sich auch ein paar Hilfreiche Tipps finden ^^


----------



## DownTheHill (3. Mai 2012)

Wie schauts nun mit den Mnemonics aus?
War mein Anfang in ein paar Kommentaren vorher schonmal ungefähr richtig?

Gruß

DTH


----------



## Volvagia (3. Mai 2012)

http://www.java-forum.org/894637-post19.html

@127.0.0.1: LOL, dein Ava errinnert mich an "Bitchchecker". Kann sich daran noch jemand errinnern oder ist der hier überhaupt bekannt? ^^


----------



## 127.0.0.1 (3. Mai 2012)

> @127.0.0.1: LOL, dein Ava errinnert mich an "Bitchchecker". Kann sich daran noch jemand errinnern oder ist der hier überhaupt bekannt? ^^



Du sprichst in unbekannten Sätzen :rtfm:


----------



## Volvagia (3. Mai 2012)

Sry, verklickt.


----------



## Volvagia (3. Mai 2012)

127.0.0.1 hat gesagt.:


> Du sprichst in unbekannten Sätzen :rtfm:





Volvagia hat gesagt.:


> [OT]M4tr1x-Trilogie : Brain Farts : News : StopHipHop.com - Mehr Bildung für Rapper[/OT]



Das meinte ich. ^^


----------



## 127.0.0.1 (3. Mai 2012)

LOL, das kannt ich noch gar nicht ^^
schau ich mich mal um, sieht interessant aus 

Zurück zum Thema

@DownTheHill: schon weitergekommen ?
Oder noch fragen ?


----------



## DownTheHill (3. Mai 2012)

Danke Danke ersteinmal!

Wie wäre die Mnemonic Variante?

Gruß

DTH


----------



## ESCS (3. Mai 2012)

Registrier einen AWTEventListener via Toolkit.addAWTEventListener:


```
AWTEventListener ael = new AWTEventListener() {
	public void eventDispatched( AWTEvent event ) {
		//Verarbeitung des Events
	}
};
Toolkit.getDefaultToolkit().addAWTEventListener( ael, AWTEvent.KEY_EVENT_MASK );
```

Dadurch kannst du *alle* KeyEvents empfangen & verarbeiten. Anschließend könntest du über JButton.doClick(); einen Klick simulieren (oder den entsprechenden Code direkt im AWTEventListener ausführen).


----------



## Volvagia (3. Mai 2012)

DownTheHill hat gesagt.:


> Danke Danke ersteinmal!
> 
> Wie wäre die Mnemonic Variante?
> 
> ...



Hab dir doch einen Beispielcode gepostet: http://www.java-forum.org/894637-post19.html


----------



## DownTheHill (3. Mai 2012)

Vielen Dank an alle die mir geholfen haben!
Ich werde mich jetzt mal hinsetzen und mir die Vorschläge anschauen.

@volvagia
Vielen Danke für den Link, habe ich übersehen. Tut mir Leid.

Gruß

DTH


----------



## DownTheHill (3. Mai 2012)

Die Benutzeroberfläche von meinem schon bestehenden Programm ahbe ich über die AWT Funktion erstellt.
Mein einer Button ist ein normaler Button und heißt "Start". Kann ich irgendwie sagen, dass 
	
	
	
	





```
buttons[0] =  Start
```
 ist? buttons[0] ist ja nämlich ein JButton.

Gruß

DTH


----------



## Volvagia (3. Mai 2012)

Ich glaube nicht, dass AWT Mnemonic unterstützt. Dann musst du wohl einen KeyListener überall anheften, ESCS Methode benutzen oder auf so eine Keybinding-Api zurückgreifen.

Allerdings würde ich dir von AWT abraten. Einerseits wird es vom OS gerendert und ist nicht so plattformunabhängig, andererseits basiert Swing auf AWT, deshalb kannst du dort grundsätzlich alles, was du mit AWT kannst und hast noch ein paar weitere Möglichkeiten. z. B. Methoden, die auf dem ersten Blick nicht viel her machen, aber das Leben doch vereinfachen können. Als erstes Beispiel fällt mir da spontan die DefaultCloseOperation ein.


----------



## DownTheHill (3. Mai 2012)

Das ist natürlich ganz blöd.
Ich habe keine Ahnung wie man anders als mit AWT Benutzeroberflächen macht.

Wie würdest du denn überall KeyListener anbinden?

Gruß

DTH


----------



## Volvagia (3. Mai 2012)

Einfach in eine Konstante schreiben und nach dem Anlegen jedes Komponents hinzufügen.


----------



## DownTheHill (3. Mai 2012)

Ich weiß zwar nicht was du mit dem letzten Beitrag meinst, aber wird schon richtig sein.
Ich habe es jetzt aufjedenfall hinbekomen. Ich hatte schon am Anfang als du mir die Mnemonic gezeicht hast fast alles richtig. Einziger Fehler war, dass ich AWT und nicht Swing verwendet habe. Habe es nun geändert und es funktioniert super. 

Vielen Dank !!

Gruß

DTH


----------



## 127.0.0.1 (4. Mai 2012)

Volvagia hat gesagt.:


> Einfach in eine Konstante schreiben und nach dem Anlegen jedes Komponents hinzufügen.



--> Konstanten in Java sogar hier ausm Forum


----------

