Java SwingWorker e Reflection
In questo articolo, abbiamo visto come creare dei JDialog in ambiente multi-thread con SwingWorker.
Oggi vediamo un esempio simile, ma usando la Reflection.
Il risultato finale è lo stesso, ma il codice è più pulito.
Partiamo dall'evento nel nostro JFrame:
btnConnect.addActionListener((ActionEvent e) -> {
final GenericDialog loading = new GenericDialog(this, "", "Loading...");
BackgroundOperation bo = new BackgroundOperation("com_mattepuffo_book.FormBook", "createConnection", loading);
bo.execute();
loading.setVisible(true);
});
Dove GenericDialog è questo:
public class GenericDialog extends JDialog {
public GenericDialog(JFrame parent, String title, String message) {
super(parent, title, true);
setLocationRelativeTo(parent);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setResizable(false);
setModal(true);
setPreferredSize(new Dimension(200, 120));
JPanel messagePane = new JPanel();
messagePane.add(new JLabel(message));
getContentPane().add(messagePane);
pack();
}
}
Mentre il tutto viene fatto dalla classe BackgroundOperation:
public class BackgroundOperation extends SwingWorker<Void, Void> {
private String frame;
private String method;
private JDialog dialog;
public BackgroundOperation(String frame, String method, JDialog dialog) {
this.frame = frame;
this.method = method;
this.dialog = dialog;
}
@Override
protected Void doInBackground() throws Exception {
Class[] noparams = {};
Class cls = Class.forName(frame);
Object obj = cls.newInstance();
Method m = cls.getDeclaredMethod(method, params);
m.invoke(obj, null);
return null;
}
@Override
protected void done() {
dialog.dispose();
}
}
Al costruttore passiamo questi parametri:
- il nome del JFrame da cui parte tutto
- il nome del metodo da lanciare in background
- il JDialog da visualizzare
Nel metodo doInBackground viene usata la Reflection per richiamare il metodo del JFrame.
Attraverso l'array di Class[], possiamo anche impostare eventuali parametri nel caso in cui il metodo da lanciare lo richieda.
Nel mio caso, quello più semplice, il metodo non ha parametri.
Enjoy!
java swingworker reflection jframe jdialog doinbackground
Commentami!