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

因此,我有一个扩展了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 Timer安排事件。

然后,您需要向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”变量必须是该类的实例变量,因此您以后可以引用它。如何管理这取决于您。我可以根据提供的信息提供具体细节。

08-28 16:45