# Datenbankabfrage mit KeyListener



## AJRames (17. Feb 2009)

Hi Leute! Brauch eure Hilfe, ich komm nicht mehr weiter, obwohl ich schon recht weit gekommen bin...

Folgendes: Ich hab ne Datenbank im Hintergrund laufen und ein TextField.
Dieses TextField überwache ich mit nem KeyListener und frag während der Eingabe nach ob die Daten in der DB vorhanden sind, falls es einen entsprechenden Eintrag gibt, füllt der Listener automatisch des Feld komplett (Autovervollständigung).
Z.B. wenn ich "Ba" eingebe füllt er das TextFeld mit dem Namen "Bachmann".

Nur leider klappt das nur auf die eine weise (Ich lass ne for schleife vorher laufen um die Eintrage aus der DB einzulesen). Die For schleife braucht jedoch ne weile und schluckt ressourcen.

Ich möchte dies jedoch ohne for, sondern direkt auf die DB zugreifen.

Hier nun der Code.

Die GUI:

```
package Richtig;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.*;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class TestKlasse2 extends JFrame{
	
	private static final long serialVersionUID = 1L;
	private JButton bladefirma, bkundeninfo;
	private JLabel label, iplabel,jlKunden;
	private JPanel labelpanel, buttonpanel, editpanel;
	private JTextArea edit, edit2;
	private JTextField edit3, ip1, jtfKunden;
	private DROP d;
	public static String ipadresse;
	
	
	Ohr o	= new Ohr();

	public TestKlasse2() throws SQLException {

		super();
		this.setTitle("AJ's");
		bladefirma = new JButton("Drück mich");
		bkundeninfo = new JButton("Info zum Kunden");
		label = new JLabel("KundenNr:");
		iplabel = new JLabel("ServerIP:");
		jlKunden = new JLabel("Kundenname: ");
		labelpanel = new JPanel();
		d = new DROP(50);
		
		
		edit = new JTextArea();
		edit2 = new JTextArea();
		edit3 = new JTextField(15);
		ip1 	= new JTextField(15);
		jtfKunden	= new JTextField(15);
		
		
		editpanel = new JPanel(new GridLayout(1,2));
		editpanel.add(edit);
		editpanel.add(edit2);
		
		
		labelpanel.setLayout(new GridLayout(3,1));
		labelpanel.add(label);
		labelpanel.add(edit3);
		labelpanel.add(iplabel);
		labelpanel.add(ip1);
		labelpanel.add(jlKunden);
		labelpanel.add(d.test2());

		buttonpanel = new JPanel();
		buttonpanel.setLayout(new GridLayout(1,2));
		buttonpanel.add(bladefirma);
		buttonpanel.add(bkundeninfo);
		
		this.getContentPane().setLayout(new BorderLayout());
		this.getContentPane().add(labelpanel, BorderLayout.NORTH);
		this.getContentPane().add(editpanel, BorderLayout.CENTER);
		this.getContentPane().add(buttonpanel,BorderLayout.SOUTH);
		

		bladefirma.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				ipadresse	= ip1.getText();
				o.ladeFirmenBez(edit);				
			}
		});
		

		bkundeninfo.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				ipadresse	= ip1.getText();
				edit2.append(o.infoZumKunden(edit3.getText()));
				edit2.append("\n");
			}
		});
		
	/**this.addKeyListener(new KeyAdapter(){

			@Override
			public void keyTyped(KeyEvent e) {
				System.out.println("Jep");
			}	
		});

		*/
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
```
Die Klasse für das TextFeld zur Verfollständigung:

```
package Richtig;

import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

public class DROP extends JTextField implements KeyListener {
   
   private Vector<String> data = null;
   private boolean doNothingElse = false;
   
   private static final long serialVersionUID = 1L;
   
   public DROP(int lang) {
	  super(lang);
      addKeyListener(this);
      data = new Vector<String>();
   }
   
   public void setData(Vector<String> data) {
     
      this.data = data;
   }
   
   public void addData(String str) {
     
      data.add(str);
   }
   
   public void deleteData(String str) {
     
      data.remove(str);
   }
   
   private void quickSearch(String start) {
     
      for (String str : data) {
         if (str.startsWith(start)) {
            setText(str);
            select(start.length(), str.length());
            doNothingElse = true;
            break;
         }
      }
   }
   
   private void handleKey(char key) {
     
      String selection = getSelectedText();
      if (selection != null && selection.charAt(0) == key) {
         doNothingElse = true;
         setSelectionStart(getSelectionStart() + 1);
      }
      else if (selection != null) {
         String nonSelected = getText().substring(0, getText().length() - selection.length()) + key;
         quickSearch(nonSelected);
      }
      else {
         quickSearch(getText() + key);
      }
   }
   
   public void keyTyped(KeyEvent key) {
   
      if (doNothingElse == true) {
         key.consume();
         doNothingElse = false;
      }
   }
   
   public void keyPressed(KeyEvent key) {
   
      if (Character.isLetter(key.getKeyChar()) || key.getKeyChar() == ' ') {
         handleKey(key.getKeyChar());
      }
   }
   
   public void keyReleased(KeyEvent key) {
   }
   
   public DROP test() {
	   
		//DB Verbindung Herstellen
		try {
			Class.forName("org.hsqldb.jdbcDriver");
		} catch (Exception e) {
			System.out.println("ERROR: failed to load HSQLDB JDBC driver.");
			e.printStackTrace();
		}

		Connection con = null;

		try {
			con = DriverManager.getConnection(
					"jdbc:hsqldb:hsql://192.168.0.3/TrinityTestAJ",
					"sa", "");
		} catch (SQLException e) {
			System.out.println("Keine Verbindung!");
		}

		Statement state = null;
		try {
			state = con.createStatement();
		} catch (SQLException e) {
			System.out.println("Kann kein Statement erzeugen");
		}
		//DB Verbindung ist hergestellt worden
		System.out.println("Verbindung Steht");

;
		
		for(int i=10105;i<10800;i++){
		String sql = "SELECT NAME FROM ADRESSEN WHERE FIRMANR="+i+";";
 
  	  try {
			ResultSet res = state.executeQuery(sql);
			while (res.next()) {
			String name = res.getString("NAME");
	    	this.addData(name);  
			
			}
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			//return name;
		}
	}
	return this;
		
	}
   
   public DROP test2() throws SQLException {
	   
		//DB Verbindung Herstellen
		try {
			Class.forName("org.hsqldb.jdbcDriver");
		} catch (Exception e) {
			System.out.println("ERROR: failed to load HSQLDB JDBC driver.");
			e.printStackTrace();
		}

		Connection con = null;

		try {
			con = DriverManager.getConnection(
					"jdbc:hsqldb:hsql://192.168.0.3/TrinityTestAJ",
					"sa", "");
		} catch (SQLException e) {
			System.out.println("Keine Verbindung!");
		}

		Statement state = null;
		try {
			state = con.createStatement();
		} catch (SQLException e) {
			System.out.println("Kann kein Statement erzeugen");
		}
		//DB Verbindung ist hergestellt worden
		System.out.println("Verbindung Steht");

		DROP drop = new DROP(15);
		
		String sql1 = "SELECT FIRMANR FROM ADRESSEN WHERE NAME LIKE '"+"Ba"+"%';";
		System.out.println(sql1);
		ResultSet res = state.executeQuery(sql1);
		String sql2 = null;
		while (res.next()) {
			int kundennummer = res.getInt("FIRMANR");
			System.out.println(kundennummer);
			sql2 = "SELECT NAME FROM ADRESSEN WHERE FIRMANR="+kundennummer+";";
	    	//this.addData(namen);  
	    	}
 	  try {
 		  	System.out.println("test");
			ResultSet resu = state.executeQuery(sql2);
			while (resu.next()) {
			String namen = resu.getString("NAME");
	    	this.addData(namen);  
			}
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			//return name;
		}
	
	return this;
	}
   /**
   public static void main(String[] args) {
  
      JFrame frame = new JFrame();
      DROP stf = new DROP();
      stf.test();
      
}
```

die methode test() funktioniert, mit der for.
test2() geht nicht.
Mein Problem bei test2() ist diese Zeile:


```
String sql1 = "SELECT FIRMANR FROM ADRESSEN WHERE NAME LIKE '"+"Ba"+"%';";
```

statt "Ba" möcht ich hier halt die Tastatureingabe.
Und ich kriegs nicht hin 

Wäre froh wenn Ihr mir helfen könntet....
Danke! 

Gruß AJ


----------



## manuche (17. Feb 2009)

Wie wäre es mit einer Stored Procedure?
Die bekommt jeweils die bereits eingetragenen Buchstaben mit und gibt dir das erste Ergebnis zurück, welches du dann in dein Textfeld schreibst...


----------



## AJRames (17. Feb 2009)

Das macht ja Theorethisch diese DROP Klasse  (falls ich dich richtig verstanden habe).
Wobei mir auch Stored Procedure nichts sagt...

Bei test() funktioniert es ja so das er die eingaben entgegen nimmt und diese dann vergleicht und entsprechendes ausgibt! Aber mit test2() halt noch nicht.
Aber auch gut möglich das ich dich falsch verstanden habe, sorry....


----------



## manuche (17. Feb 2009)

Eine Stored Procedure ist eine Funktion (oder halt Prozedur) die in der Datenbank gespeichert... Bietet enorme Performance-Vorteile!
Je nach dem wie du es aufbaust bekommst du nur einen Wert zurück und brauchst dich in deinem Programm nicht mehr drum kümmern!


----------



## AJRames (17. Feb 2009)

Ah, ok! Hm klingt super!
Dann überleg ich mir mal wie das hier einbinden kann!
Benutz HSQLDB, da gibts die laut google auch ^^

Mal gespannt...


----------



## manuche (17. Feb 2009)

Kenn ne solche Datenbank nicht... Bin leider auch nicht so fit in StoredProcedures! Also ich weiss das es sie gibt, müsste mich aber auch erstmal reinlesen und mit die Syntax zusammen suchen...


----------

