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:
Die Klasse für das TextFeld zur Verfollständigung:
die methode test() funktioniert, mit der for.
test2() geht nicht.
Mein Problem bei test2() ist diese Zeile:
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
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);
}
}
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