# Canvas mit KeyListener von AWT nach Swing ?



## kopfsalat (28. Mai 2006)

Hi!
Ich habe derzeit ein Canvas-Objekt mit einem Keylistener in einer AWT-GUI, wo alles schön funktioniert.

Übernehme ich einfach das Canvas in eine Swing-Umgebung, so verschwindet die JMenuBar hinter dem Canvas -> Swing/AWT-Problem.

Wie kann ich nun dieses Canvas in Swing nutzen ?

Ich habe es schon einfach per JPanel und JLabel anstelle Canvas versucht, dann klappt auch die Anzeige, aber ich bekomme keine KeyEvents mehr ? Was muss ich tun, um auch den KeyListener ans Laufen zu bekommen ?

Danke,
kopfsalat


----------



## kopfsalat (28. Mai 2006)

Nur noch ein kurzer Hinweis, die Frage bleibt aber bestehen:

Ich konnte das Problem mit den überdeckten Menüs nun dank dieser hervorragenden Beschreibung 
http://www.java-forum.org/de/viewtopic.php?t=5113 umgehen, indem ich einfach JPopupMenu.setDefaultLightWeightPopupEnabled(false); aufrufe, trotzdem würde ich lieber komplett auf lightweight-Components umsteigen. Aber wie? Ein einfaches Ersetzen von Canvas durch JPanel hat ja nicht geholfen, da das JPanel dann die KeyEvents nicht bekommt. Wie kann ich also das JPanel so einstellen, dass dessen KeyListener funktionieren ?


----------



## Beni (28. Mai 2006)

Wenn das JPanel noch fokusierbar "JPanel.setFocusable( true )" ist, gehts auch mit dem KeyListener :wink:


----------



## kopfsalat (28. Mai 2006)

Danke für den Hinweis, der hat indirekt zum Erfolg geführt.

Zunächst klappte es bei mir mit dem Tipp nur, falls sich in dem umgebenden Panel kein fokusfähiges Component befindet, andernfalls erhält das eigene JPanel keinen Focus mehr, wenn man draufklickt. 
Einem Canvas-Objekt hingegen kann man durch Anklicken den Fokus geben.

Die Lösung war hier aber einfach, zusätzlich dem JPanel noch einen MouseListener hinzuzufügen, der dann bei mousePressed() ein requestFocus() ausführt. Dann ist das Verhalten wie beim Canvas-Objekt.
Hier ein Beispiel:


```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.TextArea;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class FocusTest extends JFrame {

	JPanel jp;
	
	static class MyJPanel extends JPanel {
		MyJPanel () {
			super();
			setPreferredSize(new Dimension(800,600));
							
			// MouseListener extra notwendig, um den Focus durch Anklicken zu erhalten
			addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					requestFocus();
				}
			});

			addKeyListener(new KeyAdapter() {
				public void keyTyped(KeyEvent e) {
					JOptionPane.showMessageDialog(null, "KeyEvent " + e.getKeyChar());
				}
			});
			
			setFocusable(true);
		}
		
		public void paintComponent(Graphics g) {
			g.drawOval(100,100,100,100);
		}
	}	
	
	FocusTest() {		
		super();
		setLayout(new BorderLayout());
		
		add(new TextArea("Blabla"), BorderLayout.NORTH);
		
		jp = new MyJPanel();		
		add(jp, BorderLayout.CENTER);
		
		
		setSize(new Dimension(800,600));
		validate();
		setVisible(true);		
	}
		
	public static void main(String[] args) {
		new FocusTest();
	}

}
```


----------

