Zum Inhalt springen

Mein Programm hängt


BMAS

Empfohlene Beiträge

Mein Programm hängt irgendwo und ich weiss nicht wo, ich versuche aus einem ResultSet ein JTable zu erstellen, aber irgendwie klappt das nicht so ganz, während des Kompilierens bekomme ich keine Fehler aber zur Laufzeit bleibt das Programm stehen, bitte helft mir ich habe mir schon seit heute früh den Kopf zerbrochen (und habe jetzt Kopfschmerzen :D ) und komme nicht weiter...

Die SQL Abfrage:

import java.sql.*;
import java.util.StringTokenizer;

public final class Sql {

private String wert;
private String feld;

private String werte[];
private String felder[];

private ResultSet rSet;
public Sql() {

}
public ResultSet getResultSet(String wert) throws Exception{

String select = "SELECT * FROM ldd WHERE (";

int i = 1;

boolean x = false;

this.wert = wert;

String token;

StringTokenizer st = new StringTokenizer(wert, ";");

while (st.hasMoreTokens()) {

token = st.nextToken();

if (i == 1 && token.equals("-") == false) {
select = select + "Lieferantenname LIKE '%" + token + "%'";
x = true;
}

if (i == 2 && token.equals("-") == false) {

if (x == false) {
select = select + "Lieferantennr='" + token + "'";
x = true;
} else
select = select + " AND Lieferantennr='" + token + "'";

}

if (i == 3 && token.equals("-") == false) {

if (x == false) {
x = true;
select = select + "Branche='" + token + "'";
} else
select = select + " AND Branche='" + token + "'";

}

if (i == 4 && token.equals("-") == false) {

if (x == false)
select = select + "Bewertung='" + token + "'";

else
select = select + " AND Bewertung='" + token + "'";
}
i = i + 1;

}

select = select + ");";

/*um die Eventualität auszuschliessen dass etwas mit meinem SELECT Befehl nicht stimmt, habe ich mal einen genommen, der eigentlich funktionieren sollte...*/

select = "SELECT * FROM ldd";

System.out.println(select);

select(select);
rSet.close();
return rSet;

}
private void select(String sqlQuery) throws Exception{

try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (Exception e) {
System.out.println("Fehler bei ODBC-JDBC " + e);

return;
}

ResultSet rSet;
Statement stmt;
Connection conn;

try {
String url = "jdbc:odbc:MList";

conn = DriverManager.getConnection(url, "root", "");
stmt = conn.createStatement();

rSet = stmt.executeQuery(sqlQuery);
} catch (Exception e) {
System.out.println(e);

return;
}

this.rSet = rSet;
stmt.close();
rSet.close();
conn.close();
}
}[/PHP]

Hier wird das ResultSet zu einem Object[][] gemacht, das ResultSet wird erstellt(ich lasse mir die Ergebnisse ja System.out.prinlnen :) ), es kann also nicht an meiner SQL abfrage liegen:

[PHP]import javax.swing.JTable;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

public class Tools {


public JTable getJTable(ResultSet rset, String[] columnnames) throws Exception{

ResultSetMetaData rsetmd = rset.getMetaData();
int cols = rsetmd.getColumnCount();
rset.last();
int rows=rset.getRow();

int i=0;
int p=0;

Object[][] o = new Object[rows][cols];

while(i<=rows)
{
for (p = 0; p <= cols; p++){
o[i][p]=rset.getString(p+1);
System.out.println(o[i][p].toString());
}
i++;

}

return new JTable(o,columnnames);
}
}

Und hier wird dann schliesslich das JTable erstellt und auf einem jFrame platziert...


import java.awt.Insets;
import java.awt.GridBagLayout;
import javax.swing.JTable;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import java.awt.BorderLayout;
import javax.swing.ImageIcon;

public class TableFrame extends javax.swing.JFrame{

private JTable datenTable = new JTable();

private Sql sql = new Sql();

private JPanel süden = new JPanel();

private JSeparator sep = new JSeparator();

private JButton bOK = new JButton(new ImageIcon("C:/images/tick_blue.gif"));
private JButton bZur = new JButton(new ImageIcon("C:/images/cross_red.gif"));

public TableFrame(String werte) throws Exception{

int i=0;

Tools tools = new Tools();

String[] columnnames =
{ "iD","Branche","Leistungsverzeichnis","Lieferantenname", "Adresse", "Telefon"
,"Ansprechpartner","Anspr. P. Einkäufer","Anspr. P. AG Einkauf","Bewertung"
,"Bemerkung zu Bewertung", "Bewertungszeitraum","Rahmenvertrag","BM Nummer" };

datenTable = tools.getJTable(sql.getResultSet(werte),columnnames);

süden.setLayout(new GridBagLayout());

GridBagConstraints csep = new GridBagConstraints();
csep.gridx = 0;
csep.gridy = 0;
csep.fill = GridBagConstraints.HORIZONTAL;
csep.weightx = 1.0;
csep.gridwidth = 1;
csep.anchor = GridBagConstraints.WEST;
csep.gridwidth = GridBagConstraints.REMAINDER;
csep.insets = new Insets(4, 4, 4, 4);

GridBagConstraints cbOK = new GridBagConstraints();
cbOK.gridx = 0;
cbOK.gridy = 1;
cbOK.weightx = 1.0;
cbOK.gridwidth = 1;
cbOK.fill = GridBagConstraints.HORIZONTAL;
cbOK.anchor = GridBagConstraints.WEST;
cbOK.insets = new Insets(4, 4, 4, 4);

GridBagConstraints cbZur = new GridBagConstraints();
cbZur.gridx = 1;
cbZur.gridy = 1;
cbZur.weightx = 1.0;
cbZur.gridwidth = 1;
cbZur.fill = GridBagConstraints.HORIZONTAL;
cbZur.anchor = GridBagConstraints.EAST;
cbZur.insets = new Insets(4, 4, 4, 4);

süden.add(sep, csep);
süden.add(bOK, cbOK);
süden.add(bZur, cbZur);

this.setLayout(new BorderLayout());
this.getContentPane().add(datenTable, BorderLayout.CENTER);
this.getContentPane().add(süden, BorderLayout.SOUTH);

this.setVisible(true);
this.pack();
}
public static void main(String[] args) {

try {new TableFrame("-;-;-;A");}catch(Exception e){}}
}[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von BMAS

try {new TableFrame("-;-;-;A");}catch(Exception e){}}

Tja, das kommt davon wenn man alles in eine Zeile quetschen will.

Lass dir doch mal den Stacktrace der Exception ausgeben.

e.printStackTrace();

Dann biste schon mal schlauer und weißt wo die Anwendung hängt.

Und ob süden als Variablenname so geschickt ist, bin ich mir auch nicht sicher.

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also auf die Schnelle ist mir folgende Zeile aufgefallen, die zunächst einmal zu einem Programmabbruch führen wird:

this.setLayout(new BorderLayout());

wenn Du daraus

this.getContentPane().setLayout(new BorderLayout());

machst, sollte es funktionieren.

Deine Methode getJTable aus der Klasse Tools wird übrigens nur funktionieren, wenn die Datenbankabfrage mehr als 0 Ergebnisse liefert! Aber auch dann ist ein stabiler Ablauf nicht gesichert, denn je nach verwendeter Datenbank und Abfrage kann rset.last() und rset.getRow() nicht das erwartete Ergebnis liefern.

Es ist besser mit rset.next() die Ergebnisse so lange zu durchlaufen bis eben keine weitere Zeile vorhanden ist.

Hoffe das hilft schonmal.

Viel Erfolg, F.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@derflix

Also mit getContentPane().setLayout() hast du recht, bin halt noch etws AWT geschädigt :P

Mit der MySQL Datenbank die wir benutzen, funktioniert die last() Sache ganz gut, ich werde es aber mal mit deiner Methode probieren, um das Mögliche unmöglich zu machen ;)

Das Programm ist ja noch nicht fertig, später wird dann über das dazugehörige GUI abgefragt, ob der User auch was eingegeben hat, eventuell wird er dann zur Eingabe gezwungen oder ich setze die Abfrage auf "SELECT * FROM TABLE".

@all

Aber ich glaube ich habe den Fehler gefunden, wenn ich mir den Stacktrace ausgeben lasse, wie Jaraz es vorgeschlagen hat kommt folgende Fehlermeldung:

java.sql.SQLException: ResultSet is closed
java.lang.Throwable(java.lang.String)
java.lang.Exception(java.lang.String)
java.sql.SQLException(java.lang.String)
java.sql.ResultSetMetaData sun.jdbc.odbc.JdbcOdbcResultSet.getMetaData()
javax.swing.JTable gui_v_200.Tools.getJTable(java.sql.ResultSet, java.lang.String [])
gui_v_200.TableFrame(java.lang.String)
void gui_v_200.TableFrame.main(java.lang.String [])[/PHP]

Wenn ich jetzt aber meine beiden rset.close() rausnehme, kommt die Fehlermeldung immernoch, hat jemand eine Idee? :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also irgendwo wird das Resultset oder die Connection noch geschlossen.

Der Code wird aber sowieso nicht funktionieren, da du in der while Schleife nicht das Resultset durchläufst (im Object Array wird immer nur der letzte Wert stehen) und du min. eine ArrayIndexOutOfBounds Execption bekommen wirst.

for (p = 0; p <= cols; p++){

daraus muss du

for (p = 0; p < cols; p++){

machen.

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe das ganze nochmal umgeschrieben:

Dies ist die neue SQL Klasse


import java.sql.*;
import java.util.StringTokenizer;

public final class Sql {

private ResultSet rSet;
public Sql() {

}
private String makeQuery(String wert, String table, String aktion) {

String sqlquery = "";

if (wert != null && table != null && aktion.equalsIgnoreCase("Select")) {
sqlquery = "SELECT * FROM " + table + " WHERE (";

int i = 1;

boolean x = false;

String token;

StringTokenizer st = new StringTokenizer(wert, ";");

while (st.hasMoreTokens()) {

token = st.nextToken();

if (i == 1 && token.equals("-") == false) {
sqlquery = sqlquery + "Lieferantenname LIKE '%" + token + "%'";
x = true;
}

if (i == 2 && token.equals("-") == false) {

if (x == false) {
sqlquery = sqlquery + "Lieferantennr='" + token + "'";
x = true;
} else
sqlquery = sqlquery + " AND Lieferantennr='" + token + "'";

}

if (i == 3 && token.equals("-") == false) {

if (x == false) {
x = true;
sqlquery = sqlquery + "Branche='" + token + "'";
} else
sqlquery = sqlquery + " AND Branche='" + token + "'";

}

if (i == 4 && token.equals("-") == false) {

if (x == false)
sqlquery = sqlquery + "Bewertung='" + token + "'";

else
sqlquery = sqlquery + " AND Bewertung='" + token + "'";
}
i = i + 1;

}
}

sqlquery = sqlquery + ");";
sqlquery = "SELECT * FROM ldd";

System.out.println(sqlquery);

return sqlquery;

}
public Object[][] select(String wert, String table) throws Exception {

int treffer = 0;

String sqlquery = makeQuery(wert, table, "select");

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connection connection =
DriverManager.getConnection("jdbc:odbc:MList", "root", "");

Statement stmt;
stmt =
connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rSet = stmt.executeQuery(sqlquery);
while (rSet.next());
treffer++;

System.out.println("0");
return toObject(rSet);
}
private Object[][] toObject(ResultSet rset) throws Exception {

ResultSetMetaData rsetmd = rset.getMetaData();
int cols = rsetmd.getColumnCount();
rset.last();
int rows = rset.getRow();

int i = 0;
int p = 0;

Object[][] o = new Object[rows][cols];

while (i <= rows) {
for (p = 0; p < cols; p++) {
o[i][p] = rset.getString(p + 1);
System.out.println(o[i][p].toString());
}
i++;

}

return (o);
}
}[/PHP]

An der TableFrame Klasse habe ich nur diese Zeile

"datenTable = new JTable(sql.select (werte,"ldd"),columnnames);"

ein wenig geändert...

[PHP]
import java.awt.Insets;
import java.awt.GridBagLayout;
import javax.swing.JTable;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import java.awt.BorderLayout;
import javax.swing.ImageIcon;

public class TableFrame extends javax.swing.JFrame{

private JTable datenTable = new JTable();

private Sql sql = new Sql();

private JPanel süden = new JPanel();

private JSeparator sep = new JSeparator();

private JButton bOK = new JButton(new ImageIcon("C:/images/tick_blue.gif"));
private JButton bZur = new JButton(new ImageIcon("C:/images/cross_red.gif"));

public TableFrame(String werte) throws Exception{

int i=0;

String[] columnnames =
{ "iD","Branche","Leistungsverzeichnis","Lieferantenname", "Adresse", "Telefon"
,"Ansprechpartner","Anspr. P. Einkäufer","Anspr. P. AG Einkauf","Bewertung"
,"Bemerkung zu Bewertung", "Bewertungszeitraum","Rahmenvertrag","BM Nummer" };

datenTable = new JTable(sql.select(werte,"ldd"),columnnames);

süden.setLayout(new GridBagLayout());

GridBagConstraints csep = new GridBagConstraints();
csep.gridx = 0;
csep.gridy = 0;
csep.fill = GridBagConstraints.HORIZONTAL;
csep.weightx = 1.0;
csep.gridwidth = 1;
csep.anchor = GridBagConstraints.WEST;
csep.gridwidth = GridBagConstraints.REMAINDER;
csep.insets = new Insets(4, 4, 4, 4);

GridBagConstraints cbOK = new GridBagConstraints();
cbOK.gridx = 0;
cbOK.gridy = 1;
cbOK.weightx = 1.0;
cbOK.gridwidth = 1;
cbOK.fill = GridBagConstraints.HORIZONTAL;
cbOK.anchor = GridBagConstraints.WEST;
cbOK.insets = new Insets(4, 4, 4, 4);

GridBagConstraints cbZur = new GridBagConstraints();
cbZur.gridx = 1;
cbZur.gridy = 1;
cbZur.weightx = 1.0;
cbZur.gridwidth = 1;
cbZur.fill = GridBagConstraints.HORIZONTAL;
cbZur.anchor = GridBagConstraints.EAST;
cbZur.insets = new Insets(4, 4, 4, 4);

süden.add(sep, csep);
süden.add(bOK, cbOK);
süden.add(bZur, cbZur);

this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(datenTable, BorderLayout.CENTER);
this.getContentPane().add(süden, BorderLayout.SOUTH);

this.setVisible(true);
this.pack();
}
public static void main(String[] args) {

try {new TableFrame("-;-;-;A");}catch(Exception e){e.printStackTrace();}}
}

Jetzt bekomme ich aber eine:

java.lang.UnsupportedOperationException

java.lang.Throwable()

java.lang.Exception()

java.lang.RuntimeException()

java.lang.UnsupportedOperationException()

java.sql.Statement sun.jdbc.odbc.JdbcOdbcConnection.createStatement(int, int)

java.lang.Object [][] gui_v_200.Sql.select(java.lang.String, java.lang.String)

gui_v_200.TableFrame(java.lang.String)

void gui_v_200.TableFrame.main(java.lang.String [])

vorgeworfen, ich denke mal das ganze bricht noch in der select Methide in der Klasse SQL ab.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay, ist draussen, aber jetzt kommt wieder ResultSet is closed... und der JFrame mit dem JTable, welches die Daten enthalten soll wird noch immer nicht angezeigt... :(

ICh habe da einen Verdacht, meine toObject Methode funktioniert wohl nicht, da ich mir ja den jeweiligen Datensatz der in das Object[][] geschrieben wird auch ausgeben lasse, dieser aber nicht ausgegeben wird.

Fällt irgendwem nochwas an der Methode auf? Oder gibt es eine andere Möglichkeit sein ResultSet in einem JTable anzeigen zu lassen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Auf die Schnelle würde ich Dir mal empfehlen zu prüfen, ob

rset.last();

int rows = rset.getRow();

wirklich die Anzahl der Zeilen liefert! Gerade beim Einsatz von MySQL habe ich die Erfahrung gemacht, dass dieser Trick nicht funktioniert und die Variable rows anschliessend den Wert 0 hat.

Wenn dem so ist, dürfte Dein Programm in folgender Zeile abstürzen:

o[p] = rset.getString(p + 1);

Denn für den Fall dass rows den Wert 0 hat, was ja auch unter normalen Umständen vorkommen kann, hat dein Array 0 die Ausmasse [0][cols], deine Schleife wird aber auch für rows=0 einmal durchlaufen, weswegen es bei der Zuweisung an o[p] in jedem Fall zu einem Fehler kommen müsste.

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn ich ein System.out.println, direkt hinter

"int rows=rset.getRow();"

setze wird nichts ausgegeben...

Danach habe ich es mal so probiert:


private Object[][] toObject (ResultSet rset) throws Exception{

System.out.println("0");
ResultSetMetaData rsetmd = rset.getMetaData();
System.out.println("1");
int cols = rsetmd.getColumnCount();
System.out.println("2");
System.out.println(rset.last());
System.out.println("3");
int rows=rset.getRow();
System.out.println("4");
rset.first();
System.out.println("5");

System.out.println(cols+" "+rows);

int i=0;
int p=0;

Object[][] o = new Object[rows][cols];

while(i<=rows)
{
for (p = 0; p < 100; p++){
rset.next();
o[i][p]=rset.getString(p+1);
System.out.println(o[i][p].toString());
}
i++;

}

stmt.close();

return (o);
}[/PHP]

Bis System.out.println(2); kommt das Programm noch, danach gibt es eine Exception:

ResultSet closed...

wenn ich meine Connection und mein Statement nicht schliesse, bekomme ich eine:

java.lang.UnsupportedOperationException

java.lang.Throwable()

java.lang.Exception()

java.lang.RuntimeException()

java.lang.UnsupportedOperationException()

boolean sun.jdbc.odbc.JdbcOdbcResultSet.last()

java.lang.Object [][] gui_v_200.Sql.toObject(java.sql.ResultSet)

java.lang.Object [][] gui_v_200.Sql.select(java.lang.String, java.lang.String)

gui_v_200.TableFrame(java.lang.String)

void gui_v_200.TableFrame.main(java.lang.String [])

wenn nur eins von beiden schliesse auch...

Anscheinend geht last() wirklich nicht, aber wie könnte ich es denn anders machen? absolute(-1) ist genau dasselbe und mehr habe ich in der Api nicht gefunden :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eigentlich ist es garnicht notwendig, die Anzahl der Zeilen zu ermitteln. Es langt so lange mit ResultSet.next() die Daten auszulesen bis keine mehr vorhanden sind.

Da ich (sorry) Durch Deinen Code langsam nicht mehr so ganz durchblicke, hab ich das ganze nochmal komplett neu geschrieben (mit MySQL als Datenbank).

Anstelle eines Object-Arrays habe ich Vectoren verwendet. Der Vorteil dabei ist, dass die Anzahl der Zeilen/Spalten vorher nicht feststehen muss und dass Du die Vektoren direkt an den Konstruktor von JTable übergeben kannst.

Das Programm funktioniert auch dann, wenn die Datenbankabfrage 0 Zeilen liefert.

Natürlich ist das Beispiel so nicht perfekt, für den täglichen Einsatz würde sich die Erstellung einer von JTable abgeleiteten Klasse empfehlen.


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

class TableTest extends JFrame
{
public TableTest() throws Exception
{
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
// MySQL-Treiber laden
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
Connection con = DriverManager.getConnection("jdbc:mysql://hostname:3306/database?user=root&password=**************");
Statement abfrage = con.createStatement();
Vector Daten = new Vector();
Vector Spaltennamen = new Vector();

try {
ResultSet ergebnis = abfrage.executeQuery("SELECT ...");
ResultSetMetaData tabellenstruktur = ergebnis.getMetaData();
int spalten = tabellenstruktur.getColumnCount();
// die Spaltennamen aus der Datenbank verwenden
for (int a=1; a<=spalten; a++) Spaltennamen.add(tabellenstruktur.getColumnName(a));
while (ergebnis.next()) {
Vector einezeile = new Vector();
for (int a=1; a<=spalten; a++) {
einezeile.add(ergebnis.getString(a));
}
Daten.add(einezeile);
}
} catch (SQLException e)
{
}
// Tabelle erzeugen und anzeigen
JTable tabelle = new JTable(Daten,Spaltennamen);
this.getContentPane().add(new JScrollPane(tabelle));
}


public static void main(String[] args)
{
try {
TableTest fenster = new TableTest();
fenster.setSize(200,200);
fenster.setVisible(true);
} catch (Exception e) {
}
}
}
[/PHP]

Hoffe das hilft dir weiter. Falls du eine gute Klasse erstellst um Tabellen mit dem Ergebnis beliebiger SQL-Abfragen zu füllen, würde ich mich freuen wenn du die hier posten könntest.

derflix

Link zu diesem Kommentar
Auf anderen Seiten teilen

>Da ich (sorry) Durch Deinen Code langsam nicht mehr so ganz durchblicke,

Brauchst dich nicht entschuldigen, geht mir auch so :D

> Hoffe das hilft dir weiter. Falls du eine gute Klasse erstellst um Tabellen mit dem Ergebnis beliebiger SQL-Abfragen zu füllen, würde ich mich freuen wenn du die hier posten könntest.

Werde ich machen, und vielen Dank für deine Hilfe (natürlich gilt das auch für Jaraz), ihr habt mir sehr geholfen! Ohne euch hätte ich wahrscheinlich nochmal ganz von vorne angefangen!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm, vielleicht habe ich mich zu früh gefreut, ich habe nochmal alles umgeschrieben und meine Sql Klasse soweit verändert, dass sie (hoffentlich) leichter verständlich ist und statt einem Object einen Vector zurückgibt, aber mein JTable zeigt nur den ersten Datensatz an und das 10 mal (oder halt so oft wie Datensätze im ResultSet vorhanden sind).

Wenn ich mir den Vector mit System.out.println ausgeben lasse, sieht alles richtig aus, die verschiedenen Datensätze sind drinnen und nicht 10 mal derselbe...

hier mal der Code der neuen Sql Klasse:



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

public final class Sql {

//private ResultSet rset;

private Statement stmt;

private Connection connection;
public Sql() throws Exception {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connection connection =
DriverManager.getConnection("jdbc:odbc:MList", "root", "");

stmt = connection.createStatement();

}
public Sql(String driver, String url, String user, String pw)
throws Exception {

Class.forName(driver);

Connection connection = DriverManager.getConnection(url, user, pw);

stmt = connection.createStatement();

}

public void close() {

try { connection.close();stmt.close(); }
catch (Exception e) { connection=null; }

}

public void connect() {}

public void finalize() {close();}
public Vector getColumnNames(ResultSet rset) throws SQLException{

Vector columnnames = new Vector();

int cols = rset.getMetaData().getColumnCount();

for (int i = 1; i <= cols; i++){
columnnames.add(rset.getMetaData().getColumnName(i));
}

return columnnames;
}
public String makeQuery(String wert, String table, String aktion) {

String sqlquery="";

if (wert!=null && table!=null && aktion.equalsIgnoreCase("Select"))
{
sqlquery = "SELECT * FROM "+table+" WHERE (";

int i = 1;

boolean x = false;

String token;

StringTokenizer st = new StringTokenizer(wert, ";");

while (st.hasMoreTokens()) {

token = st.nextToken();

if (i == 1 && token.equals("-") == false) {
sqlquery = sqlquery + "Lieferantenname LIKE '%" + token + "%'";
x = true;
}

if (i == 2 && token.equals("-") == false) {

if (x == false) {
sqlquery = sqlquery + "Lieferantennr='" + token + "'";
x = true;
} else
sqlquery = sqlquery + " AND Lieferantennr='" + token + "'";

}

if (i == 3 && token.equals("-") == false) {

if (x == false) {
x = true;
sqlquery = sqlquery + "Branche='" + token + "'";
} else
sqlquery = sqlquery + " AND Branche='" + token + "'";

}

if (i == 4 && token.equals("-") == false) {

if (x == false)
sqlquery = sqlquery + "Bewertung='" + token + "'";

else
sqlquery = sqlquery + " AND Bewertung='" + token + "'";
}
i++;

}
}

sqlquery = sqlquery + ");";
sqlquery = "SELECT * FROM ldd";

System.out.println(sqlquery);

return sqlquery;

}
public ResultSet select(String sqlquery) throws Exception {

return (stmt.executeQuery(sqlquery));
}
public Vector toVector(ResultSet rset) throws Exception {

ResultSetMetaData rsetmd = rset.getMetaData();

int cols = rsetmd.getColumnCount();

System.out.println(cols);

Vector datensatz = new Vector();
Vector daten = new Vector();

while (rset.next()) {
for (int i = 1; i <= cols; i++) {

datensatz.add(rset.getString(i));
}
daten.add(datensatz);

}

return daten;
}
}
[/PHP]

Und hier mein JTable:

[PHP]
import java.util.Vector;
import java.sql.ResultSet;
import javax.swing.JScrollPane;
import java.awt.Insets;
import java.awt.GridBagLayout;
import javax.swing.JTable;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import java.awt.BorderLayout;
import javax.swing.ImageIcon;

public final class TableFrame extends javax.swing.JFrame{

private JTable datenTable = new JTable();

private Sql sql = new Sql("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:MList","root","");

private JPanel süden = new JPanel();

private JSeparator sep = new JSeparator();

private JButton bOK = new JButton(new ImageIcon("C:/images/tick_blue.gif"));
private JButton bZur = new JButton(new ImageIcon("C:/images/cross_red.gif"));
public TableFrame(String werte) throws Exception{

int i = 0;


String sqlquery = sql.makeQuery(werte,"ldd","select");

ResultSet rset = sql.select(sqlquery);

Vector daten = sql.toVector(rset);

Vector spalten = sql.getColumnNames(rset);

JTable table = new JTable(daten, spalten);


süden.setLayout(new GridBagLayout());

GridBagConstraints csep = new GridBagConstraints();
csep.gridx = 0;
csep.gridy = 0;
csep.fill = GridBagConstraints.HORIZONTAL;
csep.weightx = 1.0;
csep.gridwidth = 1;
csep.anchor = GridBagConstraints.WEST;
csep.gridwidth = GridBagConstraints.REMAINDER;
csep.insets = new Insets(4, 4, 4, 4);

GridBagConstraints cbOK = new GridBagConstraints();
cbOK.gridx = 0;
cbOK.gridy = 1;
cbOK.weightx = 1.0;
cbOK.gridwidth = 2;
cbOK.anchor = GridBagConstraints.WEST;
cbOK.fill = GridBagConstraints.REMAINDER;
cbOK.insets = new Insets(4, 4, 4, 4);

GridBagConstraints cbZur = new GridBagConstraints();
cbZur.gridx = 1;
cbZur.gridy = 1;
cbZur.weightx = 1.0;
cbZur.gridwidth = 2;
cbZur.anchor = GridBagConstraints.EAST;
cbZur.fill = GridBagConstraints.REMAINDER;
cbZur.insets = new Insets(4, 4, 4, 4);

süden.add(sep, csep);
süden.add(bOK, cbOK);
süden.add(bZur, cbZur);

this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
this.getContentPane().add(süden, BorderLayout.SOUTH);

this.setVisible(true);
this.pack();
}
public static void main(String[] args) {

try {new TableFrame("-;-;-;A");}catch(Exception e){e.printStackTrace();}}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen


public Vector toVector(ResultSet rset) throws Exception {


    ResultSetMetaData rsetmd = rset.getMetaData();


    int cols = rsetmd.getColumnCount();


    System.out.println(cols);


    Vector datensatz = new Vector();//Die Zeile muss...

    Vector daten = new Vector();


    while (rset.next()) {

        //hier hin...

        for (int i = 1; i <= cols; i++) {

            datensatz.add(rset.getString(i));

        }

        daten.add(datensatz);

    }


    return daten;

}

Achte auf die 2 Kommentare...

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich finde Dein Code ist immernoch nicht übersichtlicher geworden ;-)

Warum verteilst Du denn alles so aufwendig? Das geht doch auch wesentlich kompakter.

Aber gut, mir scheint dass hier ein Fehler steckt:


Vector datensatz = new Vector();
Vector daten = new Vector();

while (rset.next()) {
for (int i = 1; i <= cols; i++) {

datensatz.add(rset.getString(i));
}
daten.add(datensatz);

}
[/PHP]

Der Vektor daten soll in diesem Fall die Zeilen aufnehmen, der Vektor datensatz jeweils nur eine Zeile.

Wenn Du das ganze so schreibst wie aus meinem Beispiel, müsste es so aussehen:

[PHP]
Vector daten = new Vector();

while (rset.next()) {
Vector datensatz = new Vector();
for (int i = 1; i <= cols; i++) {
datensatz.add(rset.getString(i));
}
daten.add(datensatz);
}

Ich habe hier lediglich die Erzeugung des Vektors datensatz in die Schleife geschoben! Der Grund, warum es so funktioniert ist ganz einfach: beim jedem Schleifendurchlauf wird ein neuer Vektor datensatz erzeugt, so dass bei n Zeilen auch n Vektoren datensatz existieren.

Bei deiner Deklaration wird nur ein Vektor erzeugt und die Daten einfach immer angehängt.

Aus diesem Grund erscheint die selbe Zeile immer wieder!

Gruß

derflix

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von derflix

Wie kann man denn bitte zu viel schreiben??

Meinst Du ich sollte die Anzahl meiner Beiträge reduzieren oder die länge meiner Beiträge?

Nein, du schreibst nicht zuviel, ist genau richtig so :D du brauchst auch nichts zu reduzieren :P

Dankeschön jetzt geht das.

Aber warum haben meine spalten in der JTable keinen Namen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie sehen eigentlich die Indizes von einem Vector aus?

Hintergrund:

Ich möchte für mein JTable ein eigenes Model erstellen, damit ich es updaten kann , wenn der User eine neue Abfrage startet und ich auch ein bisschen mit den Farben herumspielen kann.

Das hat auch ganz gut geklappt, ich übergebe dem Konstruktor des Models den Vector für die Spaltennamen und den Vector für die Daten, sowie die Spaltenanzahl des ResultSets aus dem der Vector erstellt wurde.

Nur eine Methode bereitet mir tierisch Kopfschmerzen, nämlich die getValueAt(int,int);

Ich kann nämlich nur einen Index angeben, wenn ich aus einem Vector lesen will, aber nicht mehrere, um wie in diesem Fall das Element in der Spalte x und der Spalte y zu bestimmen...

Meine Lösung sieht im Moment so aus:

public Object getValueAt(int rowIndex, int columnIndex) {

int position;

if (rowIndex!=0)
{
position=rowIndex+1;
position=position*numcols;
position=position+columnIndex;
}
else
position=columnIndex;

return daten.elementAt(position);
}[/PHP]

und hier ist der Konstruktor:

[PHP]public CustomTableModel(Vector daten, Vector spalten, int numcols) {

this.daten=daten;
this.spalten=spalten;
this.numcols=0;

this.numrows=daten.indexOf(daten.lastElement())+1;
this.numcols=spalten.indexOf(spalten.lastElement())+1;

System.out.println(numrows+" "+numcols);


}

Meine Frage warum geht das nicht? Ich bekomme da immer eine ArrayOutOfBoundsException...

Link zu diesem Kommentar
Auf anderen Seiten teilen

3 14

Exception occurred during event dispatching:

java.lang.ArrayIndexOutOfBoundsException: 3 >= 3

java.lang.Throwable(java.lang.String)

java.lang.Exception(java.lang.String)

java.lang.RuntimeException(java.lang.String)

java.lang.IndexOutOfBoundsException(java.lang.String)

java.lang.ArrayIndexOutOfBoundsException(java.lang.String)

java.lang.Object java.util.Vector.elementAt(int)

java.lang.Object gui_v_200.CustomTableModel.getValueAt(int, int)

java.lang.Object javax.swing.JTable.getValueAt(int, int)

java.awt.Component javax.swing.JTable.prepareRenderer(javax.swing.table.TableCellRenderer, int, int)

void javax.swing.plaf.basic.BasicTableUI.paintCell(java.awt.Graphics, java.awt.Rectangle, int, int)

void javax.swing.plaf.basic.BasicTableUI.paintRow(java.awt.Graphics, int)

void javax.swing.plaf.basic.BasicTableUI.paint(java.awt.Graphics, javax.swing.JComponent)

void javax.swing.plaf.ComponentUI.update(java.awt.Graphics, javax.swing.JComponent)

void javax.swing.JComponent.paintComponent(java.awt.Graphics)

void javax.swing.JComponent.paint(java.awt.Graphics)

void javax.swing.JComponent.paintChildren(java.awt.Graphics)

void javax.swing.JComponent.paint(java.awt.Graphics)

void javax.swing.JViewport.paintViaBackingStore(java.awt.Graphics, java.awt.Rectangle)

void javax.swing.JViewport.paint(java.awt.Graphics)

void javax.swing.JComponent.paintChildren(java.awt.Graphics)

void javax.swing.JComponent.paint(java.awt.Graphics)

void javax.swing.JComponent.paintChildren(java.awt.Graphics)

void javax.swing.JComponent.paint(java.awt.Graphics)

void javax.swing.JComponent.paintWithBuffer(javax.swing.JComponent, java.awt.Graphics, java.awt.Rectangle, java.awt.Image)

void javax.swing.JComponent._paintImmediately(int, int, int, int)

void javax.swing.JComponent.paintImmediately(int, int, int, int)

void javax.swing.RepaintManager.paintDirtyRegions()

void javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run()

void javax.swing.SystemEventQueueUtilities.processRunnableEvent(javax.swing.SystemEventQueueUtilities$RunnableEvent)

void javax.swing.SystemEventQueueUtilities.access$0(javax.swing.SystemEventQueueUtilities$RunnableEvent)

void javax.swing.SystemEventQueueUtilities$RunnableTarget.processEvent(java.awt.AWTEvent)

void java.awt.Component.dispatchEventImpl(java.awt.AWTEvent)

void java.awt.Component.dispatchEvent(java.awt.AWTEvent)

void java.awt.EventQueue.dispatchEvent(java.awt.AWTEvent)

boolean java.awt.EventDispatchThread.pumpOneEvent()

void java.awt.EventDispatchThread.pumpEvents(java.awt.Conditional)

void java.awt.EventDispatchThread.run()

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...