Avatar billede a38 Nybegynder
09. december 2002 - 15:05 Der er 36 kommentarer og
2 løsninger

Hent tekst som en vector...

OK here goes...

Jeg har et program, jeg kan sætte data ind i en tabel på en database og også hente den igen. MEN!

Jeg vil gerne have data udskrevet på min brugerflade, og jeg vil gerne have at man skal kunne trykke på de enkelte rækker og derved kalde en funktion. (I mit tilfælde få data ud på et nyt vindue, der skal kunne printes, men det er ikke en del af dette spmg (en ting af gangen))!

Jeg regner med at jeg skal hente data som en vector og derefter smide det over i en JList (for at få metoder når jeg klikker på de enkelte rækker)

A : Hvordan henter jeg data ind som en vector, jeg har 6 kolonner i min tabel.

B: Hvordan får jeg vectoren lavet til en JLIST

C : Hvordan får jeg data vist på en JFrame... (jeg går ud fra jeg IKKE skal bruge JTekstField eller Area.)

PS: Er " A => B => C " den naturlige rækkefølge for det jeg gerne vil!?

150 point til den der gerne ikke bare giver principperne men også hjælper lidt med den reelle kode.
Avatar billede arne_v Ekspert
09. december 2002 - 15:13 #1
re A)  Umiddelbart tror jeg du skal hente data
      ind i 6 styk Vector, når du har 6 kolonner,
      da en Vector godt kan opfattes som 1 kolonne.

re B & C )  Jeg er ikke nogen ørn til Swing, så det vil jeg
            overlade til andre.

re PS: A skal ihvertfald løses først.
Avatar billede arne_v Ekspert
09. december 2002 - 15:16 #2
re A) Kodemæssigt vil det være noget i stil med:

    Vector f1 = new Vector();
    Vector f2 = new Vector();
    ...
    ResultSet rs = stmt.executeQuery("SELECT * FROM tabelnavn");
    while(rs.next()) {
        f1.add(new Integer(rs.getInt("F1"));
        f2.add(rs.getString("F2"));
        ...
    }
Avatar billede olly Nybegynder
09. december 2002 - 15:18 #3
A: Hvis du vil bruge en Vector har du jo kun en dimention... Og det dur jo ikke hvis du skal have 6 kolonner ud... Brug et 2 dimentionelt array af objects...

b: At lave en JList er nemt ud fra Array eller Vector

Gøres med new JList(Vector navn eller arraynavn)

Se: http://java.sun.com/j2se/1.4.1/docs/api/javax/swing/JList.html

c: Du kan vel bare tilføje JListen til JFrame
Avatar billede olly Nybegynder
09. december 2002 - 15:24 #4
Den JList skal der være en for hver kolone? Eller en for alle 6 koloner?
Avatar billede a38 Nybegynder
09. december 2002 - 15:33 #5
Der skal bare være en JList for hver række, det vil sige en for alle 6 kolonner, da man kun skal kunne trykke på de samlede oplysninger i en række. De skal ikke bruges hver for sig.
Avatar billede olly Nybegynder
09. december 2002 - 15:35 #6
Det vil sige en JList med alle de rækker der er i databasen?
Avatar billede arne_v Ekspert
09. december 2002 - 15:35 #7
Nu kan jeg ikke gennemskue GUI delen, men set fra en
data betragtning giver en Vector per kolonne i.s.f.
en Vector per række mere logisk.
Avatar billede olly Nybegynder
09. december 2002 - 15:43 #8
Arne>>

Ja... Men hvis du så har 6 vectore så er det lidt svært at sætte dem ind i en JList sådan lige...

Derfor vil det formodelig være bedre med et array hvor man har hele afspejlingen af rs.
Avatar billede olly Nybegynder
09. december 2002 - 15:48 #9
Lidt kode til a og b

-----------------------

  Object array[][] = new Object[10][10];
        ResultSet rs = null;

    try
    {
    Statement stmt = con.createStatement();
    rs = stmt.executeQuery("SELECT * FROM tabelnavn");
    int i = 0, ii = 0;
    while(rs.next())
    {
            array[i][ii] = new Integer(rs.getInt("F1"));
            ii++;
            array[i][ii] = rs.getString("F2");
            ii++;
            array[i][ii] = new Integer(rs.getInt("F3"));
            ii++;
            array[i][ii] = rs.getDate("F4");
            ii++;
        ...

        i++;
        ii = 0;
    }
    } catch (Exception e)
    {
        System.out.println(e);
    }

        JList list = new JList(array);

------------------------

Lig mærke til linien:

Object array[][] = new Object[10][10];

Der skal du jo difinere hvad du vil have af størrelse på arrayet. Det giver måske et problem. Men du kan jo evt finde ud af antalet af rækker, ved at udføre select først, inden du opretter arrayet.  Du ved der er 6 kolonner så...

Det med de 6 kolonner vil se sådan her ud:

Object array[][] = new Object[10][6];
Avatar billede a38 Nybegynder
09. december 2002 - 15:52 #10
GUI = simpel, JFrame der åbner, og har en JFrame der skal vise oplysningerne fra DB.

Lad os bare lave det med en Vector pr. Kolonne hvis det er mest logisk, du må gerne forklare hvorfor (jeg skal jo til eksamen i skidtet :) )

Senere har jeg 3 faste søge felter, et hvor du skal kunne søge på navn, et på telefonnummer og et mail, men jeg skal lige have vist de oplysninger først.

Jeg prøver lige at lave den vector som du viser den arne!
Avatar billede arne_v Ekspert
09. december 2002 - 15:52 #11
Som jeg sagde er GUI delen ikke lige mit område.

Men hvis det skal være kun en Vector så skal man jo have
flere felter puttet ind i samme element.

Enten manuelt som String's eller som via et objekt som
har en passende toString metode.

Men det bliver bare lidt bøvlet, hvis man skal have
de enkelte felter fisket ud igen (tror jeg nok).
Avatar billede a38 Nybegynder
09. december 2002 - 15:55 #12
ok jeg har lavet den her i en anden klasse

public class dbBestilling {

  String telefon;
  String navn;
  String adresse;
  String bestilling;
  String total;
  String mail;

  public dbBestilling(String a, String b, String c, String d, String e, String f) {

    telefon = a;
    navn = b;
    adresse = c;
    bestilling = d;
    total = e;
    mail = f;
    System.out.println("dbBestilling");
    }

// Herunder er metoderne der retunerer Strings til brug i klassen.


    public String toString() {
      return telefon+": "+navn+": "+adresse+": "+bestilling+": "+total+": "+mail+" : ";
    }
}

Nu skal jeg bare hente de strings ind som en vector, og vise den på skærmen (jeg skal ikke bruge de enkelte felter som sagt, da de er del af en samlet bestilling.)
Avatar billede arne_v Ekspert
09. december 2002 - 15:59 #13
Mit råd er ud fra en ren data betragtning. Jeg har aldrig
arbejder med JList.

Men dit eksempel med søgning illustrere meget godt,
hvorfor jeg vilhave 6 Vector'er.

Det er ret nemt at iterere over en Vector og finde
en bestemt værdi. De andre felter i den record er
på samme position i de andre Vector'er.

Hvis det hele er i en Vector skal du ned og snaske
i det enkelte element for at finde matches (med en
lang streng vil det være meget bøvlet, med en speciel
data klasser er det ikke så slemt).

Men hvis ikke 6 Vector'er er til at bruge i Swing, så
nytter det ikke noget, at det gør data adgangen nem.
Avatar billede a38 Nybegynder
09. december 2002 - 16:00 #14
PS I skal nok begge få nogen points, jeg opretter lige et bogus spmg når vi er færdige her, og så kan den jeg ikke giver points for den her få dem jeg giver for det andet ;)
Avatar billede olly Nybegynder
09. december 2002 - 16:02 #15
Jeg vil give det råd at arne har en point i det med at søgeningen blivere nemmere med de 6 vectore end med en... Men med et 2 dimentionelt array er søgningen lige så nem.

Og du kan nemt lave en JList...

Mit eks har en ulempe...

De værdier du har (de 6 ting) Er de alle String?
Avatar billede arne_v Ekspert
09. december 2002 - 16:02 #16
OK, så skal du måske over i:

    Vector a = new Vector();
    ResultSet rs = stmt.executeQuery("SELECT * FROM tabelnavn");
    while(rs.next()) {
        a.add(new dbBestilling(rs.getstring("telefon"),
                              rs.getString("navn"),
                              ...
                              ));
    }
Avatar billede olly Nybegynder
09. december 2002 - 16:03 #17
Du kan bare dele point jo mellem os... Men lad os nu får dit ? løst..
Avatar billede olly Nybegynder
09. december 2002 - 16:09 #18
Tror faktisk der skal bruges en Vector... Jeg havde ikke tænkt på hvad jeg får ud af det 2 dimientionelle array... JList kan ikke konstrueres med et 2 dimientionelt array... Ser det ikke ud til!
Avatar billede a38 Nybegynder
09. december 2002 - 16:10 #19
:) jeg skal også lige have lidt tid til at kode på det, jeg er ikke så hurtig (læs nybegynder) De 6 værdier er:
========================================================
TELEFON  NAVN    ADRESSE  BESTILLING  TOTAL    MAIL
string    string  string    string      DOUBLE  string
========================================================
Avatar billede arne_v Ekspert
09. december 2002 - 16:13 #20
Jeg tror på 1 Vector med elementer af
typen dbBestilling.

NB: I din klasse har du total som String men din sidste
post siger double. Hvad er den ?
Avatar billede olly Nybegynder
09. december 2002 - 16:17 #21
Hvis du kan nøjes med at få dem direkte skrevet ud som alle Strings kan jeg vist godt lave koden for dig... Har selv lige lavet et eks.

arne's Vector med dbbestillinger i er helt okay... Giver dig bare et problem tror jeg når du skal lave den til en JList...
Avatar billede a38 Nybegynder
09. december 2002 - 16:19 #22
Den er double i den klasse hvar jeg sætter oplysniger ind i klassen, men jeg ved ikke om det er nødvendigt at hente værdien igen som double.
Vil det give nogen problemer at hente alle værdierne som Strings?? jeg skal ikke lægge dem sammen med noget eller arbejde med tallene på anden vis.
Så egentlig kan jeg vel bare hente det hele som Strings.
Avatar billede olly Nybegynder
09. december 2002 - 16:20 #23
Skal du ligge noget tilbage i db efter de er hentet? Hvis ikke kan jeg ikke lige se det skulle været et problem med Strings!
Avatar billede arne_v Ekspert
09. december 2002 - 16:21 #24
Jeg troede at når man lavede en JList fra en Vector, at den
så brugte toString metoden i elementerne. Og dbBestilling
har jo netop en tostring.
Avatar billede arne_v Ekspert
09. december 2002 - 16:22 #25
Du kan bruge

Double.toString(rs.getDouble("total"))

til at få den lavet om til String.
Avatar billede olly Nybegynder
09. december 2002 - 16:23 #26
--------------------------------------


        Vector v = new Vector();
        ResultSet rs = null;

    try
    {
    Statement stmt = con.createStatement();
    rs = stmt.executeQuery("SELECT * FROM tabel");
    while(rs.next())
    {

            String temp = rs.getString("Person") + ", " + rs.getString("Sted");
       
            v.addElement(temp);

    }
    } catch (Exception e)
    {
        System.out.println(e);
    }
        JList list = new JList(v);
        this.getContentPane().add(list);
        show();
    }

---------------------

I linien

    String temp = rs.getString("Person") + ", " + rs.getString("Sted");

skal du så bare lave det hele til en lang string, og formatere den som du vil have den vist...

Det er testet kode! Så virker!
Avatar billede olly Nybegynder
09. december 2002 - 16:24 #27
arne>>

Hmmm du har måske et godt argument...

Er helt sikker værd at afprøve.
Avatar billede olly Nybegynder
09. december 2002 - 16:29 #28
a38>>

Jeg vil anbefale dig at prøve følgende, som er sammensætning af min og arnes.

-----------------------------------------

        Vector v = new Vector();
        ResultSet rs = null;

    try
    {
    Statement stmt = con.createStatement();
    rs = stmt.executeQuery("SELECT * FROM tabel");
    while(rs.next())
    {

            v.add(new dbBestilling(rs.getstring("telefon"),
                              rs.getString("navn"),
                              ...
                              ));       

    }
    } catch (Exception e)
    {
        System.out.println(e);
    }
        JList list = new JList(v);
        this.getContentPane().add(list);
        show();
Avatar billede a38 Nybegynder
09. december 2002 - 16:30 #29
OK jeg tror og så i er ved at blive lidt forvirrede!?

Jeg skal ikke smide noget ind i Db fra denne application, det bliver håndteret af en anden.

Min klasse der connecter med DB ser således ud... det er her jeg har tænkt mig at skrive koden ind = :


package dbconnect;

/**
* <p>Title: dbconnect</p>
* <p>Description: database sample</p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: IMV</p>
* @author A38
* @version 1.0 semi definitiv beta... under udvikling!
*/

import java.sql.*;
import java.util.Vector;


public class dbConnect1 {
  public dbConnect1() {

        String username;
        String password;
        String url;
        String createString;
        String dropString;
        String insertString;
        String rydopString;

        username = "stinne";
        password = "xQfi#t";
        url = "jdbc:mysql://ishtar.imv.au.dk/stinne";


        // Opretter tabel på DB Ishtar!

        rydopString = "truncate table BESTILLING";

        /*dropString = "drop table BESTILLING";*/

        /*createString = "create table BESTILLING " +
                            "(TELEFON INTEGER, " +
                            "NAVN VARCHAR(60), " +
                            "ADRESSE VARCHAR(120), " +
                            "BESTILLING VARCHAR(120), " +
                            "TOTAL INTEGER, " +
                            "MAIL VARCHAR(60));";
        */

        try {
            Class.forName("org.gjt.mm.mysql.Driver");
        }
        catch(java.lang.ClassNotFoundException e) {
            System.err.print("ClassNotFoundException: ");
            System.err.println(e.getMessage());
        }
        try {
            Connection con;
            Statement stmt;

          // Så skal der bare gang i banditten!!
          con = DriverManager.getConnection(url, username, password);
          System.out.println ("Mon det ikke duttelutter nu!?");
          stmt = con.createStatement();

          // SQL til at oprette Table på Ishtar. Skal kun køres én gang.
          // stmt.executeUpdate(createString);
          // System.out.println ("BESTILLING table oprettet");

          // SQL til at slette Table på Ishtar.
          // stmt.executeUpdate(dropString);
          // System.out.println ("BESTILLING table slettet");


          // SQL til at rydde op på databasen
          stmt.executeUpdate(rydopString);
          System.out.println ("BESTILLING table nu tømt");

          // SQL til at indsætte TESToplysninger i vores tabel.
          stmt.executeUpdate("insert into BESTILLING (telefon, navn, adresse, bestilling, total, mail)" +
                            "values('99999999', 'A38', 'UNIPARKEN','JAVAKAFFE','999,00','JAVA@JAVA.DK');");
          System.out.println ("Der er nu indsat test oplysninger table Bestilling");

          // SQL for at se om der er oplysniger i vores tabel.
        ResultSet rs = stmt.executeQuery("SELECT * FROM BESTILLING");

  String tlf;
  String nv;
  String ad;
  String bs;
  String to;
  String ma;

  while(rs.next()) {
    tlf = rs.getString("TELEFON");
    nv = rs.getString("NAVN");
    ad = rs.getString("ADRESSE");
    bs = rs.getString("BESTILLING");
    to = rs.getString("TOTAL");
    ma = rs.getString("MAIL");
    System.out.println(tlf+""+nv+""+ad+""+bs+""+to+""+ma);
}
System.out.println ("Se vores test oplysniger ovenfor ==^^");
          // Luk forbindelsen.
            //stmt.close();
            //con.close();
}

      // Lad os også se om der er nogen fejl?
        catch(SQLException ex) {
            System.err.println("==> SQLException: ");
            while (ex != null) {
                System.out.println("Message:  " + ex.getMessage ());
                System.out.println("SQLState:  " + ex.getSQLState ());
                System.out.println("ErrorCode: " + ex.getErrorCode ());
                ex = ex.getNextException();
              System.out.println("");
            }
        }
    }
}


Min klasse hvor jeg samler strings ser således ud

package dbconnect;

/**
* <p>Title: dbBestilling </p>
* <p>Description: Klasse til tabellen "BESTILLING" => hvert Objekt bliver til en række i tabellen </p>
* <p>Copyright: A38 (c) 2002</p>
* <p>Company: IMV </p>
* @author A38
* @version 1.0 beta
*/

public class dbBestilling {

  String telefon;
  String navn;
  String adresse;
  String bestilling;
  String total;
  String mail;

  public dbBestilling(String a, String b, String c, String d, String e, String f) {

    telefon = a;
    navn = b;
    adresse = c;
    bestilling = d;
    total = e;
    mail = f;
    System.out.println("dbBestilling");
    }

// Herunder er metoderne der retunerer Strings til brug i klassen.


    public String toString() {
      return telefon+": "+navn+": "+adresse+": "+bestilling+": "+total+": "+mail+" : ";
    }
}
Avatar billede arne_v Ekspert
09. december 2002 - 16:31 #30
Jeg ved ikke om det virker, men det var sådan jeg
ville kode den constructor, hvis det var mig der havde
lavet den.

Fordelen ved at have dem i den dbBestilling er, at det muligvis
er nemmere at bruge elementerne senere hen (men da jeg
ikke ved, hvad der præcis sker når man vælger i sådan en JList
er det igen gætteri).
Avatar billede olly Nybegynder
09. december 2002 - 16:38 #31
I din DB klasse ville jeg nok lave en metode der retunere en Vector så...

public Vector retunerVector()
{

    Vector v = new Vector();
   
    try
    {
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM tabel");
      while(rs.next())
      {

            v.add(new dbBestilling(rs.getstring("telefon"),
                              rs.getString("navn"),
                              ...
                              ));       

      }
    }
    catch (Exception e)
    {
        System.out.println(e);
    }
    return v;

}
Avatar billede olly Nybegynder
09. december 2002 - 16:41 #32
I den klasse du så skal have JListen (Din GUI klasse) i vil jeg lave en instans af:

dbConnect1 db = new dbConnect1();

og så gør sådan her:

JList myList = new JList(db.retunerVector());

og så tilføje den til JFrame, hvis det er den gennerelle frame, med:

this.getContentPane().add(myList);
Avatar billede a38 Nybegynder
09. december 2002 - 16:43 #33
hvor pokker skal jeg starte med at skrive koden i dbConnect klassen
Avatar billede olly Nybegynder
09. december 2002 - 16:57 #34
Din klasse skal se således ud:

package dbconnect;

/**
* <p>Title: dbconnect</p>
* <p>Description: database sample</p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: IMV</p>
* @author A38
* @version 1.0 semi definitiv beta... under udvikling!
*/

import java.sql.*;
import java.util.Vector;


public class dbConnect1 {
  public dbConnect1() {

        String username;
        String password;
        String url;
        String createString;
        String dropString;
        String insertString;
        String rydopString;

        username = "stinne";
        password = "xQfi#t";
        url = "jdbc:mysql://ishtar.imv.au.dk/stinne";


        // Opretter tabel på DB Ishtar!

        rydopString = "truncate table BESTILLING";

        /*dropString = "drop table BESTILLING";*/

        /*createString = "create table BESTILLING " +
                            "(TELEFON INTEGER, " +
                            "NAVN VARCHAR(60), " +
                            "ADRESSE VARCHAR(120), " +
                            "BESTILLING VARCHAR(120), " +
                            "TOTAL INTEGER, " +
                            "MAIL VARCHAR(60));";
        */

        try {
            Class.forName("org.gjt.mm.mysql.Driver");
        }
        catch(java.lang.ClassNotFoundException e) {
            System.err.print("ClassNotFoundException: ");
            System.err.println(e.getMessage());
        }
        try {
            Connection con;
            Statement stmt;

          // Så skal der bare gang i banditten!!
          con = DriverManager.getConnection(url, username, password);
          System.out.println ("Mon det ikke duttelutter nu!?");
          stmt = con.createStatement();

          // SQL til at oprette Table på Ishtar. Skal kun køres én gang.
          // stmt.executeUpdate(createString);
          // System.out.println ("BESTILLING table oprettet");

          // SQL til at slette Table på Ishtar.
          // stmt.executeUpdate(dropString);
          // System.out.println ("BESTILLING table slettet");


          // SQL til at rydde op på databasen
          stmt.executeUpdate(rydopString);
          System.out.println ("BESTILLING table nu tømt");

          // SQL til at indsætte TESToplysninger i vores tabel.
          stmt.executeUpdate("insert into BESTILLING (telefon, navn, adresse, bestilling, total, mail)" +
                            "values('99999999', 'A38', 'UNIPARKEN','JAVAKAFFE','999,00','JAVA@JAVA.DK');");
          System.out.println ("Der er nu indsat test oplysninger table Bestilling");

          // SQL for at se om der er oplysniger i vores tabel.
        ResultSet rs = stmt.executeQuery("SELECT * FROM BESTILLING");

  String tlf;
  String nv;
  String ad;
  String bs;
  String to;
  String ma;

  while(rs.next()) {
    tlf = rs.getString("TELEFON");
    nv = rs.getString("NAVN");
    ad = rs.getString("ADRESSE");
    bs = rs.getString("BESTILLING");
    to = rs.getString("TOTAL");
    ma = rs.getString("MAIL");
    System.out.println(tlf+""+nv+""+ad+""+bs+""+to+""+ma);
}
System.out.println ("Se vores test oplysniger ovenfor ==^^");
          // Luk forbindelsen.
            //stmt.close();
            //con.close();
}

      // Lad os også se om der er nogen fejl?
        catch(SQLException ex) {
            System.err.println("==> SQLException: ");
            while (ex != null) {
                System.out.println("Message:  " + ex.getMessage ());
                System.out.println("SQLState:  " + ex.getSQLState ());
                System.out.println("ErrorCode: " + ex.getErrorCode ());
                ex = ex.getNextException();
              System.out.println("");
            }
        }
    }

public Vector retunerVector()
{

    Vector v = new Vector();
   
    try
    {
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM tabel");
      while(rs.next())
      {

            v.add(new dbBestilling(rs.getstring("telefon"),
                              rs.getString("navn"),
                              ...
                              ));       

      }
    }
    catch (Exception e)
    {
        System.out.println(e);
    }
    return v;

}//End retunerVector
}
Avatar billede olly Nybegynder
09. december 2002 - 16:58 #35
Tak for point... Fundet ud af det?
Avatar billede a38 Nybegynder
09. december 2002 - 17:00 #36
Jeg tror jeg selv må arbejde lidt med det nu!! Tak for hjælpen!!
Avatar billede olly Nybegynder
09. december 2002 - 17:22 #37
Var skam så lidt..
Avatar billede a38 Nybegynder
09. december 2002 - 17:32 #38
Olly >> Kan man hente oplysningerne ind i andet end en JFrame, f.eks et Jtekst area eller et JPanel??
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