Avatar billede lmdthel Nybegynder
24. juli 2005 - 14:19 Der er 13 kommentarer og
1 løsning

Fra Database til Tabel

Så er der lidt newbie problemer igen igen :-(

Jeg henter data ud af min database, og resultatet får jeg i:

      while (rset.next()) {
        System.out.println(rset.getString(1) + rset.getString(2));
      }

altså 2 kolonner.. og et ukendt antal rækker..

Det skal jeg jo så meget gerne have ind i min tabel..

Og formatet til at få det derind er noget i stil med:

private Object[][] data = {
                                {"dataKolonne1","dataKolonne2"}};

Men hvordan i hulen gør jeg det smartest ?
Avatar billede kalp Novice
24. juli 2005 - 14:24 #1
Jeg bruger normalt en tabel som henter sine data fra en arraylist.. som du sikkert ved har sådan en ikke nogen fast størrelse så det er nemt blot at indsætte elementer i den inde i din while (rset.next()) løkke:)
Avatar billede kalp Novice
24. juli 2005 - 14:29 #2
Jeg kunne umiddelbart kun lige finde dette eksempel på eksperten.. udarbejdet af mikkelbm

http://www.eksperten.dk/spm/616530

det er sådan ca. jeg selv laver det, men sidder ikke lige ved min egen pc så kan ikke give dig et eksempel af mit eget desværre.. kan måske senere i aften, men ellers kan jeg sagtens hjælpe dig med at forstå mikkelbm's kode..
Avatar billede lmdthel Nybegynder
24. juli 2005 - 14:32 #3
Hej Kalp

Det ville være kanon, det er den sidste brik jeg mangler for at have mit første java prog, som lige frem kan noget fornuftigt.

jeg kigger på det, og ellers så skriver jeg lige i aften, hvis jeg stadig ikke helt forstår det..
Avatar billede lmdthel Nybegynder
24. juli 2005 - 19:34 #4
Hej kalp

Nå så har jeg skrevet det om, så det er lavet ligesom mikkelbm's eksempel, og det er jo nok lidt smartere..

Så bare lige det sidste problem..

I min klasse hvor jeg henter mine data i databasen, der får jeg kolonnerne i hver række præsenteret i rset.getString(1),rset.getString(2),rset.getString(3),rset.getString(4)

Det er jo fint nok, men hvordan får jeg pakket dem pænt ind i en Arrarylist ? ,her skal der jo ikke en kolonne i hvert element, alle 4 kolonner hører jo sammen i en række..

Så hvad jeg egentlig gerne vil er at præsentere dem i min tabel som de ligger i databasen

Hvis nu bare det havde været 1 kolonne, så havde det været nemt, men nu er der jo lige 4.

Jeg tænkte på at ligge alle 4 kolonner ind i 1 streng, og så adskille dem med '-' og så efter jeg har retuneret dem, så adskille dem på - igen, men det er da for bøvlet
Avatar billede mikkelbm Nybegynder
24. juli 2005 - 21:53 #5
Hvis det er lavet efter mit eksempel, forventes der jo et objekt af din egen type.

Det vil sige at der hvor du henter data ud fra databasen bygger du et objekt ud fra disse oplysninger. Dette objekt kan du så putte i en ArrayList og returnere. Herefter kan du så tilføje hvert enkelt element til den TableModel som du har lavet.

Nu ved jeg ikke hvilke data det er du arbejder med, men i mit eksempel har jeg MyObject som indeholder et id og et navn. Dette kan du jo så udvide efter behov. Hvis det f.eks. er et person register du har i databasen, skal du lave et objekt der modsvarer dette. Det vil sige at dit objekt eksempelvis kan have: id, navn, efternavn, adresse, tlfnr osv... Dette objekt er så det du skal bygge din TableModel op efter.

Håber du forstår - ellers så spørg endelig.
Avatar billede lmdthel Nybegynder
24. juli 2005 - 22:40 #6
Hej Mikkel

Jeg er ked af at jeg skal have det skåret ud i pap, men jeg er gammel perl hacker der liger er gået på java bølgen, så OOP er rimelig nyt, men jeg kæmper :-)

nu har jeg i min database klasse bygget et object og lagt det ned i en ArrayList som jeg retunerer til min tabel model..
////////////
BYGGER OBJEKT
List a = new ArrayList();

    while (rset.next()) {
           
      a.add(new MyDbObject(rset.getString(1),rset.getString(2),rset.getString(3),rset.getString(4)));
           
      }

//////////

Så står jeg så ovre i "dit" tabel model kode.. og skal nu have mit data "ud" af min arraylist.

Det ville jeg så gøre i stil med:

          Database get = new Database("192.168.2.12:3306/");
         

          List a = new ArrayList(get.lineTraining());
         
          for (int i = 0; i < a.size(); i++) {
             
              model.addTableElement.... ????
          }


hvordan skal jeg få mit objekt ned i din model ??
Avatar billede mikkelbm Nybegynder
24. juli 2005 - 22:44 #7
Det med objektet er rigtig nok. Din TableModel skal så afspejle det objekt, på den måde du gerne vil ha' det vist i din JTable. Din forløkke ser faktisk også rigtig nok ud:

model.addTableElement ((MyDbObject)get.get(i));
Avatar billede mikkelbm Nybegynder
24. juli 2005 - 22:44 #8
Men for at ovenstående vil virke, kræver det, at du har lavet din TableModel rigtig. Hvis det ikke virker for dig, så prøv at smid koden til TableModel herind, så kan vi kigge på det.
Avatar billede lmdthel Nybegynder
24. juli 2005 - 23:25 #9
Hmmm syntes ikke helt det virker, jeg er ret sikker på mit objekt jeg returnerer er korrekt.. her er min tabelModel

    private class MyTableModel extends AbstractTableModel
    {
        private String[] columns = new String[] {"Host", "PortNr","MaxAttUp","MaxAttDown"};
        private ArrayList data;

        public MyTableModel()
        {
            data = new ArrayList();
        }
       
        public int getColumnCount()
        {
            return columns.length;
        }
       
        public int getRowCount()
        {
            return data.size();
        }
       
        public String getColumnName(int column)
        {
            return columns[column];
        }
       
        public MyObject getValueAt(int row)
        {
            return (MyObject)data.get(row);
        }
       
        public Object getValueAt(int row, int column)
        {
            MyObject element = (MyObject) data.get(row);
       
            switch (column)
            {
                case 0: return element.gethost();
                case 1: return element.getport();
                case 2: return element.getmaxattup();
                case 3: return element.getmaxattdown();
            }
            return null;
        }
Avatar billede mikkelbm Nybegynder
25. juli 2005 - 00:19 #10
Du gør brug af mit objekt og ikke dit eget ;)

Længere oppe har du et objekt: MyDbObject, men i din TableModel har du MyObject. Det er i hvert fald en fejl.

Og så mangler du også en add-metode, hvor du kan tilføje dine elementer.

Jeg tror den skal se sådan her ud:

    private class MyTableModel extends AbstractTableModel
    {
        private String[] columns = new String[] {"Host", "PortNr","MaxAttUp","MaxAttDown"};
        private ArrayList data;

        public MyTableModel()
        {
            data = new ArrayList();
        }
       
        public int getColumnCount()
        {
            return columns.length;
        }
       
        public int getRowCount()
        {
            return data.size();
        }
       
        public String getColumnName(int column)
        {
            return columns[column];
        }
       
        public MyDbObject getValueAt(int row)
        {
            return (MyDbObject)data.get(row);
        }
       
        public Object getValueAt(int row, int column)
        {
            MyDbObject element = (MyDbObject) data.get(row);
       
            switch (column)
            {
                case 0: return element.gethost();
                case 1: return element.getport();
                case 2: return element.getmaxattup();
                case 3: return element.getmaxattdown();
            }
            return null;
        }
       
        public Class getColumnClass(int column)
        {
            return getValueAt(0, column).getClass();
        }
       
        public boolean isCellEditable(int row, int column)
        {
            return true; // alle celler er editerbare
        }
       
        public void setValueAt(Object value, int row, int column)
        {
            switch (column)
            {
                // case 0: ((MyDbObject) data.get(row)).setName(value.toString());
                // Ovenstående skal du kun bruge, hvis du vil gøre det muligt at ændre objekterne værdier ved at indtaste i tabellen.
                // Hvis du vil det, skal du ha' en case for hver af dine setmetoder i dit objekt.
            }
            fireTableCellUpdated(row, column);
        }
       
        public void addTableElement(MyDbObject element)
        {
            data.add(element);
            fireTableRowsInserted(data.size(), data.size());
        }
       
        public void removeTableElement(int index)
        {
            if (! (index == -1))
            {
                data.remove(index);
                fireTableRowsDeleted(index, index);
            }
        }
       
        public void removeAll()
        {
            int slut = data.size();
            data.clear();
            fireTableRowsDeleted(0, slut);
        }
    }
Avatar billede lmdthel Nybegynder
25. juli 2005 - 00:40 #11
Hej Mikkel

Wooooow så lykkedes det f......

Min første rigtige java app, altså foruden det obligatoriske hello world. Og så mit første møde med OOP.

Det var ikke nemt. Men det var ikke lykkede uden din hjælp, tak fordi du gad bruge lidt af din aften på en Newbie :-)

/Thomas
Avatar billede kalp Novice
25. juli 2005 - 11:08 #12
Hej Mikkelbm.. du er velkommen til, at ligge et svar eftersom jeg ikke nåede at hjælpe videre med koden:) var desværre ikke online længere i går.
Avatar billede mikkelbm Nybegynder
25. juli 2005 - 11:50 #13
Det kommer flyvende her, så :)
Avatar billede lmdthel Nybegynder
25. juli 2005 - 11:52 #14
Jammen så skal jeg da lukke det..
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