Zum Inhalt springen

Daten in Tabelle schreiben


Jester

Empfohlene Beiträge

Hallole,

ich möchte den Inhalt einer Datenbank in einer Tabelle anzeigen lassen. Ich arbeite noch nicht lange mit dem JBuilder 5 und ich habe eine Komponente (jTable) gefunden, die für mich passen würde. Leider habe ich es noch nicht geschafft, die Daten an die Tabelle zu übergeben.

Beim Initialisieren der Tabelle kann ich eine "Component" übergeben, und ich bin ratlos, was ist gemeint?? Wenn ich jTable erst beim Buttonklick anlegen will (vorher muss ich ja die Datenbank auslesen) klappt es mit der Initialisierung nicht mehr.

:confused: :confused: :confused: :confused:

Kann mir jemand ein Quelltext-Beispiel schicken, oder eine Adresse, bei der ich gute Tutorials zu dem Thema finde.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich hab das gleiche problem.

ich arbeite mit ibm visual age for java.

hab irgendwie keine ahnung wie ich überhaupt ansetzen soll.

die beispiele helfen mit irgendwie nicht weiter.

hat da jemand ahnung von, bzw. kann mir mal sagen wie ich es hinbekomme diese blöde tabelle zu füllen?

erstellt ist sie schon automatisch, müssen nur noch daten rein. aber wie?? welche methode nehm ich? oder muß ich da noch mit was anderem arbeiten? irgendein bean?

SOS!! :o(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi

Also ich habe momentan nicht ganz so viel Zeit sonst würde ich mich dem Problem besser annehmen.

Vor kurzer Zeit habe ich einmal ein Calendar-Panel programmiert, das verwendet ebenfalls einen JTable. Ich habe dies einmal auf meinen Server gelegt. Ladet es euch unter

http://www.Twisterdesign.de/unterlagen/javacode/calendarpanel.zip

runter, schaut es euch einmal an - besonders das Model - und versucht es zu verstehen.

Sollte das noch nicht reichen, meldet euch nochmal bei mir und wir versuchen es anders.

Erbeere

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um eine Tabelle mit "Leben" zu füllen braucht ihr ein "AbstractTableModel".

In der JDK-Doku steht dazu einiges. Aber hier noch mal ein Beispiel.

class TbmTab1

extends AbstractTableModel

{

private Vector allePortsBezeichnungTable = new Vector(15,30);

private Vector allePortsTable = new Vector(15,30);

private final String[] columnNames={"Port","Port/Name"};

public void clear() {

allePortsBezeichnungTable.clear();

allePortsTable.clear();

fireTableDataChanged();

}

public void add(Integer port, String bezeichnung) {

allePortsTable.add(port);

allePortsBezeichnungTable.add(bezeichnung);

int row = allePortsTable.size() - 1;

fireTableRowsInserted(row, row);

scpTab1.getViewport().setBackground(tblTab1.getBackground());

}

public int getColumnCount()

{

return columnNames.length;

}

public int getRowCount()

{

return allePortsTable.size();

}

public Object getValueAt(int rowIndex, int columnIndex)

{

switch(columnIndex){

case 0: return allePortsTable.get(rowIndex);

case 1: return allePortsBezeichnungTable.get(rowIndex);

default: return null;

}

}

Das wäre jetzt eine Tabelle mit 2 Spalten mit den Bezeichnungen "Port" und "Portname".

Wenn ihr Fragen dazu habt, fragt nochmal.

cu Peeter

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Peeter

public void add(Integer port, String bezeichnung) {

allePortsTable.add(port);

allePortsBezeichnungTable.add(bezeichnung);

int row = allePortsTable.size() - 1;

fireTableRowsInserted(row, row);

scpTab1.getViewport().setBackground(tblTab1.getBackground());

}

Ich habs eingebaut und in der void tauchen zwei Variablen auf, mit denen ich nichts anfangen kann: scpTab1 und tblTab1.

Ich schaue erst morgen wieder rein

merci erstmal

P.S. wo übergebe ich das Ergebnis des ResultSet ? Ich habe es bei public void add übergeben. Ist das Richtig??

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

da ich das Problem auch schon mal hatte, hier der Code meiner Lösung.

Funktioniert mit jeder beliebigen Tabelle in einer Datenbank.

Gruß Jaraz

PS: Wenn ihr Fragen zum Quelltext habt, fragt ruhig. Ich bin nämlich zu faul zum richtigen kommentieren im Code.

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

import  java.awt.*;

import  java.sql.*;

import  javax.swing.*;

import  java.util.*;

import  java.awt.event.*;

public class Main extends JFrame {

    public Main () {

        Vector rows = new Vector();

        Vector colnames = new Vector();

        JFrame frame = new JFrame();

        JPanel contentPane = (JPanel)frame.getContentPane();

        BorderLayout borderLayout1 = new BorderLayout();

        enableEvents(AWTEvent.WINDOW_EVENT_MASK);

        contentPane.setLayout(borderLayout1);

        frame.setSize(new Dimension(400, 300));

        frame.setTitle("DB Test");

        try {

            Class.forName("com.sap.dbtech.jdbc.DriverSapDB");

            String url = "jdbc:sapdb://host/database";

            Connection connection = DriverManager.getConnection(url, "user",

                    "pass");

            Statement stmt = connection.createStatement();

            ResultSet results = stmt.executeQuery("select * from test");

            ResultSetMetaData rmeta = results.getMetaData();

            for (int i = 1; i <= rmeta.getColumnCount(); ++i) {

                colnames.addElement(rmeta.getColumnLabel(i));

            }

            while (results.next()) {

                Vector newRow = new Vector();

                for (int j = 1; j <= rmeta.getColumnCount(); j++) {

                    newRow.addElement(results.getObject(j));

                }

                rows.addElement(newRow);

            }

        } catch (Exception ex) {

            ex.printStackTrace();

        }

        JTable jTable1 = new JTable(rows, colnames);

        JScrollPane scrollPane = new JScrollPane(jTable1);

        contentPane.add(scrollPane, BorderLayout.CENTER);

        frame.setVisible(true);

    }

    protected void processWindowEvent (WindowEvent e) {

        super.processWindowEvent(e);

        if (e.getID() == WindowEvent.WINDOW_CLOSING) {

            System.exit(0);

        }

    }

    public static void main (String[] args) {

        new Main();

    }

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Jester

tbmTab1 = new TbmTab1(); <-- Das ist die abstracte TableModel-Klasse

tblTab1 = new JTable(tbmTab1); <-- und hier wird die Table "erstellt"

tblTab1.setShowGrid(false); <-- hier wird das Gitternetz nicht angezeigt

scpTab1 = new JScrollPane(tblTab1); <-- und hier wird sie dem JScrollPane hinzugefügt

this.add(scpTab1, BorderLayout.CENTER);

Da wird nichts anderes gemacht, als das eine JTable auf eine JScrollPane gelegt wird, die wiederum ins Layout eingefügt wird.

Das müßtest du dort machen, wo deine Oberfläche gezeichnet wird.

scpTab1(JScrollPane) und tblTab1(die eigentliche Tabelle) müßtest du global definieren.

cu Peeter

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Peeter: vielen Dank für Deine Mühe

Hi,

mit validate() hab ich es auch versucht. Wie gesagt, es kommt keine Fehlermeldung und in der Datenbank ist sicher was drin (Access-Datenbank und Inhalt ist anzeigbar in TextArea).

Irgendwo habe ich einen Knoten drin und ich find ihn nicht

Ich werd erst mal ne Nacht drüber schlafen, vielleicht kommt mir morgen die Erleuchtung.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Probiert folgendes mal:

Zieht das Panel/Frame in dem sich die Table befindet mal etwas größer/kleiner. Wenn dann der Inhalt erscheint, sage ich euch morgen mehr.

Da muß die Table nämlich neu gezeichnet werden. Ich hatte auch eine ganze Zeit dieses Problem, hab es dann aber irgendwie hinbekommen. Wenn´s alles nix nützt, müßt ihr auf ´nem AbstractButton ne Action legen, die jedes mal die Table neu zeichnet wenn eine neue Zeile hinzugefügt wurde. Der Button muss nicht zu sehen sein.

Aber probiert erst mal das mit dem größer ziehen des Frames und postet es dann, ob eure Table nen Inhalt hat. Ich schau heut Nacht noch mal nach!!

cu Peeter

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Jester

@ Jaraz

Deinen Vorschlag habe ich auch probiert, mit gleichem Ergebnis:

Keine Fehlermeldung, keine Tabelle

ciao Jester

Dann weiss ich nicht was du falsch machst.

Alles was du ändern musst, ist in dem try-catch-Block.

Wenn du Probleme mit der Datenbank hättest, würde er es auf der Console anzeigen. Das im Frame keine Fehlermeldung kommt, ist dir hoffentlich klar (man kann ja nie wissen mit welchem Wissensstand man es zu tun hat ;) )

Also das Beispiel läuft bei mir mit Oracle, MSSQL, Mysql und SAP DB. Sowohl direkt im JBuilder als auch über die Dos Box von Windows.

Mit welcher Datenbank arbeitest du denn?

Was zeigt JBuilder beim ausführen im Messages Fenster?

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ Peeter

ein Teilerfolg: es wird eine Tabelle angezeigt !!!

Ich habe noch eine Fehlermeldung:

"TbmTab1.java": Fehler #: 300 : Methode fireTableRowInserted(int, int) nicht gefunden in Klasse datenbank_03.TbmTab1 in Zeile 36, Spalte 5

Ich habe ein neues Projekt angelegt, um die Tabelle zu testen. Im neuen Projekt ist bis jetzt nur die Tabelle drin, also noch kein Datenbankzugriff.

Nun habe ich noch Fragen:

1. Wie kann ich das Erscheinen der Tabelle auf einen Buttonklick legen, da davor das Auslesen der Datenbank gemacht werden soll?

2. Wie und wo übergebe ich das ResultSet?

3. Wie wähle ich eine Zeile aus der Tabelle aus, z.B. um den Datensatz zu bearbeiten?

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ Jaraz

Ich arbeite mit einer Access-Datenbank.

Bei Deinem Quelltext habe ich das Problem, dass ich nicht genau weiss, wo die Teile des Textes hinsollen. Wenn ich im JBuilder ein Projekt anlege und eine Anwendung, in der ich die grafische Oberfläche bestimme, muss ich teilweise den Quelltext der in public Main() steht in den Buttonklick schreiben. Dabei taucht dann wieder das Initialisierungsproblem der Tabelle auf, da mir der JBuilder dann rummault, weil er das gerne in der jbinit() hätte, dort kann ich es aber nicht hinschreiben, weil ich beim Programmstart noch nicht festlegen kann, welches Tabellenblatt geöffnet werden soll.

Ich sagte ja, irgendwo habe ich einen Knoten drin.

Ich hab jetzt bald Feierabend, zu Hause habe ich leider die Entwicklungsumgebung noch nicht, am Montag hab ich Schule, -> ich kann erst wieder am Dienstag weitermachen *nerv*

Nächstes Wochenende nehme ich die Kiste mit !!

Ich schaue weiterhin ins Forum, kann dann allerdings nicht gleich auf geniale Ideen reagieren.

Schönes Wochenende !!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Na also! Wenigstens etwas.

Nimm anstatt fireTableRowInserted(int, int) mal fireTableChanged(null) bzw. fireTableDataChanged(null)

Schick mir am besten mal den Teil der Source, der für die Tabelle verantwortlich ist.

Da kann ich dir wahrscheinlich etwas mehr helfen. Allerdings bin ich in der nächsten Zeit fast nicht erreichbar!!

Schulung bei SUN(*freu*):D

cu Peeter

Link zu diesem Kommentar
Auf anderen Seiten teilen

So nun habe ich den Knoten entwirrt. Mein Prg zeigt mir auf Knopfdruck den Tabelleninhalt an. Erst dort wird die Tabelle initialisiert und danach mit validate() die Form neu geschrieben. So weit, so gut.

Nun tauchen noch weitere Probleme auf:

Wie mache ich die Tabelle dynamisch? Ich gebe im Quelltext die Spaltenzahl an. Wie kann ich auf unterschiedliche Spaltenzahlen reagieren. In der Datenbank befinden sich mehrere Tabellenblätter, zum Öffnen übergebe ich den Namen in einem String, den ich in den SQL-Befehl einbaue, das ist kein Thema.

Nun sind die Tabellenblätter aber unterschiedlich aufgebaut. Kann ich die Spalten abfragen, oder schreibe ich für jedes Tabellenblatt eine eigene Klasse?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Jester,

wenn du dir mein Beispiel mal genauer angeschaut hättest, müßtest du das nicht fragen. :P

Du kannst die Anzahl der Spalten über:

ResultSetMetaData rmeta = results.getMetaData();

rmeta.getColumnCount();

herausfinden.

Den Namen der Spalte liefert dir: rmeta.getColumnLabel(i);

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...