Datenbankabfrage mit KeyListener

Status
Nicht offen für weitere Antworten.

AJRames

Mitglied
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:
Code:
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:
Code:
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:

Code:
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

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

Mitglied
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

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

Mitglied
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

Bekanntes Mitglied
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...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Datenbankabfrage mit loop Datenbankprogrammierung 17
N MySQL Datenbankabfrage oder Arraylist? Datenbankprogrammierung 2
J Datenbankabfrage / Teilmengen Datenbankprogrammierung 2
S MySQL JTable zeigt nach Datenbankabfrage eine Spalte zu viel an Datenbankprogrammierung 0
S MySQL Datenbankabfrage mit Eingabe aus Textfeld vergleichen Datenbankprogrammierung 4
C Modellierung Datenbankabfrage Datenbankprogrammierung 1
W SQL-Statement Datenbankabfrage über Yahoo Datenbankprogrammierung 0
B Fehlerhafte Datenbankabfrage Datenbankprogrammierung 3
H Oracle Datenbankabfrage ausgeben Datenbankprogrammierung 13
E MySQL Anzeige Datenbankabfrage in Textfeld o.ä. Datenbankprogrammierung 34
L Datenbankabfrage mit einer Range Datenbankprogrammierung 3
Y JDBC - Datenbankabfrage Webserver Datenbankprogrammierung 4
E H2 - Datenbankabfrage gibt NULL aus? Datenbankprogrammierung 4
H Einfache Datenbankabfrage Datenbankprogrammierung 14
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
F Problem mit Datenbankabfrage Datenbankprogrammierung 7
M Problem bei einfacher Datenbankabfrage Datenbankprogrammierung 7
W Problem mit Datenbankabfrage Datenbankprogrammierung 3
S Datenbankabfrage mit Applet Datenbankprogrammierung 13
C Rückgabetyp einer Datenbankabfrage Datenbankprogrammierung 12
V Datenbankabfrage in einem Textfeld ausgeben Datenbankprogrammierung 3
L einfache Datenbankabfrage ohne erstes Element Datenbankprogrammierung 2
E Nochmal eine Datenbankabfrage Frage :-o (JOIN oder so) Datenbankprogrammierung 4
R NUllPointerException bei Datenbankabfrage Datenbankprogrammierung 4
A SQL Datenbankabfrage in Array speichern Datenbankprogrammierung 3
P Datenbankabfrage MYSQL aus Applet heraus Datenbankprogrammierung 6
D Datenbankabfrage will nicht funktionieren Datenbankprogrammierung 5
C vergleichende Datenbankabfrage Datenbankprogrammierung 5
G datenbankabfrage Datenbankprogrammierung 4
A datenbankabfrage in sql mit java Datenbankprogrammierung 32
T Nochmal Datenbankabfrage Datenbankprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben