【问题标题】:Passing changing variable value between classes with listeners在具有侦听器的类之间传递变化的变量值
【发布时间】:2013-12-16 16:22:12
【问题描述】:

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

JFRAME 类

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 类中创建第一个面板的类

public class MapaSwiata extends JPanel{

Generator gs;

public MapaSwiata(){
    //...

    gs = new Generator(this);

            //...
}
}

CLASS 生成器(带有需要观察变化的 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. 将我的班级Generator 中的sampleArray 传递到此面板进行打印的最佳方法是什么 2. where/how/what listeners 让他通知我上一堂课MapaSwiata中创建的对象的变化

【问题讨论】:

    标签: java events arraylist listener parameter-passing


    【解决方案1】:

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

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

    就像您将 ActionListener 注册到 JButton 一样,此 JButton 每次单击时都会通知其所有侦听器。

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

    【讨论】:

    • 据我了解,修改列表后,我需要在我的 ClassA listener.actionPerformed(new ActionEvent(this, 1, "update")); 中进行类似操作,其中 listenerActionEvent 类型。我还需要做addListener() 函数,然后在我的ClassB 中创建一个对象ClassA,它实现ActionPerformed。然后在我的对象上使用我的addListener() 函数来等待信号。我对么?你能帮我解决一下这种情况吗?
    • 没有。 ClassB 必须有一个addXxxListener(XxxListener listener) 方法。每次在 ClassB 中更改列表时,您都必须遍历所有侦听器并调用它们的方法。 ClassA 必须创建 XxxListener 的实例并使用此侦听器调用 classB.addXxxListener()。我不会为此使用 ActionListener 。 ListDataListener 甚至只是一个 ChangeListener 会更合适。查看 EventListenerList 的 javadoc,了解如何在 ClassB 中轻松注册和调用监听器。
    • 阅读了 1 小时的示例,但仍然一无所获。在我看来,ClassB 应该在您的建议中与 ClassA 交换。但可能我不太理解。你能给我写一些适合我情况的例子吗?顺便说一句,我读到了关于观察者的文章,但我知道它们是否适合我的问题
    • 哦,对不起。我不匹配你的两个课程。你说得对。保存列表 (ClassA) 的类必须有一个 addXxxListener 方法。而想要监听列表变化的类(ClassB)必须创建一个监听器并将其添加到ClassA实例中。
    • 您需要引用 ClassA 实例(或 ClassC 实例)才能从中读取值并将其显示在面板中,正如您的问题所说。所以,给这个实例添加一个监听器。谁创建这个实例并不重要。你的问题开始变得越来越混乱。您为什么不编辑您的问题并将您的实际代码粘贴到那里?
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多