我在操作监听器方面遇到了一些问题,经过一番搜索后,我在这里找不到任何相关内容。
所以我有一个类“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/