Key Listener mit Strg + s

syscon

Mitglied
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 !

Java:
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
			
		}
		
	}
 
Ich würde dafür Keybindings nutzen. Hier mal als Beispiel an nem JButton:
Java:
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.
 
Java:
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)) {
                
            }
		
		}
		
	}

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 🙂
 
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:
Java:
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:
Code:
java.awt.event.KeyEvent
. Später nutzt du nur noch KeyEvent, dann musst du die Klasse importieren!
 
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

Java:
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;
	}
 
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?

Java:
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
            
        }
        
    }
 
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.
 
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!

Java:
start.setAccelerator(
				  KeyStroke.getKeyStroke(’C’, InputEvent.CTRL_MASK)
				);
 
ich komme echt nicht weiter da und muss nochmal fragen habe jetzt

Java:
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?
 
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.
 

Neue Themen


Zurück
Oben