# Probleme mit KeyListener



## lokiht (21. Mrz 2006)

Hallo,
in folgendem Codebeispiel funktioniert der KeyListener nicht. Woran kann das liegen?


```
public GlassPane getGp() {
		gp = new GlassPane();

		gp.addMouseMotionListener(new MouseMotionAdapter() {

			public void mouseMoved(MouseEvent e) {
				if (e.getX() < resulotion.abstand
						&& e.getY() < resulotion.abstand) {
					if (!isRunning)
						;
					new Thread(new obenLinks()).start();
				} else {
					stopRun = true;
				}
			}

		});

		gp.addMouseMotionListener(new MouseMotionAdapter() {

			public void mouseMoved(MouseEvent e) {
				if (e.getX() > resulotion.abstand
						&& e.getY() < resulotion.abstand
						&& e.getX() < resulotion.getX() - resulotion.abstand) {
					if (!isRunning)
						;
					new Thread(new oben()).start();
				} else {
					stopRun = true;
				}
			}

		});

		gp.addMouseMotionListener(new MouseMotionAdapter() {

			public void mouseMoved(MouseEvent e) {
				if (e.getX() > resulotion.getX() - resulotion.abstand
						&& e.getY() < resulotion.abstand) {
					if (!isRunning)
						;
					new Thread(new obenRechts()).start();
				} else {
					stopRun = true;
				}
			}

		});

		gp.addMouseMotionListener(new MouseMotionAdapter() {

			public void mouseMoved(MouseEvent e) {
				if (e.getX() > (resulotion.getX() - resulotion.abstand)
						&& e.getY() > resulotion.abstand
						&& e.getY() < resulotion.getY() - resulotion.abstand) {
					if (!isRunning)
						;
					new Thread(new rechts()).start();
				} else {
					stopRun = true;
				}
			}

		});

		gp.addMouseMotionListener(new MouseMotionAdapter() {

			public void mouseMoved(MouseEvent e) {
				if (e.getY() > resulotion.abstand
						&& e.getX() < resulotion.abstand
						&& e.getY() < resulotion.getY() - resulotion.abstand) {
					if (!isRunning)
						;
					
					new Thread(new links()).start();
				} else {
					stopRun = true;
				}
			}

		});

		gp.addMouseMotionListener(new MouseMotionAdapter() {

			public void mouseMoved(MouseEvent e) {
				if (e.getX() < resulotion.abstand
						&& e.getY() > resulotion.getY() - resulotion.abstand) {
					if (!isRunning)
						;
					new Thread(new untenLinks()).start();
				} else {
					stopRun = true;
				}
			}

		});

		gp.addMouseMotionListener(new MouseMotionAdapter() {

			public void mouseMoved(MouseEvent e) {
				if (e.getY() > resulotion.getY() - resulotion.abstand
						&& e.getX() < resulotion.getX() - resulotion.abstand
						&& e.getX() > resulotion.abstand) {
					if (!isRunning)
						;
					
					new Thread(new unten()).start();
				} else {
					stopRun = true;
				}
			}

		});

		gp.addMouseMotionListener(new MouseMotionAdapter() {

			public void mouseMoved(MouseEvent e) {
				if (e.getX() > resulotion.getX() - resulotion.abstand
						&& e.getY() > resulotion.getY() - resulotion.abstand) {
					if (!isRunning)
						;
					new Thread(new untenRechts()).start();
				} else {
					stopRun = true;
				}
			}

		});

		MouseListener m = new MouseListener() {
			public void mouseClicked(MouseEvent e) {
				gp.setVisible(false);
				try {

					// Starte einen ControllThreadd der auf die Abarbeitung
					// wartet
					Robot rob = new Robot();
					rob.mousePress(InputEvent.BUTTON1_MASK);
					rob.delay(50);
					rob.mouseRelease(InputEvent.BUTTON1_MASK);
					new Thread(new ControllGlassPane()).start();
				} catch (Exception f) {

				}

			}

			public void mouseEntered(MouseEvent e) {
			}

			public void mouseExited(MouseEvent e) {
			}

			public void mouseReleased(MouseEvent e) {
			}

			public void mousePressed(MouseEvent e) {
			}
		};
		gp.addMouseListener(m);
		
		gp.addKeyListener(new KeyListener() {
			public void keyPressed(KeyEvent ke) {

				if (ke.getKeyCode() == KeyEvent.VK_END) {
					System.out.println("//Debug####End Gedrückt");
				}

			}
			public void keyTyped(KeyEvent ke) {

			}
			public void keyReleased(KeyEvent ke) {

			}
		});
		
		return gp;
	}
```

Das ganze wird mit setGlassPane(getGp()) auf das Frame gelegt.


----------



## Guest (22. Mrz 2006)

hmm. Ist vielleicht alles kjorrekt. Kann der Fehler in einer anderen Komponente liegen, die den KeyListener vielleicht blockiert?


----------



## Ralf Ueberfuhr (22. Mrz 2006)

Muss die GlassPane evtl. dafür den Fokus besitzen?


----------



## Guest (22. Mrz 2006)

hmmm.Hat sie das nicht automatisch


----------



## lokiht (22. Mrz 2006)

Wie könnte ich denn meine Anwendung dazu bringen permanent den Focus zu haben. Und kann ich den KeyListener vielleicht auf ein JWindow legen? Meine Klasse ist extends JWindow. Im Grunde ist es egal welche Komponente gerade innerhalb meines JWindows den Focus hat, denn es muss immer möglich sein die KeyCommands abzufangen. Es handelt sich ja hierbei um ein Strategiespiel in dem man zzu jeder Zeit scrollen können muss.


----------



## lokiht (22. Mrz 2006)

Hab jetzt mal eine andere Variante probiert, die ja eigentlich funktionieren müsste...tut sie aber leider nicht


```
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JPanel;

public class GlassPane extends JComponent implements KeyListener {

	public GlassPane() {

	}

	protected void paintComponent(Graphics g) {
		Graphics2D comp = (Graphics2D) g;
		g.setColor(Color.WHITE);

		Font f = new Font("Arial", Font.BOLD, 91);

		String s = "//Debug// GlassPane active //Debug// ";

		this.setFocusable(true);

		comp.drawString(s, 400, 400);
	}

	public void keyPressed(KeyEvent ke) {
		// Funktionstaste abfragen
		if (ke.getKeyCode() == KeyEvent.VK_END) {
			System.out.println("//Debug####End Gedrückt");
		}

	}

	public void keyTyped(KeyEvent ke) {

	}

	public void keyReleased(KeyEvent ke) {

	}

}
```

Aus dieser Klasse generiere ich das GlassPane, welches dann mit setGlassPane() auf das JWindow gesetzt wird.


----------



## André Uhres (22. Mrz 2006)

http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/GlassPaneDemo.java


----------



## lokiht (23. Mrz 2006)

Erst einmal danke. aber um ehrlich zu sein erkenne ich nicht wirklich in wie weit mir das bei meinem Problem helfen kann.


----------



## André Uhres (23. Mrz 2006)

lokiht hat gesagt.:
			
		

> ...um ehrlich zu sein erkenne ich nicht wirklich in wie weit mir das bei meinem Problem helfen kann.


Das ist es ja, ich nämlich auch nicht. Meine persönliche Schlussfolgerung: 
GlassPane kann zwar MouseEvents erkennen, KeyEvents dagegen nicht.

PS: Mit keybindings hab ich's allerdings noch nicht versucht. Vielleicht haben wir damit mehr Glück..


----------



## thE_29 (23. Mrz 2006)

Probiere den AWTEventListener!!

Der reagiert immer!


Suche im Forum danach!


----------



## Guest (23. Mrz 2006)

Ist das die alte Fassung des KeyListeners, die man eigentlich nicht mehr benutzt?

ja, dass kann gut sein, dass GlassPane mit den KeyEvents Probleme hat. Hatte meine MainClass aber auch schon implements KeyListener gemacht und auch da tat sich nicht...gut, könnte daran liegen, dass ein glassPane darüber liegt. Ich werde es mal mit dem AWTListener probieren.

Vielen Dank auf jeden Fall für die Antworten. Hoffe es hilft


----------



## thE_29 (24. Mrz 2006)

Naja, alter Listener hin oder her, bei dem kann man halt einstellen was er alles receiven soll!


Bzw, der Listener reagiert halt auf alles was passiert ^^


Man müsste halt mit getSource dann explizit abfragen wo er gestanden wäre, wenn da dort nicht schon ein keyListener den event abgefangen hat!


----------



## lokiht (27. Mrz 2006)

So, habe jetzt herausgefunden, dass das Problem an zwei Stellen zu suchen ist. Ich habe noch 2 Buttons in meiner GUI welche einen ActionListener verwenden. Kommentiere ich diesen aus, funktionieren auch die KeyListener. Woran könnte das liegen?


----------



## MPW (28. Mrz 2006)

....vllt daran, dass die Buttons den Focus hatten?


----------



## lokiht (31. Mrz 2006)

Dann müsste es doch dadurch behebbar sein, wenn ich durch einen klick den Focus auf mein JWindow lege oder?! Wie kann denn ein Button den Focus haben, wenn das Programm staret. Focus meint doch die Komponente, die gerade aktuell "gewählt" ist oder ?


----------



## MPW (31. Mrz 2006)

Joa, das mit dem Focus hast du richtig erkannt.

Den Focus kriegt die Komponente glaube ich mit 
	
	
	
	





```
Component.requestFocus();
```


----------

