如何让actionListener中断另一个

时间:2013-06-19 13:53:18

标签: java awt actionlistener rcp

我有3个不同的按钮,每个按钮都有一个actionListener。它们都可以工作,但是在执行任务时我无法通过按钮来打断其他人?我希望在按下按钮时删除任务,因此新任务将立即开始。

        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent event1)
            {
                int data1[] = {1100,1000,900,800,700,600,500,400,300,200,100}; 
                String labels2[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"};
                barGraph.changeDataWithEffect(data1, labels2);
            }
        });

        button2.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent event2)
            {
                int data2[] = {1,2,3,4,5,6,7,8,9,10,11}; 
                String labels2[] ={"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"};
                barGraph.changeDataWithEffect(data2, labels2);
            }
        });

        button3.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent event3)
            {
                int data3[] = {10,20,30,40,50,60,50,40,30,20,10};
                String labels3[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"};
                barGraph.changeDataWithEffect(data3, labels3);
            }
        });

5 个答案:

答案 0 :(得分:2)

    button3.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent event3)
        {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    int data3[] = {10,20,30,40,50,60,50,40,30,20,10};
                    String labels3[] = {"1", "2", "3", "4", "5",
                         "6", "7", "8", "9", "10", 
                        "11", "12", "13", "14", "15"};
                    barGraph.changeDataWithEffect(data3, labels3);
                }
            });
        }
    });

第一步是拥有响应式按钮,稍后会执行长动作。查看SwingWorker以了解运行管理。


如果changeDataWithEffect需要很长时间,请创建几个执行工作的对象,并使用原子整数或对此的引用保存“当前”对象。通过检查一个是否是当前的每个步骤,可以中止旧的工作对象。

private class DataChanger {

     private boolean dead() {
         return active.get() != this;
     }
     void process() {
         ...
         if (dead()) return;
         ...
         if (dead()) return;
         ...
     }
}

private AtomicReferce<DataChanger> active = new AtomicReference<>(null);

public changeDataWithEffect(int[] data, String[] labels) {
    DataChanger current = new DataChanger(data, labels);
    SomeChangeDataHandler old = active.set(current);
    // Or old.kill();
    current.process();
 }

答案 1 :(得分:2)

一个侦听器“中断”另一个是没有意义的,因为无论听众做什么都应该只花一点时间。对于长时间运行的任务,创建一个SwingWorker并操纵(开始/停止等)该实例代替。

答案 2 :(得分:1)

如果您使用布尔值,则可以在单击按钮时将其设为true。只有当其他人做错时才让其他人执行。所以它不会同时起作用。但是你需要多个布尔值。或者使用System.exit(0);?试试吧?

答案 3 :(得分:1)

使用Single Thread Executor,然后将长时间运行的任务排入其中。如果任务具有优先权,则管理“checkForCancellation”。

答案 4 :(得分:1)

仔细阅读了你的答案(非常感谢你),并通过一些教程,我尝试了一些事情。似乎没有人完全按照我的意愿行事,但后来我只是从微处理器的视图中解决了问题并创建了我自己设置标志的中断,而不是直接调用方法。这使gui可以自由地接收新的输入。它现在运作得很好:))