Stopping Action Listener Queue












3















I Have this:



public void actionPerformed1(ActionEvent e) { ... }
public void actionPerformed2(ActionEvent e) { ... }
public void actionPerformed3(ActionEvent e) { ... }

JButton b = new JButton();

b.addActionListener(this::actionPerformed1);
b.addActionListener(this::actionPerformed2);
b.addActionListener(this::actionPerformed3);



The code always executes action 3, then 2 and 1 in that order.




Is it possible to stop the execution of the queue without throwing a run time exception?



Thanks for your time.










share|improve this question


















  • 1





    Sure, just add a flag whether further listeners should be executed and check it in the listener methods.

    – daniu
    Nov 28 '18 at 21:20
















3















I Have this:



public void actionPerformed1(ActionEvent e) { ... }
public void actionPerformed2(ActionEvent e) { ... }
public void actionPerformed3(ActionEvent e) { ... }

JButton b = new JButton();

b.addActionListener(this::actionPerformed1);
b.addActionListener(this::actionPerformed2);
b.addActionListener(this::actionPerformed3);



The code always executes action 3, then 2 and 1 in that order.




Is it possible to stop the execution of the queue without throwing a run time exception?



Thanks for your time.










share|improve this question


















  • 1





    Sure, just add a flag whether further listeners should be executed and check it in the listener methods.

    – daniu
    Nov 28 '18 at 21:20














3












3








3








I Have this:



public void actionPerformed1(ActionEvent e) { ... }
public void actionPerformed2(ActionEvent e) { ... }
public void actionPerformed3(ActionEvent e) { ... }

JButton b = new JButton();

b.addActionListener(this::actionPerformed1);
b.addActionListener(this::actionPerformed2);
b.addActionListener(this::actionPerformed3);



The code always executes action 3, then 2 and 1 in that order.




Is it possible to stop the execution of the queue without throwing a run time exception?



Thanks for your time.










share|improve this question














I Have this:



public void actionPerformed1(ActionEvent e) { ... }
public void actionPerformed2(ActionEvent e) { ... }
public void actionPerformed3(ActionEvent e) { ... }

JButton b = new JButton();

b.addActionListener(this::actionPerformed1);
b.addActionListener(this::actionPerformed2);
b.addActionListener(this::actionPerformed3);



The code always executes action 3, then 2 and 1 in that order.




Is it possible to stop the execution of the queue without throwing a run time exception?



Thanks for your time.







java






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 28 '18 at 19:45









Luis VásquezLuis Vásquez

486




486








  • 1





    Sure, just add a flag whether further listeners should be executed and check it in the listener methods.

    – daniu
    Nov 28 '18 at 21:20














  • 1





    Sure, just add a flag whether further listeners should be executed and check it in the listener methods.

    – daniu
    Nov 28 '18 at 21:20








1




1





Sure, just add a flag whether further listeners should be executed and check it in the listener methods.

– daniu
Nov 28 '18 at 21:20





Sure, just add a flag whether further listeners should be executed and check it in the listener methods.

– daniu
Nov 28 '18 at 21:20












1 Answer
1






active

oldest

votes


















2














I think you cannot stop it without using an Exception. If you look at the code in JButton which gets executed when its firing an ActionEvent (s.b.), you see that its just iterating in a for loop over a copy of the array of registered ActionListeners.
So you can try within the callback methods to unregister all Actionlisteners but this does not help since the loop uses a local copy. And you cannot increment the variable i from the callback neither.



protected void fireActionPerformed(ActionEvent e)
{
// Dispatch a copy of the given ActionEvent in order to
// set the source and action command correctly.
ActionEvent ae = new ActionEvent(
this,
e.getID(),
getActionCommand(),
e.getWhen(),
e.getModifiers());

ActionListener listeners = getActionListeners();

for (int i = 0; i < listeners.length; i++) //no way to prematurely terminate this loop
listeners[i].actionPerformed(ae);
}


However you can use a common variable in your class to signal in your callback methods, that they should just return, but this would not avoid their execution, but rather execute code which just decides to prematurely return.






share|improve this answer


























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53526994%2fstopping-action-listener-queue%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    2














    I think you cannot stop it without using an Exception. If you look at the code in JButton which gets executed when its firing an ActionEvent (s.b.), you see that its just iterating in a for loop over a copy of the array of registered ActionListeners.
    So you can try within the callback methods to unregister all Actionlisteners but this does not help since the loop uses a local copy. And you cannot increment the variable i from the callback neither.



    protected void fireActionPerformed(ActionEvent e)
    {
    // Dispatch a copy of the given ActionEvent in order to
    // set the source and action command correctly.
    ActionEvent ae = new ActionEvent(
    this,
    e.getID(),
    getActionCommand(),
    e.getWhen(),
    e.getModifiers());

    ActionListener listeners = getActionListeners();

    for (int i = 0; i < listeners.length; i++) //no way to prematurely terminate this loop
    listeners[i].actionPerformed(ae);
    }


    However you can use a common variable in your class to signal in your callback methods, that they should just return, but this would not avoid their execution, but rather execute code which just decides to prematurely return.






    share|improve this answer






























      2














      I think you cannot stop it without using an Exception. If you look at the code in JButton which gets executed when its firing an ActionEvent (s.b.), you see that its just iterating in a for loop over a copy of the array of registered ActionListeners.
      So you can try within the callback methods to unregister all Actionlisteners but this does not help since the loop uses a local copy. And you cannot increment the variable i from the callback neither.



      protected void fireActionPerformed(ActionEvent e)
      {
      // Dispatch a copy of the given ActionEvent in order to
      // set the source and action command correctly.
      ActionEvent ae = new ActionEvent(
      this,
      e.getID(),
      getActionCommand(),
      e.getWhen(),
      e.getModifiers());

      ActionListener listeners = getActionListeners();

      for (int i = 0; i < listeners.length; i++) //no way to prematurely terminate this loop
      listeners[i].actionPerformed(ae);
      }


      However you can use a common variable in your class to signal in your callback methods, that they should just return, but this would not avoid their execution, but rather execute code which just decides to prematurely return.






      share|improve this answer




























        2












        2








        2







        I think you cannot stop it without using an Exception. If you look at the code in JButton which gets executed when its firing an ActionEvent (s.b.), you see that its just iterating in a for loop over a copy of the array of registered ActionListeners.
        So you can try within the callback methods to unregister all Actionlisteners but this does not help since the loop uses a local copy. And you cannot increment the variable i from the callback neither.



        protected void fireActionPerformed(ActionEvent e)
        {
        // Dispatch a copy of the given ActionEvent in order to
        // set the source and action command correctly.
        ActionEvent ae = new ActionEvent(
        this,
        e.getID(),
        getActionCommand(),
        e.getWhen(),
        e.getModifiers());

        ActionListener listeners = getActionListeners();

        for (int i = 0; i < listeners.length; i++) //no way to prematurely terminate this loop
        listeners[i].actionPerformed(ae);
        }


        However you can use a common variable in your class to signal in your callback methods, that they should just return, but this would not avoid their execution, but rather execute code which just decides to prematurely return.






        share|improve this answer















        I think you cannot stop it without using an Exception. If you look at the code in JButton which gets executed when its firing an ActionEvent (s.b.), you see that its just iterating in a for loop over a copy of the array of registered ActionListeners.
        So you can try within the callback methods to unregister all Actionlisteners but this does not help since the loop uses a local copy. And you cannot increment the variable i from the callback neither.



        protected void fireActionPerformed(ActionEvent e)
        {
        // Dispatch a copy of the given ActionEvent in order to
        // set the source and action command correctly.
        ActionEvent ae = new ActionEvent(
        this,
        e.getID(),
        getActionCommand(),
        e.getWhen(),
        e.getModifiers());

        ActionListener listeners = getActionListeners();

        for (int i = 0; i < listeners.length; i++) //no way to prematurely terminate this loop
        listeners[i].actionPerformed(ae);
        }


        However you can use a common variable in your class to signal in your callback methods, that they should just return, but this would not avoid their execution, but rather execute code which just decides to prematurely return.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 28 '18 at 22:00

























        answered Nov 28 '18 at 21:16









        MaksimMaksim

        46648




        46648
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53526994%2fstopping-action-listener-queue%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

            Calculate evaluation metrics using cross_val_predict sklearn

            Insert data from modal to MySQL (multiple modal on website)