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

    Schedulare due remoteAction da Dialog.

    Salve a tutti,
    devo eseguire al clic su un Jbutton, due RemoteAction e pensavo di utilizzare la CompositeAction in modo da gestire entrambe le azioni.

    Tuttavia, non capisco perchè al clic sul bottone e al superamento del controllo sulla prima action (nel ciclo for interno), non scatta la seconda Action; per capirci quella evidenziata il grassetto.

    Qualche idea?
    Vi posto il codice.

    codice:
            btnConferma = new JButton(getString("tasto.conferma.titolo"));
            btnChiudi = new JButton(getString("tasto.chiudi.titolo"));
    
    //Test Max inizio
            CompositeAction cActions = new CompositeAction(new LoadSpAccInSpRasAction(rasDip,elencoSpAccSsEst){
    
                private static final long serialVersionUID = 1L;
    
                @Override public void actionPerformed(ActionEvent e) {
                    log.debug("Inizio azione tasto Conferma " + e);
                    
                    //Se l'elenco delle spese accertate contiene almeno una posizione con riferimento
                    //a spese precedenti il mese di compilazione e contestualmente 
                    //flag posponi = N o NULL e giorno del mese = NULL, si segnala all'utente
                    //di specificare il flag (S o N) ed eventualmente la giornata su cui scaricare la spesa
                    boolean errSpAcc = false;
                    String annoMeseSpAcc;
                    String annoMeseRas = String.format("%04d", rasDip.getAnno())+
                                            String.format("%02d", rasDip.getMese());    
                    
                    for (SpesaAccertataDTO spAccDTO : elencoSpAccSsEst){
                        annoMeseSpAcc = spAccDTO.anno+spAccDTO.mese;                    
                        if (annoMeseRas.compareTo(annoMeseSpAcc) != 0) {
                            if ((spAccDTO.posponi.equals("N") || spAccDTO.posponi.equals("")) && 
                                 spAccDTO.rasRiaGiornoVar == null) {
                                errSpAcc = true;
                                break;
                            }
                        }
                    }
                    
                    if (errSpAcc) {
                        JOptionPane.showMessageDialog(DesktopApplicationContext.getInstance().getMainWindow(), 
                                                      new String(getString("msg.spesa.accertata.incompleta")), 
                                                      new String(getString("tasto.conferma.titolo")), 
                                                      JOptionPane.WARNING_MESSAGE);            
                        return;
                    } else {
                        super.actionPerformed(e);
                    }
                    log.debug("Fine azione tasto Conferma");                    
                }
            });        
                    
            cActions.addActionListenerAfter(new RipartisciSpeseAction(rasDip));
            btnConferma.addActionListener(cActions);
    Provare paura per un qualcosa che ti possa capitare nel futuro non ti evita quell'evento,ti fa soltanto vivere un presente sbagliato!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da maximum Visualizza il messaggio
    Tuttavia, non capisco perchè al clic sul bottone e al superamento del controllo sulla prima action (nel ciclo for interno), non scatta la seconda Action; per capirci quella evidenziata il grassetto.
    Cosa è la CompositeAction? (per meglio dire: di chi è, da dove arriva?)
    E LoadSpAccInSpRasAction come è fatta?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Chiedo scusa, ma la CompositeAction è una classe personalizzata che estende la classe Action public class CompositeAction implements Action{...}.

    Tralasciando questo aspetto, il mio obliettivo è schedulare due remote action in sequenza.
    La domanda è, posso fare semplcemente qualcosa del genere?

    codice:
            btnConferma.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    log.debug("Inizio azione tasto Conferma " + e);
                        new LoadAction1().actionPerformed(e);        
                        new LoadAction2().actionPerformed(e);
                    log.debug("Fine azione tasto Conferma");
                }            
            });
    Provare paura per un qualcosa che ti possa capitare nel futuro non ti evita quell'evento,ti fa soltanto vivere un presente sbagliato!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da maximum Visualizza il messaggio
    Chiedo scusa, ma la CompositeAction è una classe personalizzata che estende la classe Action public class CompositeAction implements Action{...}.
    Action è una interfaccia. Quando si vuole creare una action "custom" tipicamente non si implementa direttamente Action ma si estende (per comodità) la classe AbstractAction.

    E comunque Action non rappresenta solo la esecuzione di "qualcosa" ma espone anche altre informazioni, ad esempio tramite il isEnabled() (che serve ad esempio per far sì che un pulsante/menù che ha quella action si abiliti o no a seconda di questa informazione).

    Quindi creare una Action "composita" cosa vuol dire (in tal sensi)? Hai considerato questi aspetti?


    Quote Originariamente inviata da maximum Visualizza il messaggio
    posso fare semplcemente qualcosa del genere?

    codice:
            btnConferma.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    log.debug("Inizio azione tasto Conferma " + e);
                        new LoadAction1().actionPerformed(e);        
                        new LoadAction2().actionPerformed(e);
                    log.debug("Fine azione tasto Conferma");
                }            
            });
    Tecnicamente sì ma è bruttino.


    Se vuoi applicare il Composite Pattern ad ActionListener (che è più semplice di un Action) e che esegua sempre N ActionListener in sequenza, si può fare:

    codice:
    public class CompositeActionListener implements ActionListener {
        private final ActionListener[] listeners;
    
        public CompositeActionListener(ActionListener... listeners) {
            this.listeners = listeners;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            for (ActionListener l : listeners) {
                l.actionPerformed(e);
            }
        }
    }

    btn.addActionListener(new CompositeActionListener(actList1, actList2, actList3));


    Se vuoi che un ActionListener "blocchi" o no condizionalmente la sequenza, va fatto diversamente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se vuoi che un ActionListener "blocchi" o no condizionalmente la sequenza, va fatto diversamente.
    Per favore, puoi chiarirmi meglio questo punto?
    Provare paura per un qualcosa che ti possa capitare nel futuro non ti evita quell'evento,ti fa soltanto vivere un presente sbagliato!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da maximum Visualizza il messaggio
    Per favore, puoi chiarirmi meglio questo punto?
    Se vuoi che un ActionListener possa "bloccare" (o al contrario lasciar continuare) condizionatamente il prossimo ActionListener, allora il CompositeActionListener che ho scritto prima ovviamente non va bene. Perché ciascun ActionListener che passi a CompositeActionListener non "sa" nulla degli altri e non ha alcun appiglio per chiamare/bloccare esplicitamente un altro.
    In teoria potrebbe lanciare una eccezione specifica che potrebbe essere catturata nel actionPerformed del CompositeActionListener. Ma è molto molto brutto. Le eccezioni non dovrebbero essere usate (solo) per il controllo del "flusso".

    Una alternativa è usare il Decorator Pattern.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2024 vBulletin Solutions, Inc. All rights reserved.