我在使用动作侦听器时遇到了一些问题,经过一番搜索后,我在这里找不到任何相关信息。
因此,我有一个扩展了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”变量必须是该类的实例变量,因此您以后可以引用它。如何管理这取决于您。我可以根据提供的信息提供具体细节。