ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
2285
2285
EMPFEHLEN
-
Hallo,
ich bin neuling bezüglich der Java und SQL anbindung.
Ich möchte eine Art Verwaltungsprogamm zu schreiben, hierfür muss ich eine Tabelle aus einer SQL Datenbank (Firebird) in Java, mittels eines JTabels dastellen.
Ich habe ein Quellcode geschrieben, bei dem mir eclipse auch keine Fehlermeldung gibt, jedoch öffnet sich beim ausführen der Class mit dem JTable keine Tabelle.
Wisst ihr vielleicht mehr
Ich habe hier mal den Quellcode der Class in der das JTable ausgeführt werden soll:
package Layoutstudenten;
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import javax.swing.JFrame; import javax.swing.JTable; public class TB2 extends JFrame { //Quelle:[url]http://www.easy-coding.de/jtable-mit-daten-aus-der-datenbank-neu-zeichnen-t5280.html[/url] JTable tab; Statement stmt = null; Connection con=null; ResultSet rs =null; private String user; private String pw; private String ur; private String dataname; private String prt; public TB2(String benutzer, String passwort, String url, String dbName, String port){ //Konstruktor zum Erzeugen einer DB-Tabelleund Darstellen String user=benutzer; String pw=passwort; String ur=url; String dataname=dbName; String prt=port; Object[][] daten= new Object[4][3]; // 2-dim. Feld für Tabellendaten String[] spalten={"Projektname","Kunde","Budget"}; // Überschriften der Spalten tab=new JTable(daten,spalten); // eine JTable konstruieren tab.setPreferredScrollableViewportSize(new Dimension(300,150)); // Größe add(tab,BorderLayout.CENTER); // im Fensterzentrum einfügen add(tab.getTableHeader(),BorderLayout.NORTH); // Spaltenüberschriften oben addWindowListener( //Methode zum Reagieren auf Fensterereignisse hinzufügen new WindowAdapter(){ //Instanz der Klasse WindowAdapter (mit leerem Interface WindowListener) public void windowClosing(WindowEvent e) //überschreibt Reaktion auf Fensterschließen {System.exit(0);} //mit Beenden des Programms } ); } public void öffneDB() { try { Class.forName("org.firebirdsql.jdbc.FBDriver"); // Treiber laden } catch (Exception e) { System.out.println("Fehler beim Laden des JdbcOdbc Treibers"); return; } try { con = DriverManager.getConnection(ur,user,pw); // Verbindung zu Datenbank herstellen stmt = con.createStatement(); } catch (Exception e) { System.err.println("keine Verbindung zu "+ur); return; } } public void frageProjekt() { try { rs = stmt.executeQuery("select * from Personen;"); // Datenbankabfrage int zeile=0; while (rs.next()){ //ResultSet abarbeiten: jeweils eine Zeile tab.setValueAt(rs.getString(1),zeile,0); //1. Attribut: String mit Projektname tab.setValueAt(rs.getString(2),zeile,1); //2. Attribut: String mit Kunde tab.setValueAt(new Integer(rs.getInt(3)),zeile,2); //3. Attribut: Int mit Budget als Objekt zeile++; } }catch (Exception e) { System.err.println("Fehler beim Bearbeiten der SQL-Anweisung"+ ": "+e.getMessage()); } try{ con.close(); } catch (Exception e) { System.out.println("Fehler beim Schließen der DB"); } } }
Ich weiß nicht wo mein Fehler ist, vielleicht könnt ihr mir helfen
Schonmal vielen Dank im Vorraus!
-
19.02.09 13:20 #2
- Registriert seit
- Jun 2005
- Beiträge
- 117
Ohne mir das jetzt genau angeschaut zu haben: ich würde erstmal dein Array als String definieren, dann erst das Array füllen, dann die Tabelle erstellen, die Tabelle auf ne ScrollPane packen, dann hast auch gleich den Header dabei, die ScrollPane auf dein Anzeige-Panel. Wenn du erst die Tabelle mit einem leeren Array erstellst und dann mit Daten füllst, musst du entsprechend dafür sorgen, dass es die Tabelle auch mitbekommt und sich aktualisiert.
Und ich würd auch statt mit Arrays mit Vektoren arbeiten oder werden deiner Tabelle keine Datensätze hinzugefügt? Dann hast du dein Daten-Array etwas dynamischer und läufst nicht Gefahr eine ArrayOutOfBoundException zu kassieren wenn sich mehr Datensätze als Zeilen in deinem Array in der Tabelle befinden.Geändert von normaler_spinner (19.02.09 um 13:26 Uhr)
-
Hi!!
Danke für deine schnelle Antwort!
Hmmm... mit Vektorven macht wirklich mehr sinn, hast recht, ich weiß nur nicht wie.
Und mit dem JScrollPane, nun, habe es ausprobiert einen leer auszuwerfen, das funktioniert jedoch auch nicht.-)
Was meinst du zu diesem Problem?
-
Hallo,
was meinst du mit es wird keine Tabelle geöffnet. Ist das Fenster denn da?
Ich hab das ganze jetzt mal ohne DB getestet und da wird eine Tabelle angezeigt.
Was die Vectoren angeht.
Du nutzt eigentlich schon Vectoren. Da du das Array der Tabelle gibst, legt die Tabelle intern ein DefaultTableModel an. Dieses befüllt einen Vector mit den Daten deines Arrays.
Wenn du jetzt Zeilen hinzufügen möchtest, geht das auch ganz einfach.
Code :1 2
DefaultTableModel model = (DefaultTableModel)tab.getModel; model.addRow(/*String-Array mit deinen Daten*/);
Ich würde das ganze aber etwas anders lösen. Ich würde eine Klasse Person erstellen, die die gleich Attribute hat, wie die Tabelle in der Datenbank. Wenn jetzt die Daten aus der Datenbank ausgelesen werden, würde ich für jede Zeile eine Person anlegen und mit Daten befüllen. Diese Person kann man dann in einer ArrayList speichern.
Für die Tabelle würde ich ein eigenes Model schreiben, dem ich diese Liste geben könnte. Mit einem TableCellRenderer würde ich die Daten dann entsprechend in der Tabelle darstellen.
Gruß
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
19.02.09 15:18 #5
- Registriert seit
- Jun 2005
- Beiträge
- 117
hier mal nen kleines Demo-Programm
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
import java.util.Vector; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; public class JTableFill { static Vector<Vector<String>> rows; static Vector<String> column; static Vector<String> header; static JTable table; static JScrollPane sp; public static void main(String[] args) { // TODO Auto-generated method stub JFrame x = new JFrame(); x.setSize(800,600); createDataModel(); x.add(initTable()); x.setVisible(true); } private static JScrollPane initTable(){ table = new JTable(rows, header); sp = new JScrollPane(table); return sp; } private static void createDataModel(){ rows = new Vector<Vector<String>>(); header = new Vector<String>(); // Table-Header header.add("Spalte A"); header.add("Spalte B"); header.add("Spalte C"); // Vektoren füllen column = new Vector<String>(); column.add("1"); column.add("2"); column.add("3"); rows.add(column); column = new Vector<String>(); column.add("4"); column.add("5"); column.add("6"); rows.add(column); } }
ja da hat Sascha recht, vielleicht kannst das aber trotzdem mal gebrauchen irgendwann
Geändert von normaler_spinner (19.02.09 um 15:20 Uhr)
-
Hey wie geil!!
Vielen dank!!
Ich habe mein Problem auch bewältigt.
Habe in dem Aufruf der Class, "depose();" stehen gehabt.
Naja, das Fenster wurde geöffnet und gleich wieder geschlossen.




Ich habe da noch eine Frage das sieht ja schon mal gut aus, und gefällt mir besser als mein vorheriges, ist flexibler.
Wie bekommt ihr denn die Infos aus der DB in die Vektoren eingelesen?
Also die Verbindung steht und dann
Sorry, aber ich bin absoluter Anfänger und ihr denkt wohl das man mir alles "vorkauen" muss.


Danke für eure Hilfe
-
19.02.09 18:13 #7
- Registriert seit
- Feb 2009
- Beiträge
- 1
Hallo liebe Java-Profis
ich habe hier das selbe Problem wie der Kollege Horst2009.
Das Problem was ich habe ist, wie ich die Daten aus der SQL Datenbank in die von "normaler_Spinner" gezeigten Parameter kriege.
Was muss ich tun um mit Hilfe seiner Quellcodes eine Tabelle aus einer SQL Datenbank zu erstellen
Habt ihr da welche Ideen?
Vielen Dank im Vorraus
Flieger 27
-
19.02.09 22:26 #8
- Registriert seit
- Jun 2005
- Beiträge
- 117
im Prinzip genau so wie du sie schon in die Tabelle gepumpt hast
Code :1 2 3 4 5 6 7
while (rs.next()){ column = new Vector<String>(); column.add(rs.getString(0)); column.add(rs.getString(1)); column.add(rs.getString(2)); rows.add(column); }Geändert von normaler_spinner (19.02.09 um 22:28 Uhr)
-
Oh man ihr seid richtig net und gut.
Ich habe mich damit ein wenig beschäftigt und dabei habe ich sowas erstellt.
Leider funktioniert es immernoch nicht
Habt ihr vielleicht eine Ahnung was daran falsch ist?
Oder verbesserungsvorschläge?
Hier mein aktueller Quellcode.
Das Problem ist, der zeigt jetzt schon ein JFram an, jedoch ist dieses Leer und dann kommt ne Fehlermeldung.-)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class layoutstudenten
{
static Vector<Vector<String>> rows;
static Vector<String> column;
static Vector<String> header;
static JTable table;
static JScrollPane sp;
public layoutstudenten(String benutzer, String passwort, String url,
String dbName, String port) {
table = new JTable(rows, header);
sp = new JScrollPane(table);
rows = new Vector<Vector<String>>();
header = new Vector<String>();
// Table-Header
header.add("Spalte A");
header.add("Spalte B");
header.add("Spalte C");
header.add("Spalte B");
header.add("Spalte C");
Connection con =null;
Statement stmt =null;
ResultSet rs =null;
try {
Class.forName("org.firebirdsql.jdbc.FBDriver");
//System.out.println("Treiber läuft");
}
catch(Exception e) {
System.out.println("Treiber läuft nicht! " + e);
}
//DIM SQLString as String ;
try {
// Verbindung herstellen
con = DriverManager.getConnection(url,benutzer,passwort);
//System.out.println("verbunden");
stmt = con.createStatement();
//System.out.println("1");
rs=stmt.executeQuery("SELECT * FROM Personen" );
int zeile=0;
while (rs.next()){
column = new Vector<String>();
column.add(rs.getString(0));
column.add(rs.getString(1));
column.add(rs.getString(2));
rows.add(column);
zeile++;
}
DefaultTableModel model = (DefaultTableModel)tab.getModel;
model.addRow();
con.close();
}
catch(Exception e)
{
System.out.println("Fehler beim Verbindungsaufbau " + e);
}
}
}
-
20.02.09 21:46 #10
- Registriert seit
- Jun 2005
- Beiträge
- 117
ich vermute der Fehler liegt hier:
Code :1 2
model.addRow(); // hier wird nichts übergeben model.addRow(rows);
-
Na wenn eine Fehlermeldung kommt, solltest du die Fehlermeldung auch posten. Hellsehen ist leider keine meiner Stärken.
Gruß
SaschaEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
Moin.
Ich habe mir das Programm angeschaut und die Änderung von normaler_spinner vorgenommen.
Ich weiß jedoch nicht ob es geklappt hat, da ich nun ne Fehlermeldung bei
"
DefaultTableModel model = (DefaultTableModel)tab.getModel;
"
habe. Der mag das " ..tab.getModel;" nicht, seht ihr woran das liegt?
Die Fehlermeldung an der Stelle "tab cannot be resolved"
-
Hast du die Variable "tab" überhaupt definiert?
Wenn ja,wo?
Probier mal die Deklaration von "tab" als public in deiner Klasse zu machen.
Ähnliche Themen
-
Daten von MySql Datenbank in PostgreSql Datenbank
Von Johannes7146 im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 06.11.09, 12:18 -
Daten mit 9 Jtables
Von kokoriko im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 23.10.07, 18:09 -
JTables Problem
Von xloouch im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 3Letzter Beitrag: 15.12.06, 15:25 -
fragen zu jtables / tableCellRenderer - jbutton in jtables
Von acky im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 19.05.05, 12:26 -
JTables Focus behalten
Von jorgeHX im Forum JavaAntworten: 4Letzter Beitrag: 24.08.04, 13:30





Zitieren

Login





