Hi,
ich möchte gerne die Möglichkeiten des SwingWorkers für mich nutzen, allerdings bekomme ich es einfach nicht realisiert.
Aufgabenstellung ist, dass ich ein JFrame habe, welches durch Drücken eines Buttons den SwingWorker mit Parameterübergabe (extends JFrame) aufruft, dieser die Arbeit aufnimmt und bei Beendigung sich wieder schließt. Darüber hinaus will ich natürlich das Ergebnis seiner Arbeit im JFrame auswerten können, welches ihn aufgerufen hat...
So weit, so gut.
Problem ist der Datenaustausch zwischen den beiden JFrames. Parameterübergabe ist ja kein Ding, aber der Rückgabewert des SwingWorker-JFrames. Wie komme ich da dran?
Als Beispiel habe ich einen Code, der mir ein TableModel zurückgeben soll, welches mit Hilfe der Parameter ColumnNames und die Query erstellt werden soll:
In dieser Klasse rufe ich den Swingworker zum Testen auf, das TableModel, was zurückgegeben wird ist aber immer leer. Eine Ausnahme trat allerdings auf (Warum auch immer) und ich bekam das richtige TableModel:
Ich bekomme es einfach nicht hin, dass das SwingWorker-JFrame geschlossen wird, ich aber das Model zurückbekomme. Wie muss ich den Code so anpassen, dass das alles funktioniert oder habe ich irgendwo einen ganz groben (Anfänger-)Fehler drin?
Vielen Dank schon mal für eure Hilfe
ich möchte gerne die Möglichkeiten des SwingWorkers für mich nutzen, allerdings bekomme ich es einfach nicht realisiert.
Aufgabenstellung ist, dass ich ein JFrame habe, welches durch Drücken eines Buttons den SwingWorker mit Parameterübergabe (extends JFrame) aufruft, dieser die Arbeit aufnimmt und bei Beendigung sich wieder schließt. Darüber hinaus will ich natürlich das Ergebnis seiner Arbeit im JFrame auswerten können, welches ihn aufgerufen hat...
So weit, so gut.
Problem ist der Datenaustausch zwischen den beiden JFrames. Parameterübergabe ist ja kein Ding, aber der Rückgabewert des SwingWorker-JFrames. Wie komme ich da dran?
Als Beispiel habe ich einen Code, der mir ein TableModel zurückgeben soll, welches mit Hilfe der Parameter ColumnNames und die Query erstellt werden soll:
Code:
...
public class SwingWorkerDemo extends JFrame
{
private static final long serialVersionUID = 1L;
private DefaultTableModel model = new DefaultTableModel();
private JLabel label = new JLabel();
private static String user_path = System.getProperty("user.dir");
private String stringQuery = "";
private String[] stringColumnNames = {};
public SwingWorkerDemo(String query, String[] columnNames)
{
stringQuery = query;
stringColumnNames = columnNames;
add( label );
label.setIcon(new ImageIcon(user_path+ "/icons/load.gif"));
new CreateTableModel().execute();
pack();
new Methods.JFrameShower(this);
}
class CreateTableModel extends SwingWorker<DefaultTableModel, Object>
{
@Override public DefaultTableModel doInBackground()
{
DefaultTableModel aModel = new DefaultTableModel();
Connection con;
try {
con = Methods.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(stringQuery);
// TableModel definition
aModel.setColumnIdentifiers(stringColumnNames);
// Loop through the ResultSet and transfer in the Model
final java.sql.ResultSetMetaData rsmd = rs.getMetaData();
int colNo = rsmd.getColumnCount();
while(rs.next()){
Object[] objects = new Object[colNo];
for(int i=0;i<colNo;i++){
objects[i]=rs.getObject(i+1);
}
aModel.addRow(objects);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return aModel;
}
@Override protected void done()
{
try
{
model = get();
}
catch ( /* InterruptedException, ExecutionException */ Exception e ) {
//e.printStackTrace();
}
}
}
public void closeFrame() {
dispose();
}
public DefaultTableModel getModel() {
// TODO Auto-generated method stub
return model;
}
}
In dieser Klasse rufe ich den Swingworker zum Testen auf, das TableModel, was zurückgegeben wird ist aber immer leer. Eine Ausnahme trat allerdings auf (Warum auch immer) und ich bekam das richtige TableModel:
Code:
String test = "SELECT * FROM EXAMPLETABLE;";
String[] test2 = {"col1","col2"};
SwingWorkerDemo demo = new SwingWorkerDemo(test, test2);
DefaultTableModel model = new DefaultTableModel();
model = demo.getModel();
demo.closeFrame();
System.out.println("Column: "+model.getColumnCount());
System.out.println("Row: "+model.getRowCount());
Ich bekomme es einfach nicht hin, dass das SwingWorker-JFrame geschlossen wird, ich aber das Model zurückbekomme. Wie muss ich den Code so anpassen, dass das alles funktioniert oder habe ich irgendwo einen ganz groben (Anfänger-)Fehler drin?
Vielen Dank schon mal für eure Hilfe