繁体   English   中英

从类中删除ActionListener

[英]Remove ActionListener from a class

我在使用动作侦听器时遇到了一些问题,经过一番搜索后,我在这里找不到任何相关信息。

因此,我有一个扩展了JPanel并表示图形的“ OctetsGraph”类,以及另一个实现了ActionListener的名为“ DataGenerator”的类。 假定DataGenerator运行Everey X毫秒,并将新数据添加到图形更新所依据的数据集中。

DataGenerator(int interval) 
        {
            super(interval, null);
            addActionListener(this);
        }

在我绘制图表的表单上,我有一个列表,并且该列表上的每个元素都应具有一个“ OctetsGraph”。 每当我更改选定的对象时都可以更新图。 我在程序的开头有一个“ OctetsGraph”,我只是将其设置为null,然后在选择其他元素时创建了另一个“ OctetsGraph”。 问题是,与其关联的actionListener仍在运行...

我以为,将OctetsGraph对象设置为null时,actionListneres只会停止,但事实并非如此。 那么我该如何解决呢?

这是我的列表鼠标按下事件,它为新对象设置了一个新的八位位组图和一个新的动作列表器。 我究竟做错了什么?

private void jList1MousePressed(java.awt.event.MouseEvent evt) {                                    

   this.panel = new OctetsGraph(60000);

   jPanel2.removeAll();

   javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
   jPanel2.setLayout(jPanel2Layout);
   jPanel2Layout.setHorizontalGroup(
        jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, 20)
            .addComponent(panel)
            .addGap(20, 20, 20))
    );
    jPanel2Layout.setVerticalGroup(
        jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
        .addGroup(jPanel2Layout.createSequentialGroup()
            .addGap(20, 20, 20)
            .addComponent(panel)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, 20))
    );

   jPanel2.revalidate();
   jPanel2.repaint();

    //Listener that fetches data every second
    panel.new DataGenerator(1000).start();
}

有没有办法我可以删除“面板”上活动的actionListener?

先感谢您

假定DataGenerator运行Everey X毫秒,并将新数据添加到图形更新所依据的数据集中。

因此,您应该使用Swing计时器来安排事件。

然后,您需要向OcetsGraph类添加一个方法,如stopTimer() (也许您还需要一个startTimer()方法?)

我以为,将OctetsGraph对象设置为null时,actionListneres只会停止

无需将对象设置为null,而是在对象上调用stopTimer()方法。 一旦Timer停止,将不再生成事件,因此处理将停止。

编辑:

首先学习如何启动/停止计时器。 然后,当您了解基本知识后,便可以修改实际的应用程序代码:

import java.awt.*;
import java.awt.event.*;
import java.util.Date;
import javax.swing.*;

public class SSCCE extends JPanel implements ActionListener
{
    private Timer timer;
    private JLabel label = new JLabel("Press Start");

    public SSCCE()
    {
        setLayout( new BorderLayout(10, 10) );
        add(label, BorderLayout.PAGE_START);


        JButton start = new JButton("Start");
        start.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                startTimer();
            }
        });
        add(start, BorderLayout.LINE_START);

        JButton stop = new JButton("Stop");
        stop.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                stopTimer();
            }
        });
        add( stop );
        add(stop, BorderLayout.LINE_END);

        timer = new Timer(1000, this);
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        label.setText( new Date().toString() );
    }

    private void startTimer()
    {
        timer.start();
    }

    private void stopTimer()
    {
        timer.stop();
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

编辑2:

如果您需要参考,请创建参考:

//panel.new DataGenerator(1000).start();
timer = panel.new DataGenerator(1000);
timer.start();

当然,“ timer”变量必须是该类的实例变量,因此您以后可以引用它。 如何管理这取决于您。 我可以根据提供的信息提供具体细节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM