gpt4 book ai didi

java - 从类中删除 ActionListener

转载 作者:行者123 更新时间:2023-12-01 08:53:46 25 4
gpt4 key购买 nike

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

所以我有一个类“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com