# KeyListener implementieren



## bliko (5. Mrz 2008)

Ich möchte, dass durch das Drücken der Enter-Taste ein Ereignis ausgelöst wird, tut es aber nicht. 

Hier der Code

```
public class BinBaumPanel extends JPanel implements ActionListener, KeyListener{
	private BinBaum_grafisch b;
	private int[] feld = {4,3,7,8,6,3,2,1,0,9,10,5,12};
	private JButton enter, loeschen;
	private JLabel l1;
	private JTextField t1;
	private Dimension d = new Dimension(50,27);
	private int s, x_akt, y_akt, e_akt, x_Pos, y_Pos;
	private int x_Prev, y_Prev, versatz_s, versatz_l;
	private Font f = new Font("Verdana", Font.BOLD, 12);
	
	public BinBaumPanel(){
		b = new BinBaum_grafisch();
		x_akt = 200;
		y_akt = 80;
		e_akt = 0;
		versatz_l = 5;
		l1 = new JLabel("Geben Sie eine ganze Zahl >=0 ein:", SwingConstants.RIGHT);
		t1 = new JTextField("");
		t1.setPreferredSize(d);
		enter = new JButton("EINGEBEN");
		enter.addActionListener(this);
		//enter.addKeyListener(new MyKL());
		add(l1);
		add(t1);
		add(enter);
		addKeyListener(this);
	}
	
	public void ausgeben(int[] f){
		Graphics g = getGraphics();
		f = feld;
		//einfuegenFeld(f);
		
		for (int i=0; i<feld.length; i++){
			if (i==feld.length)break;
			int vorg = b.findeVorgaenger(feld[i], feld[i]);
			x_Pos = b.getX(feld[i], x_akt, e_akt);
			x_Prev = b.getX(vorg, x_akt, e_akt);
			y_Pos = b.getY(feld[i], y_akt, e_akt);
			y_Prev = b.getY(vorg, y_akt,e_akt);
			
			if (x_Pos < x_Prev){
				versatz_s = 7;
			}
			else {
				versatz_s = 0;
			}
			String s = String.valueOf(feld[i]);
			
			g.drawString(s, x_Pos-versatz_s, y_Pos);
			g.drawLine(x_Prev, y_Prev, x_Pos, y_Pos);
		}
	}
	
	
	
	public void paintComponent (Graphics grafik)
	{
		//grafik = leinwand.getGraphics();
		super.paintComponents(grafik);
		grafik.setColor(Color.lightGray);
		
		// Horizontale Rasterlinien
		for (int y=0; y<this.getHeight(); y+= 40){
			grafik.drawLine(0,y,400,y);
		}
		
		// Vertikale Rasterlinien
		for (int x=0; x<getHeight(); x+= 20){
			grafik.drawLine(x,40,x,500);
		}
	}
	
	/**
	 * Fügt die Schlüssel des Feldes vom Typ int[] in
	 * den Suchbaum ein;
	 * @param feld das Feld von Schlüssel;
	 */
	public void einfuegenFeld(int[] feld){
		for (int i=0; i<feld.length; i++){
			b.einfuegen(feld[i]);
		}
	}
	
	public void einfuegenSchluessel(int schluessel){
		int s = Integer.parseInt(t1.getText());
		b.einfuegen(s);
	}
	
	public void zeichneSchluessel(int schluessel){
		Graphics g = getGraphics();
		int s = schluessel;
		b.einfuegen(s);
		int vorg = b.findeVorgaenger(s, s);
		x_Pos = b.getX(s, x_akt, e_akt);
		x_Prev = b.getX(vorg, x_akt, e_akt);
		y_Pos = b.getY(s, y_akt, e_akt);
		y_Prev = b.getY(vorg, y_akt,e_akt);
		
		FontMetrics fm = getFontMetrics(f);
		String s_zahl = String.valueOf(s);
		int s_breite = fm.stringWidth(s_zahl);
		versatz_s = (int) Math.round(s_breite/2);
		
		//Umwandeln des Schlüssels vom Typ int in
		//einen String und Ausgabe der Zahl und der Linien
		String zahl = String.valueOf(s);
		int h = b.getHoehe();
		if (h==1){
			g.drawString(zahl, x_Pos-versatz_s, y_Pos+versatz_l);
		}
		else{
			g.drawString(zahl, x_Pos-versatz_s, y_Pos+versatz_l);
			if (x_Prev > x_Pos){
				g.drawLine(x_Prev-versatz_l, y_Prev+versatz_l, x_Pos+versatz_l, y_Pos-versatz_l);
			}
			else{
				g.drawLine(x_Prev+versatz_l, y_Prev+versatz_l, x_Pos-versatz_l, y_Pos-versatz_l);
			}
		}
		
		
	}
	
	
	/**
	 * Gibt den Ebenenabstand auf der y-Achse zurück
	 */
	
	public int getEbenenAbstand(){
		return b.getEbenenAbstand();
	}
	
	public void actionPerformed(ActionEvent e){
		Object source = e.getSource();
		if (source == enter){
			if(t1.getText().equals("")){return;}
			else{
				System.out.println("Enter gedrückt!");
				zeichneSchluessel(Integer.parseInt(t1.getText()));
			}
			//ausgeben(feld);
		}
	}
	
	
	//class MyKL implements KeyListener{
		public void keyReleased(KeyEvent e)
		 {
			int code = e.getKeyCode();
			if (code == e.VK_ENTER){
				if (t1.getText().equals("")){return;}
				else{
					System.out.println("Enter gedrückt!");
					zeichneSchluessel(Integer.parseInt(t1.getText()));
				}
				
			}
		 }
		public void keyPressed(KeyEvent e){if (e.getKeyChar() == e.VK_ENTER){
			if (t1.getText().equals("")){return;}
			else{
				System.out.println("Enter gedrückt!");
				zeichneSchluessel(Integer.parseInt(t1.getText()));
			}
			
		}}
		public void keyTyped(KeyEvent e){if (e.getKeyChar() == e.VK_ENTER){
			if (t1.getText().equals("")){return;}
			else{
				System.out.println("Enter gedrückt!");
				zeichneSchluessel(Integer.parseInt(t1.getText()));
			}
			
		}}
	//}
}
```


----------



## The_S (5. Mrz 2008)

Das JPanel muss auch den Fokus haben. Wenn z. b. dein JTextField den Fokus hat, braucht dein JTextField den KeyListener. Wenn du nur auf Enter im JTextField reagieren willst, kannst du dem JTextField auch einen ActionListener adden.


----------



## 0x7F800000 (5. Mrz 2008)

1) hier nimmst du "getKeyCode()" dort nimmst du "getKeyChar()" und vergleichst es plötzlich mit konstanten integer werten... was soll das werden?

2) warum hast du in drei funktionen denselben code reingeschrieben? reichte die "keyPressed(...)" alleine etwa nicht aus?

3) bist du dir sicher dass mit dem Listener irgendetwas faul ist? oder sind vielleicht die bedingungen in diesen ganzen abfragen nie erfüllt...

4)bist du dir sicher das dieses panel den focus hat wenn du es testest?


----------



## bliko (5. Mrz 2008)

Danke, das war eine große Hilfe, ich habe den code in alle drei geschrieben, weil ich mir nicht sicher war, welche davon reagieren würde, du hast natürlich recht, dass auch keyPressed vollkommen ausreicht. Der Fehler lag aber v.a. daran, dass das JTextField den Fokus nicht hatte.

lg bliko


----------

