从 class 中删除 ActionListener
Remove ActionListener from a class
我在使用 actionlisteners 时遇到了一些问题,经过一番搜索后,我在这里找不到任何相关信息。
所以我有一个 class "OctetsGraph" 扩展 JPanel 并表示一个图形,另一个 class 称为 "DataGenerator" 实现 ActionListener。 DataGenerator 应该 运行 每 X 毫秒并将新数据添加到图形更新的数据集中。
DataGenerator(int interval)
{
super(interval, null);
addActionListener(this);
}
在我绘制图表的表格上,我有一个列表,该列表中的每个元素都应该有一个 "OctetsGraph"。每次我更改选定的对象时更新图表是没有问题的。我在程序的开头有一个 "OctetsGraph",我只是将其设置为 null,然后在选择其他元素时创建另一个 "OctetsGraph"。问题是,与之关联的 actionListener 仍然是 运行ning...
我认为当将 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();
}
有什么方法可以删除 "panel" 上活动的 actionListeners?
提前致谢
DataGenerator is suposed to run everey X milisecond and add new data to a dataset that the graph updates from.
所以您应该使用 Swing Timer 来安排活动。
然后您需要向 OcetsGraph 添加一个方法 class,类似于 stopTimer()
。 (也许你还需要一个startTimer()
方法?)
I thought that the actionListneres would simply stop when setting the OctetsGraph object to null
不是将对象设置为 null,而是调用对象的 stopTimer()
方法。一旦 Timer
停止,事件将不再生成,因此处理将停止。
编辑:
首先了解如何start/stop 计时器。然后,当您了解了基础知识后,您就可以修改您的实际应用程序代码:
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" 变量需要是 class 的实例变量,以便您稍后可以引用它。你如何管理这取决于你。我可以根据提供的信息提供具体细节。
我在使用 actionlisteners 时遇到了一些问题,经过一番搜索后,我在这里找不到任何相关信息。
所以我有一个 class "OctetsGraph" 扩展 JPanel 并表示一个图形,另一个 class 称为 "DataGenerator" 实现 ActionListener。 DataGenerator 应该 运行 每 X 毫秒并将新数据添加到图形更新的数据集中。
DataGenerator(int interval)
{
super(interval, null);
addActionListener(this);
}
在我绘制图表的表格上,我有一个列表,该列表中的每个元素都应该有一个 "OctetsGraph"。每次我更改选定的对象时更新图表是没有问题的。我在程序的开头有一个 "OctetsGraph",我只是将其设置为 null,然后在选择其他元素时创建另一个 "OctetsGraph"。问题是,与之关联的 actionListener 仍然是 运行ning...
我认为当将 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();
}
有什么方法可以删除 "panel" 上活动的 actionListeners?
提前致谢
DataGenerator is suposed to run everey X milisecond and add new data to a dataset that the graph updates from.
所以您应该使用 Swing Timer 来安排活动。
然后您需要向 OcetsGraph 添加一个方法 class,类似于 stopTimer()
。 (也许你还需要一个startTimer()
方法?)
I thought that the actionListneres would simply stop when setting the OctetsGraph object to null
不是将对象设置为 null,而是调用对象的 stopTimer()
方法。一旦 Timer
停止,事件将不再生成,因此处理将停止。
编辑:
首先了解如何start/stop 计时器。然后,当您了解了基础知识后,您就可以修改您的实际应用程序代码:
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" 变量需要是 class 的实例变量,以便您稍后可以引用它。你如何管理这取决于你。我可以根据提供的信息提供具体细节。