使用侦听器在类之间传递变量值

时间:2013-11-30 17:19:27

标签: java events arraylist listener parameter-passing

正如你建议我改写我的问题。这是我的问题。我有框架,增加了2个面板。在第一个面板中,我创建了一个Generator对象。在类Generator中,我有对象列表和计时器,它调用函数addItem(),它将新对象添加到我的列表中。第二个面板(在框架中创建)需要打印我的数组中包含的对象列表。如果这些阵列会改变,那么这个面板需要自动修复。如果看起来太混乱,请查看代码片段

使用JFRAME CLASS

public class MainFrame extends JFrame{
    private MapaSwiata mapa;
    private MyPanel myPanel;

    public MainFrame(){
    //....
    JPanel panel = new JPanel(new BorderLayout());
    this.getContentPane().add(panel);

    mapa = new MapaSwiata();
    myPanel = new MyPanel(); 

    panel.add(mapa,BorderLayout.CENTER);
    panel.add(menu,BorderLayout.EAST);  
    //...
}

使用在JFrame类

中创建的第一个面板进行CLASS
public class MapaSwiata extends JPanel{

Generator gs;

public MapaSwiata(){
    //...

    gs = new Generator(this);

            //...
}
}

CLASS Generator(带有需要更改的ArrayList)

public class Generator{

ArrayList<Object> sampleArray;

public Generator(JPanel p){
    this.s = new ArrayList<Samolot>();
       this.p = p;
      generatorTimer = new Timer(40, new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
                  addItem();
                  p.repaint();
          }
        });
        generatorTimer.start();
   }
    public addItem(){
      //....
    }
 }

最后一个类CLASS MyPanel - 面板,当我的ArrayList被更改时需要重新绘制

public class MyPanel extends JPanel{
JLabel label1;
public MyPanel(){

    // to do:
            // print a ArrayList<Object> sampleArray here in JLabels
            // if sampleArray has been changed - my panel repaints itself
    }
}

所以我的问题是: 1.将sampleArray从我的班级Generator传递到此面板以打印它的最佳方法是什么 2.在哪里/如何/用什么听众让他通知我上一堂课关于MapaSwiata

中创建的对象的变化

1 个答案:

答案 0 :(得分:1)

AWT和Swing使用事件来处理它。你应该在ClassA中有一个允许注册事件监听器的方法。每次在ClassA实例中修改列表时,都应修改已注册的侦听器。

所以ClassB应该注册一个ClassA实例的监听器,这个监听器应该通过从ClassA实例中获取修改后的列表来更新面板。

就像你将一个ActionListener注册到一个JButton一样,这个JButton每次点击都会通知所有的听众。

阅读http://docs.oracle.com/javase/tutorial/uiswing/events/index.html