# Key Listener mit Strg + s



## syscon (1. Mai 2012)

Hi habe mir meinen eigenen Key Listener implementiert allerdings erkennt er die Constanten VK_S und CTRL _ MASK nicht was mache ich falsch? Komm irgendwie nicht mehr weiter und google hilft auch nicht mehr !


```
public class KeyEvent implements KeyListener{

		
		
		
		@Override
		public void keyPressed(java.awt.event.KeyEvent arg0) {
			
			if ((arg0.getKeyCode() == KeyEvent.VK_S) && ((arg0.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
                
            }
		
		}

		@Override
		public void keyReleased(java.awt.event.KeyEvent arg0) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void keyTyped(java.awt.event.KeyEvent arg0) {
			// TODO Auto-generated method stub
			
		}
		
	}
```


----------



## Gast2 (1. Mai 2012)

Ich würde dafür Keybindings nutzen. Hier mal als Beispiel an nem JButton:

```
JButton button = new JButton();

button.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK), "saveAction");
button.getActionMap().put("saveAction", new AbstractAction() {
	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("pressed");
	}
});
```
Damit lassen sich auch Aktionen für alle Komponenten eines JFrames festlegen.


----------



## KingOfExceptions (1. Mai 2012)

syscon hat gesagt.:


> ```
> public class KeyEvent implements KeyListener{
> 
> 
> ...



Das Problem wird dabei wahrscheinlich sein, dass du es nicht schaffst zwei Tasten EXAKT gleichzeitig zu drücken... hatte das Problem auch mal, musste aber mich dann damit abfinden, dass es nicht geht.  
Ich lasse mich aber da gerne noch von anderen belehren


----------



## Gast2 (1. Mai 2012)

Mit exakt Treffen hat das wenig zu tun... der modifier bleibt solange aktiv wie du die STRG Taste gedrückt hälst.
Folgender Code funktioniert Problemlos:

```
if (e.getKeyCode() == KeyEvent.VK_S && (e.getModifiers() & KeyEvent.CTRL_MASK) > 0) {
	System.out.println("CTRL + S pressed");
}
```
Trotzdem würde ich die KeyBindings vorziehen.

@TO:
Beim nochmal drüberschauen habe ich gesehen dass du die Klasse oben über ihren vollständigen Namen  ansprichst: 
	
	
	
	





```
java.awt.event.KeyEvent
```
. Später nutzt du nur noch KeyEvent, dann musst du die Klasse importieren!


----------



## syscon (1. Mai 2012)

Hi danke für deine Antwort hab das jetzt auf mein Menübar angewandt klappt auch soweit ganz gut nur jetzt wird die Menübar überall angezeigt wo ich mit der Maus rübergehe ...  auch in meinem Programm


```
public JMenuBar createMenuBar() {
		JMenuBar menuBar = new JMenuBar();
		
		JMenu Game= new JMenu("Game");
		
		menuBar.add(Game);
		
		JMenuItem start;
		JMenuItem quit;
		
		start=new JMenuItem("start");		
		quit=new JMenuItem("quit");
		
		start.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK), "startAction");
		start.getActionMap().put("startAction", new AbstractAction() {
		    @Override
		    public void actionPerformed(ActionEvent e) {
		        
		   }
		});
		quit.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_MASK), "quitAction");
		quit.getActionMap().put("quitAction", new AbstractAction() {
		    @Override
		    public void actionPerformed(ActionEvent e) {
		    	
		    	System.exit(0);
		        
		   }
		});
		
		
		Game.add(start);
		Game.add(quit);
		
		
		return menuBar;
	}
```


----------



## syscon (1. Mai 2012)

so habe den Code jetzt nochmal verändert!

Aktueller Stand: 

Habe jetzt doch Key Listener benutzt war wirklich nur dieser eine Import Fehler! 

Aber wie sage ich dem Menü jetzt das es den  Key Listener benutzten soll? 


```
public JMenuBar createMenuBar() {
		JMenuBar menuBar = new JMenuBar();
		
		JMenu Game= new JMenu("Game");
		
		menuBar.add(Game);
		
		JMenuItem start;
		JMenuItem quit;
		
		start=new JMenuItem("start");		
		quit=new JMenuItem("quit");
		
		KeyEvent k=new KeyEvent();
		
		//HIER KOMME ICH NICHT WEITER
		
		Game.add(start);
		Game.add(quit);
		
		
		return menuBar;
	}
	

public class KeyEvent implements KeyListener{
 
        
        
        
        @Override
        public void keyPressed(java.awt.event.KeyEvent arg0) {
            
            if ((arg0.getKeyCode() == java.awt.event.KeyEvent.VK_S) && ((arg0.getModifiers() & java.awt.event.KeyEvent.CTRL_MASK) != 0)) {
             
            	
            	
            }
            if ((arg0.getKeyCode() == java.awt.event.KeyEvent.VK_Q) && ((arg0.getModifiers() & java.awt.event.KeyEvent.CTRL_MASK) != 0)) {
             
            System.exit(0);	
            	
            }
        
        }
 
        @Override
        public void keyReleased(java.awt.event.KeyEvent arg0) {
            // TODO Auto-generated method stub
            
        }
 
        @Override
        public void keyTyped(java.awt.event.KeyEvent arg0) {
            // TODO Auto-generated method stub
            
        }
        
    }
```


----------



## Gast2 (1. Mai 2012)

Warum erzeugst du da ne KeyEvent instanz?

Du kannst dem JMenuItem nen actionListener adden.
Wenn du willst dass bestimmte Menüeinträge auf Tastendruck reagieren gibts dafür die Mnemonics, dafür ist nen KeyListener wirklich das falsche.


----------



## syscon (1. Mai 2012)

Warum ich das benutze ganz einfach habe keine Ahnung und in der Uni kriegt man nichts beigebracht sondern es wird nur auf irgendwelche oracle tuts verwiesen 

ok Accelerator 

hab das mal eingefügt kommt ne Fehlermeldung  bei 'C' :Syntax Error on Tokens ArgumentList Expected Instead!


```
start.setAccelerator(
				  KeyStroke.getKeyStroke(’C’, InputEvent.CTRL_MASK)
				);
```


----------



## Gast2 (1. Mai 2012)

’C’ => 'C'


----------



## syscon (1. Mai 2012)

Hehe Danke  und wo sage ich ihm nun was er zu tun hat? also z.B. Programm schließen


----------



## Gast2 (1. Mai 2012)

Hab ich doch oben schon geschrieben, du addest dem JMenuItem nen ActionListener.
How to Use Menus (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## syscon (1. Mai 2012)

ich komme echt nicht weiter da und muss nochmal fragen habe jetzt


```
start.addActionListener(this);
```

hinzugefügt und bekomme nun die Fehlermeldung: The Method addActionListner in the Type Abstract Button is not applicable for the Arguments (Gamefield) 

Muss ich den vorher im Konstruktor Instanzieieren und wenn ja wie?


----------



## Gast2 (1. Mai 2012)

Du musst eine Instanz eines ActionListeners übergeben. Dein Gamefield ist anscheinend kein ActionListener.

Entweder ne neue Klasse erstellen die ActionListener implementiert oder eine Klasse ActionListener implementieren lassen und this übergeben.


----------

