Avatar billede c88 Nybegynder
23. oktober 2002 - 21:43 Der er 7 kommentarer

Databasekald -> JTabel

Jeg har skrevet et program som skal hente data fra en database og vise det i en JTabel.

Databasen er MySQL og kaldet er lavet ved hjælp af disky's handler som i sikkert kender (se evt. http://www.eksperten.dk/spm/253487).

Kaldet virker fint - dataen bliver hentet og bliver lagt korrekt ned i vektoren - det er testet. Problemet opstår idet JTabel'en skal laves:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;

public class firstDB {

    Vector data,top;

    public static void main(String[] args) {

    // Laver liste over adresser i en vector: data
    // ----------------------------------------------------------

        // Laver en database-forbindelse
            Database db = new Database();
            db.open();

        // Laver forespørgelsen
            ResultSet res = db.doQuery("SELECT Adresse, id FROM huseftersyn LIMIT 40");
           
            Vector data = new Vector();
            Vector top = new Vector();

            try {
                while(res.next()) {
                        // skal indsættes på en eller anden måde: res.getInt("id"),
                    data.addElement(new String(res.getString("Adresse")));
                }
            } catch(SQLException e) {
            }

        // Lukker database-forbindelsen
            db.close();


    // Laver GUI'er
    // ----------------------------------------------------------

        // Sætter LookAndFeel
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) { }

        // Laver windue og panel
            JFrame frame = new JFrame("Mit første database-program");
            JPanel pane = new JPanel();
            pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));

       
        // Definere tabelens overskrifter
            // top.addElement("ID");
            top.addElement(new String("Adresse"));

        // Test - som retunere korrekt
            // pane.add(new JLabel("Vector data: " + data.toString()));
            // pane.add(new JLabel("Vector top: " + top.toString()));

        // Laver tabelen
            JTable tabel = new JTable(data, top);
            tabel.setPreferredScrollableViewportSize(new Dimension(200, 70));

            pane.add(tabel);

        // Tilføjer panelet til vinduet
            frame.getContentPane().add(pane);

        // Afslutter opsætningen af winduet og viser det
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
    }
}


Fejlen:

C:\java\db>javac firstDB.java

C:\java\db>java firstDB
Exception in thread "main" java.lang.ClassCastException: java.lang.String
        at javax.swing.table.DefaultTableModel.justifyRows(DefaultTableModel.jav
a:238)
        at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.j
ava:194)
        at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:131
)
        at javax.swing.JTable.<init>(JTable.java:392)
        at firstDB.main(firstDB.java:62)

Det skal lige siges at dette er mit første Java-program (hvis man ser bort fra hello worlds ol.). Alle forslag til forbedring er velkomne. Bør jeg f.eks. prøve at være mere objekt-orienteret og hvordan?
Avatar billede soreno Praktikant
23. oktober 2002 - 21:57 #1
for at kunne lave en gui skal din klasse arve fra eks. JFrame - så ja du er nødt til at være mere objektorienteret, eks:

public class MinGUI extends JFrame
{
  public MinGUI()
  {
    //init JFrame
    //init alle objekter
    //vis JFrame
  }
}

class Main
{
  public static void main(String args[])
  {
    new MinGUI();
  }
}
Avatar billede soreno Praktikant
23. oktober 2002 - 22:02 #2
et god fremgangsmåde:
start med at få vist en JFrame uden indhold (og forstå koden..)
tilføj en JTable og få din vist korrekt på din JFrame (og forstå koden..)
tilføj databasefunktionalitet til din JTable (..)
Avatar billede c88 Nybegynder
23. oktober 2002 - 22:06 #3
soreno: ja, sådan er jeg også gået frem - og det virkede fint - har dog ik prøvet at lave tabelen med vectore først.. prøver jeg lige - men det virkede med objekter
Avatar billede soreno Praktikant
23. oktober 2002 - 22:09 #4
hvis du kigger i \j2sdk1.4.1\demo\jfc\TableExample er der faktisk et ret godt eksempel på hvordan man får vist data dynamisk i en tabel - det er nemlig ikke så nemt som man umiddelbart skulle tro.
Avatar billede c88 Nybegynder
23. oktober 2002 - 22:10 #5
Det fik jeg så prøvet.. og fejlen ligger idet jeg opretter en JTabel med vektore - hvilket jeg jo egentligt godt vidste
Avatar billede c88 Nybegynder
24. oktober 2002 - 16:46 #6
Så fik jeg det til at virke. Det havde noget at gøre med at man skulle tilføje vectore til vectoren som indeholder dataen, og ikke strenge.

Desuden har jeg forsøgt at gøre det med objekt-orienteret.

den nye kode:

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;

public class firstDB {

    Vector data,top;

    public static void main(String[] args) {

        // Laver en database-forbindelse
            Database db = new Database();
            db.open();

        // Laver forespørgelsen
            ResultSet res = db.doQuery("SELECT id, Adresse FROM huseftersyn LIMIT 500");
           
            Vector rows = new Vector();
           
            try {
                while(res.next()) {
                    Vector newRow = new Vector();
                    newRow.addElement(new Integer(res.getInt(1)));        // ID'et
                    newRow.addElement(new String(res.getString(2)));    // Adressen
                    rows.addElement(newRow);
                }
            } catch(SQLException e) {
            }

        // Definere tabelens overskrifter
            Vector top = new Vector();
            top.addElement(new String("ID"));
            top.addElement(new String("Adresse"));

        // Lukker database-forbindelsen
            db.close();

        // Laver GUI'et
            gui gui = new gui(rows,top);
    }
}


class gui {

    JFrame frame;
    JPanel pane;
    JTable tabel;
    JScrollPane scrollPane;

    public gui(Vector rows, Vector top) {

        // Sætter LookAndFeel
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) { }

        // Laver windue og panel
            frame = new JFrame("firstDB");
            pane = new JPanel();
            pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));

        // Laver tabelen
            tabel = new JTable(rows, top);

            setColWidth(0,50);    // ID
            setColWidth(1,250);    // Adresse

            scrollPane = new JScrollPane(tabel);
            tabel.setPreferredScrollableViewportSize(new Dimension(300, 200));
            pane.add(scrollPane, BorderLayout.CENTER);

        // Tilføjer panelet til vinduet
            frame.getContentPane().add(pane);

        // Afslutter opsætningen af winduet og viser det
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
    }

    public void setColWidth(int col, int width) {
        tabel.getColumnModel().getColumn(col).setPreferredWidth(width);
    }
       
}

var det sådan du mente det soreno? (ang. opdeling i gui og db-kald)

burde jeg benytte mig af "extends JFrame" på gui'en? hvorfor og hvordan ændre jeg det til det?
Avatar billede soreno Praktikant
24. oktober 2002 - 19:57 #7
ja, det var sådan noget i den stil.. :-)

class gui extends JFrame

Hvis du kigger i hierarkiet vil du se at der er en følge af klasser når du arver fra JFrame. Disse klasser indeholder metoder som du helt sikkert skal bruge for at få det til at spille ordentligt.
En af ideerne bag OO er jo netop at kunne genbruge kode (via arvehierarkiet)
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