2017-02-12 72 views
0

我遇到了一些actionlisteners问题,经过一些搜索后,我在这里找不到任何关于此的信息。从类中删除ActionListener

所以我有一个类“OctetsGraph”,它扩展JPanel并表示一个图,另一个类叫做“DataGenerator”,它实现了ActionListener。 DataGenerator用于运行everey X毫秒并将新数据添加到图形更新的数据集中。

DataGenerator(int interval) 
     { 
      super(interval, null); 
      addActionListener(this); 
     } 

在I绘制在曲线图上的形式,我有一个列表,以及列表上的每个元素被suposed具有“OctetsGraph”。每次更改选定的对象时更新图形都没有问题。我在程序的开始处有一个“OctetsGraph”,我将它设置为null,然后在选择其他元素时创建另一个“OctetsGraph”。问题是,与它关联的actionListener仍然在运行...

我认为actionListneres会简单地停止时,将OctetsGraph对象设置为null,但他们没有。那我该如何解决这个问题?

这是我的列表鼠标按下的事件,它为新对象设置了一个新的八位字节图形和一个新的动作列表器。我究竟做错了什么?

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(); 
} 

有没有一种方法,我可以删除“面板”上活动的actionListeners?

预先感谢您

回答

1

DataGenerator被suposed运行everey X milisecond和新数据添加到数据集从图的更新。

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

然后你需要添加一个方法到你的OcetsGraph类,类似stopTimer()。 (也许你还需要一个startTimer()方法?)

我认为actionListneres只会停止设置OctetsGraph对象时为空

而不是设置对象为空的,你调用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(); 

过程中的“定时器”变量需要是类的实例变量,以便稍后可以引用它。你如何管理这取决于你。我可以根据所提供的信息提供具体的细节。

+0

嗨there @camickr,是的,我使用Timer。对不起,我忘记提到这一点。这个想法很好,但我会如何阻止它?我尝试使用stop,但actionPerformed函数只是不停地重复......停止似乎没有做任何事情。我试图在DataGenerator中调用stopTimer来执行“this.stop()”,但也没有帮助。 –

+0

哦,我想我发现了这个问题......出于某种原因,我没有收到任何听众......不应该这样做吗? “面板”是OctetsGraph对象 DataGenerator [] mls = panel.getListeners(DataGenerator.class); –

+0

@PeterL。,听者与问题无关。当Timer触发时,它会调用您添加到Timer中的Action。所以你需要停止Timer,然后Timer停止调用Action。定时器有一个stop()方法。 – camickr