| 

.NET C# Java Javascript Exception

1
Ein JPanel soll Daten von einer MySql-DB anzeigen. Nachdem das Holen der Daten lange braucht, erledigt dies ein eigener Task (Swing Worker). Wenn ich im Aufbau des JPanel den Task aufrufe, was passiert dann am Ende des Tasks? Sprich, wie komme ich wieder zurück zum Aufbau des JPanels und habe dort die Daten der MySql?
21.01.2012
1 Antwort
0
Hallo,
der Swingworker ist aufgeteilt in 2 Teile:

  • doInBackground()
  • done()


Der Teil von doInBackground() wird in einem eigenen Thread ausgeführt. Sobald dieser fertig ist, wird done() aufgerufen. Über get() bekommt du innerhalb von done() den zurückgegebenen Wert von doInBackground().
done() ist wiederum immer im EDT-Thread.

Ein einfaches Beispiel könnte so aussehen (Quelle):

SwingWorker worker = new SwingWorker<List, Void>() {

public List doInBackground() {
List list = getBigListAfterExecutingForLongTime();
return intDoc;
}

public void done() {
List list = get();
updateTheUIWithThisBigList(list);
}

};

public void actionPerformed(ActionEvent ae){
worker.execute();
}


Oder hier noch ein komplettes Beispiel (Quelle):

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingWorker;

public class Demo1WithSwingWorker extends JFrame implements ActionListener{
JLabel jlabe_text,jlabe_result;
JTextField jtext_input;
JButton jbutt_calc;
SwingWorker<String, Void> worker;
String theresult;


/**
* Init the GUI elements
*/
public void initComponents(){
jlabe_text = new JLabel("Calculate prime:");
jtext_input = new JTextField();
jlabe_result = new JLabel();
jbutt_calc = new JButton("Calc");
jbutt_calc.addActionListener(this);
jbutt_calc.setActionCommand("calc");

getContentPane().setLayout(new GridLayout(1,4));
getContentPane().add(jlabe_text);
getContentPane().add(jtext_input);
getContentPane().add(jbutt_calc);
getContentPane().add(jlabe_result);

pack();
setSize(400,60);
setVisible(true);
}


public void actionPerformed(ActionEvent evt){
String cmd = evt.getActionCommand();
if(cmd.equalsIgnoreCase("calc")){ // calc button pressed
// Construct a new SwingWorker
worker = new SwingWorker<String, Void>(){

@Override
protected String doInBackground(){
return getXPrime(Integer.parseInt(jtext_input.getText()));
}

@Override
protected void done(){
try {
jlabe_result.setText(get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
};
// Execute the SwingWorker; the GUI will not freeze
worker.execute();
}
}


public static void main(String[] args) {
new Demo1WithSwingWorker().initComponents();
}


/**
* The time consuming method. For this example it's not important
* how this method works.
* Given a number n this method calculates the n th prime
* e.g. given n = 5 the 5th prime is 11
* @param the n th prime to be calculated
* @return the prime
*/
public String getXPrime(int n){
int primes = 1;
int zahl = 2;
while(primes != n){
zahl++;
for(int i=2;i<zahl;i++){
if(!(zahl%i==0) &amp;&amp; i+1 == zahl){
primes++;
i = zahl+1;
}
else if(zahl%i==0){
i = zahl+1;
}
}
}
return String.valueOf(zahl);
}
}



Ich hoffe das hilft Dir weiter.
21.01.2012
Phil 61 2

Stelle deine Java-Frage jetzt!