Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Creare uno SwingWorker generico

    ciao!

    visto che dovrei impostare diversi SwingWorker all'interno del mio programmino (che ha diversi JFrame), pensavo di crearne uno generico, al quale passare di volta in volta:
    • il metodo del JFrame da lanciare
    • il JDialog da chiudere


    per ora avrei fatto così, ma mi manca come dirgli cosa lanciare:
    codice:
    public class BackgroundOperation extends SwingWorker<Void, Void> {
    
        private JFrame frame;
        private JDialog dialog;
    
        public BackgroundOperation(JFrame frame, JDialog dialog) {
            this.frame = frame;
            this.dialog = dialog;
        }
    
        @Override
        protected Void doInBackground() throws Exception {
            // METODO DA ESEGUIRE
            return null;
        }
    
        @Override
        protected void done() {
            dialog.dispose();
        }
    }
    avete qualche consiglio??

  2. #2
    anticipo una possibile soluzione usando la reflection, così mi magari mi dite se può andare:
    codice:
    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, noparams);
            m.invoke(obj, null);
            return null;
        }
    
        @Override
        protected void done() {
            dialog.dispose();
        }
    }

  3. #3
    Ciao Per fare quello che vuoi fare hai bisogno di usare la reflection.
    http://www.html.it/articoli/reflection-in-java-2/

  4. #4
    Quote Originariamente inviata da francesco.muia Visualizza il messaggio
    Ciao Per fare quello che vuoi fare hai bisogno di usare la reflection.
    http://www.html.it/articoli/reflection-in-java-2/
    ciao!

    mi sa che abbiamo risposto insieme, perchè ho già fatto una prova postata sopr.
    anche se non quanto sia corretta.
    intanto cmq grazie!

  5. #5
    Ad occhio direi che è corretta anche se personalmente mi piace poco l'approccio.
    Io se fossi in te creerei un interfaccia da far implementare la JFrame in modo da evitare l'uso della reflection (che ha un costo prestazionale).
    ES :
    codice:
    public interface SwingOperation{
        public void run();
    
        public JDialog getDialog();
    }
    
    //MIO FRAME
    
    public ... extends JFRAME implements SwingOperation{
    
        //implementa i metodi dell'interfaccia
    }
    
    public class BackgroundOperation extends SwingWorker<Void, Void> {
       BackgroundOperation(SwingOperation op){
          ....
       }
    }

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Una soluzione alternativa, che non usa la Reflection, è quella di usare una banalissima interfaccia.
    Non è detto che tale soluzione sia applicabile o che risponda esattamente alle tue esigenze, comunque la espongo:

    1) Crea un'interfaccia che espone il metodo da invocare
    2) Fai implementare l'interfaccia alle varie classi che estendono JFrame
    3) Nello SwingWorker, invece di passare un riferimento di tipo "JFrame", passa un riferimento di tipo "Interfaccia"
    4) Invoca sul reference il metodo dell'interfaccia.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Una soluzione alternativa, che non usa la Reflection, è quella di usare una banalissima interfaccia.
    Non è detto che tale soluzione sia applicabile o che risponda esattamente alle tue esigenze, comunque la espongo:

    1) Crea un'interfaccia che espone il metodo da invocare
    2) Fai implementare l'interfaccia alle varie classi che estendono JFrame
    3) Nello SwingWorker, invece di passare un riferimento di tipo "JFrame", passa un riferimento di tipo "Interfaccia"
    4) Invoca sul reference il metodo dell'interfaccia.


    Ciao.
    Ha quanto pare la pensiamo allo stesso modo

  8. #8
    Quote Originariamente inviata da francesco.muia Visualizza il messaggio
    Ad occhio direi che è corretta anche se personalmente mi piace poco l'approccio.
    Io se fossi in te creerei un interfaccia da far implementare la JFrame in modo da evitare l'uso della reflection (che ha un costo prestazionale).
    ES :
    codice:
    public interface SwingOperation{
        public void run();
    
        public JDialog getDialog();
    }
    
    //MIO FRAME
    
    public ... extends JFRAME implements SwingOperation{
    
        //implementa i metodi dell'interfaccia
    }
    
    public class BackgroundOperation extends SwingWorker<Void, Void> {
       BackgroundOperation(SwingOperation op){
          ....
       }
    }
    uhm....sicuramente è migliore come approccio.
    ma se all'interno del JFrame dovessi richiamare lo SwingWorker più volte, passandogli ogni volta un metodo differente?
    perchè all'interno del JFrame ho più eventi da mandare in background, ed ogni evento lancia un metodo a se.
    tutto ciò dovrei gestirlo nel run(), giusto??

  9. #9
    Anche no... L'interfaccia la puoi far implementare a qualsiasi oggetto....
    Esempio con inner class...
    codice:
    public ... extends JFRAME{
       class Action1 implement SwingOperation{
         run()
    
         getDialog();
       }
    
       class Action2 implement SwingOperation{
       
         run();
         getDialog();
        }
    
       public void metodo()
       {
         SwingWorker<Void,Void> worker1 = new BackgroundOperation(new Action1());
         SwingWorker<Void,Void> worker2 = new BackgroundOperation(new Action2());
       } 
    }

  10. #10
    Quote Originariamente inviata da francesco.muia Visualizza il messaggio
    Anche no... L'interfaccia la puoi far implementare a qualsiasi oggetto....
    Esempio con inner class...
    codice:
    public ... extends JFRAME{
       class Action1 implement SwingOperation{
         run()
    
         getDialog();
       }
    
       class Action2 implement SwingOperation{
       
         run();
         getDialog();
        }
    
       public void metodo()
       {
         SwingWorker<Void,Void> worker1 = new BackgroundOperation(new Action1());
         SwingWorker<Void,Void> worker2 = new BackgroundOperation(new Action2());
       } 
    }
    ok grazie.
    vedo che riesco a fare seguendo questa strada.
    intanto grazie mille a entrambi!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.