java - 从类中删除 ActionListener

标签 java swing actionlistener

我在操作监听器方面遇到了一些问题,经过一番搜索后,我在这里找不到任何相关内容。

所以我有一个类“OctetsGraph”,它扩展 JPanel 并表示一个图形,以及另一个名为“DataGenerator”的类,它实现 ActionListener。 DataGenerator 应该每 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();
}

有没有办法可以删除“面板”上 Activity 的actionListeners?

提前谢谢

最佳答案

DataGenerator is suposed to run everey X milisecond and add new data to a dataset that the graph updates from.

所以你应该使用Swing Timer安排 Activity 。

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

I thought that the actionListneres would simply stop when setting the OctetsGraph object to null

您不是将对象设置为 null,而是调用对象的 stopTimer() 方法。一旦定时器停止,事件将不再生成,因此处理将停止。

编辑:

首先了解如何启动/停止计时器。然后,当您了解基础知识后,您可以修改真正的应用程序代码:

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

关于java - 从类中删除 ActionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42191061/

相关文章:

java - 井字棋实现

java - 我需要帮助。我正在编写一个有 GUI 的程序

java - 根据 JComboBox 中的第一项显示项目

java - JTextArea中TAB键功能实现

java - 如何使 JButtons 的这些 JLabels 不可见

java - JComboBox 为一个字符串 ArrayList 添加项目,但为另一个字符串从 GUI 中消失

java - 我认为 java 接口(interface)可以包含一个子类,但可能不在 ActionListener 中......对吗?

java - Java 中的屏幕排列控制

java - 单击 jbutton 后 Swing 框架不保持或停留

java - 如何在Swing中控制JButton?