Home / Programmazione / Java / Java SwingWorker e Reflection
Mattepuffo

Java SwingWorker e Reflection

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!