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?
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(); }
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");
@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) && i+1 == zahl){ primes++; i = zahl+1; } else if(zahl%i==0){ i = zahl+1; } } } return String.valueOf(zahl); } }