Hi,
Ich wollte Daten aus meiner MySQL DB in meine GUI einlesen. Das funktioniert soweit auch super.
Allerdings habe ich nun ein Problem.
Ich habe das auslesen der Daten aus der DB in einen eigenen Thread geschrieben, der in einer while(true) ständig läuft, da sich die Dateninhalte in der DB ständig ändern (z.B.: der Status). Die Daten werden an eine set-Methode übergeben und die GUI holt sich die Daten über die Get-Methode.
Nun bekomme ich aber immer eine ArrayIndexOutOfBoundsException und die Darstellung der Tabelle in der GUI flackert ständig.
Vielleicht weiß jemand Rat.
Hier mal der Code:
code in der GUI-Klasse:
und hier der Thread
Vielleicht findet jemand den Fehler, oder kann mir sagen, was ich machen muß.
Danke
Gruß Niles
Ich wollte Daten aus meiner MySQL DB in meine GUI einlesen. Das funktioniert soweit auch super.
Allerdings habe ich nun ein Problem.
Ich habe das auslesen der Daten aus der DB in einen eigenen Thread geschrieben, der in einer while(true) ständig läuft, da sich die Dateninhalte in der DB ständig ändern (z.B.: der Status). Die Daten werden an eine set-Methode übergeben und die GUI holt sich die Daten über die Get-Methode.
Nun bekomme ich aber immer eine ArrayIndexOutOfBoundsException und die Darstellung der Tabelle in der GUI flackert ständig.
Vielleicht weiß jemand Rat.
Hier mal der Code:
code in der GUI-Klasse:
Code:
public GUI(){
:
:
// Thread zum anzeigen des Tabelleninhaltes starten
TableData tableDataThread = new TableData( m_server );
tableDataThread.start();
slaveStatusTable.setModel( tableDataThread.getTableData() );
slaveStatusTableSP = new JScrollPane( slaveStatusTable,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED );
:
:
}
und hier der Thread
Code:
import java.sql.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.security.*;
import java.lang.*;
import javax.swing.table.DefaultTableModel;
class TableData extends Thread {
private Rttserver server;
private DefaultTableModel dtm ;
TableData( Rttserver server ) {
this.server = server;
dtm = new DefaultTableModel();
}
public void run() {
ResultSet rsSelect;
ResultSetMetaData rsmd;
int columnCount;
int rowCount;
Object [][] oData;
Object [] columnHeaders;
while( true ) {
DBconnect db = new DBconnect();
Connection connection = db.DBconnect( server );
try {
Statement select = connection.createStatement();
rsSelect = select.executeQuery( "SELECT * FROM hardware;" );
rsmd = null; // ein ResultSet
columnCount = -1; // beinhaltet die gezählten columns
try {
rsmd = rsSelect.getMetaData();
columnCount = rsmd.getColumnCount();
}
catch( SQLException e ) { e.printStackTrace(); }
// Prüfen, ob rsmd und columnCount Werte bekommen haben
if ( rsmd == null || columnCount == -1 ) throw new RuntimeException( "ResultSetMetaData is null" );
try {
rsSelect.first();
rsSelect.last();
rowCount = rsSelect.getRow();
boolean hasdata = rsSelect.first();
// die Anzahl der rows und columns dem Datenobjekt zuweisen
oData = new Object[rowCount][columnCount];
columnHeaders = new Object[columnCount];
// Anzahl und Name der Header herrausfinden
for ( int i = 1; i <= columnCount; i++ ) {
columnHeaders[i-1] = rsmd.getColumnName(i);
System.out.println(i);
}
int row = 0;
// Zeilenweise auslesen
while( hasdata ) {
// Anzahl Zeilen und deren Inhalte
for( int i = 1; i <= columnCount; i++ ) {
System.out.print( rsSelect.getString(i) + " " );
oData[row][i-1] = rsSelect.getString(i);
}
row++;
hasdata=rsSelect.next();
}
if (row!=0) { setTableData( oData, columnHeaders ); }
}
catch( SQLException e ) { e.printStackTrace(); }
// Datenbankverbindung schließen
connection.close();
// einfach x Sekunden warten
long time = System.currentTimeMillis(); // Systemzeit
long wait = 2000; // wartezeit
while ( System.currentTimeMillis() <= (time + wait) ) {} // warteschleife
}
catch( SQLException sqle ){}
}
}
/**
* Set-Methode für dtm
*
*********************************************************************************/
public synchronized void setTableData( Object[][] oData, Object[] columnHeaders) {
dtm.setDataVector( oData, columnHeaders );
}
/**
* Get-Methode für dtm. Die GUI holt sich dieses Object.
*
*****************************************************/
public synchronized DefaultTableModel getTableData() {
return this.dtm;
}
}
Vielleicht findet jemand den Fehler, oder kann mir sagen, was ich machen muß.
Danke
Gruß Niles