Avatar billede ladbye Nybegynder
19. april 2007 - 14:33 Der er 1 kommentar og
1 løsning

Databasekald samt getText() fra jTextField

Hej Eksperter,

Jeg står med et problem jeg har brugt de sidste par dage på at løse - og jeg har indtil nu ikke fundet nogen løsning på mit problem.

Programmet jeg er igang med er et skoleprojekt, hvor der skal laves et stykke software til håndtering af Student-profiler, med deres specielle værdier. Dette program kalder op til MySQL database hvori alle værdierne ligger.

Mit problem er delt i 2.

1. Problem er, at jeg har en Popup-dialog hvori der er en række felter som man bruger til at tilføje en studerende til databasen. Den virker som den skal. Dog skal det laves sådan, at når der er indtastet 4 cifre i Postnr-feltet, skal den søge i databasen efter det tilhørende bynavn og indsætte det i det jTextField der er beregnet til Bynavn, således at brugeren slipper for det. I min database ligger der en total liste over samtlige postnumre og tilhørende bynavne. Jeg har en keyTyped() til at lytte på det jTextField der indeholder postnumret. Jeg har vedlagt koden nedenunder. Problemet er så, at når jeg laver en getText() får jeg ikke sidste karakter med. F.eks. når man indtaster "4200", er det kun "420" man får fra getText()! Det ser ud til, at den reagerer med keyTyped når den registrere det 4. ansalg i det jTextField, men husker kun teksten fra efter det 3.?

Derudover er det et problem i mit databasekald, hvor jeg laver en select fra databasen. Hvad jeg ikke forstår er, at jeg har brugt den samme select-metode til at udfylde et JTable med alle informationer fra min database og det virker fint. Den nødvendige kode kommer også herunder. Den melder ikke fejl, den skriver bare ikke noget.

/////////////////////////////////////////////////////////////////
class PopAddStudent() - Udtræk af GUI-klassen for Popup-dialogen
/////////////////////////////////////////////////////////////////

private ManageDB sql = ManageDB.getInstance();

private JTextField getTextFieldZIP() {
    if (textFieldZIP == null) {
        textFieldZIP = new JTextField();
        textFieldZIP.addKeyListener(this);
        textFieldZIP.setBounds(new Rectangle(86, 140, 50, 20));
    }
    return textFieldZIP;
}

private JTextField getTextFieldTown() {
    if (textFieldTown == null) {
        textFieldTown = new JTextField();
        textFieldTown.setBounds(new Rectangle(185, 140, 101, 20));
    }
    return textFieldTown;
}

public void keyTyped(KeyEvent e){
    String zip = textFieldZIP.getText();
    if (zip.length() == 3){
        try {
            getTown();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
    }
}

public void getTown() throws SQLException{
    try{
        String zipcode = textFieldZIP.getText();
        String town = sql.getData("Town", "tennisschool.ZIP_Code_List", "ZIP_Code", zipcode).getString(0);
        textFieldTown.setText(town);
    }catch(SQLException e){};
}


/////////////////////////////////////////////////////////////////
class ManageDB() - Klassen der håndtere databasekald
/////////////////////////////////////////////////////////////////

final ConnectDB db;
static ManageDB manage = null;
   
public ManageDB()
{
    db = ConnectDB.getInstance("jdbc:mysql://localhost/tennisschool?", "root", "123456");
    manage = this;
}
   
public ResultSet getTable(String table){
    return db.select( "SELECT * FROM " + table );
}
   
public ResultSet getData(String wantedField, String table, String compareField, String compareValue){
    return db.select( "SELECT " + wantedField + " FROM " + table + " WHERE " + compareField + " = " + compareValue );
}
   
public void insertData( String SQL ){
    db.insert( SQL );
}
   
public int tableCounter(String table){
    int total = 0;
       
    try
    {
        ResultSet row = db.select( "SELECT COUNT(*) FROM " + table);
        row.next();
        total = row.getInt(1);
           
    }
    catch ( SQLException cs ){
        System.out.println(cs);
    }
       
    return total;
}
   
public static ManageDB getInstance(){
    if( manage == null )
        return new ManageDB();
    else return manage;
}
}


/////////////////////////////////////////////////////////////////
class ConnectDB() - Klassen der kalder op til databasen
/////////////////////////////////////////////////////////////////

private static ConnectDB db = null;
private Connection con;
   
public ConnectDB( String url, String username, String password )
{
    try
    {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection( url, username, password);   
    }
    catch ( ClassNotFoundException c )
    {
        System.out.println("The driver was not found \n +" + c);
        c.printStackTrace();
    }
    catch( SQLException cs )
        {
            System.out.println( "Could not connect to database \n"+cs );
            cs.printStackTrace();
        }
        db = this;
}
   
public static ConnectDB getInstance(String url, String username, String password)
{
        if( db == null )
            return new ConnectDB(url,username,password);
        else
            return db;
}
   
public ResultSet select( String SQL )//SELECT
{
    ResultSet rs = null;

    try
        {
                Statement stmt = con.createStatement();
                rs = stmt.executeQuery( SQL );
        }
        catch( SQLException sc )
        {
                System.out.println( "Error in QUERY \n"+sc+"\n"+SQL );
                sc.printStackTrace();
        }

        return rs;
}

public void insert( String SQL )//INSERT,UPDATE,DELETE
{
        try{
            Statement stmt = con.createStatement();
            stmt.executeUpdate( SQL );
        }catch( SQLException sc ){
              System.out.println( "Error in QUERY \n"+sc+"\n"+SQL );
              sc.printStackTrace();
        }
    }
}

/////////////////////////////////////////////////////////////////

Så lige for at opsummere.
- Mine generelle databasekaldsmetoder virker umiddelbart korrekt, da jeg i en andel del af programmet bruger et ConnectDB.select() der returnere korrekt.
- Når den bruger keyTyped reagerer den på det 4. anslag i feltet textFieldZIP, men den gemmer kun de tre første anslag via getText().
- Den returnere intet når jeg får indtastet det fjerde anslag. Hvad enten om jeg sender værdien fra getText() videre i systemet eller jeg manualt skriver f.eks. "4200" istedet for zipcode, i getTown().

Håber der er nogen der kan hjælpe mig med mine problemer - de er virkelig frustrerende!
Avatar billede ladbye Nybegynder
23. april 2007 - 21:27 #1
Prøver lige igen, for at se om der er nogen der har en løsning på mit problem!
Avatar billede ladbye Nybegynder
24. april 2007 - 12:53 #2
Jeg fandt selv ud af det. Man skulle bruge keyReleased() istedet for keyTyped() ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester