1

我有 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);
            }
        });
4

5 回答 5

2

一个听众“打断”另一个听众是没有意义的,因为无论听众做什么都只需要片刻。 对于长时间运行的任务,请创建一个SwingWorker并操作(启动/停止等)该实例。

于 2013-06-19T14:42:31.753 回答
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();
 }
于 2013-06-19T14:15:42.070 回答
1

在仔细阅读了您的答案(非常感谢您)并阅读了一些教程之后,我尝试了一些事情。不过,似乎没有一个完全符合我的要求,但后来我只是从微处理器的角度解决了这个问题,并创建了我自己的设置标志的中断,而不是直接调用该方法。这使 gui 可以自由接收新的输入。它现在工作得很好:)

于 2013-06-24T08:48:50.453 回答
1

如果您使用布尔值,则可以在单击按钮时使其为真。并且只有在它为假时才让其他人执行。所以它不会同时工作。但是您将需要多个布尔值。还是使用System.exit(0);?试试看?

于 2013-06-19T13:59:19.243 回答
1

使用单线程执行器,然后将长时间运行的任务排入其中。如果任务具有优先级,则管理“checkForCancellation”。

于 2013-06-19T14:35:23.110 回答