如何在对象类中的变量更改上创建事件

时间:2011-11-17 13:46:42

标签: java events class variables listener

我坚持按照以下简单示例的方式实施某些内容 -

public class SimpleClass
{
    int test=0;
    AnotherClass anotherClass= new AnotherClass();

    public SimpleClass()
    {

    }

    public static void main(String[] args) 
        {
        SimpleClass simpleClass = new SimpleClass();
    }
}

public class AnotherClass
{
    int value=5;

    .
    .
    .
}

每当'anotherClass'中的值发生变化时,我想让'test'(比如说)增加1(anotherClass可能会从datafeed或类似的东西中获取信息)。我能找到的所有oracle事件文档都指的是swing组件。我在网上找到了类似的求助请求,但答案似乎没有解决这个问题。

感谢您提供的任何帮助! ç

=============================================== ===================================

添加 - (抱歉,它不适合回复评论框)

感谢您的建议。但是如果我有一个A类,其中有另一个B类作为一个字段,我想(1)监听B类字段中的变化(比如int var),并且(2)检测到这些变化。类A的级别使得结果事件触发了A类中的方法,对我来说这种方法不起作用是不明显的。

如果我把我的听众放在A班,我不能指定从这里听“B.var”的变化。相反,如果我将我的监听器放在B类(这是A类的一个字段)中,那么它将能够检测到var中的变化,但是我怎么能够在A类中触发它并进行更改,因为B坐在在A级作为一个领域,并没有“意识到”A级的存在?

一种解决方案是将B的所有字段和方法合并到A中。但是,最终我希望将B作为静态类并且具有许多不同的A,每个A在B中监听稍微不同的事件。我脑子里想到的画面是很多不同的人在听这个比例,这是播放很多不同的词。每个人都在注意他自己的特定词汇来自收音机,每次他们的话发生时,他们都会检查他们的墙壁(或增加他们的一些场地......)

谢谢!

2 个答案:

答案 0 :(得分:1)

想想在Swing中解决这个问题的方法。这是观察者模式。

class A implements ChangeListener{

    private B aB;

    public A(){
        aB = new B();
        aB.addListener(this);
    }

    public void thingyChanged(String newThingy){
        System.out.println("Thingy changed to:" + newThingy);
    }
}

class B {

    private Collection<ChangeListener> listeners = new LinkedList<ChangeListener>();

    public B(){}

    public void addListener(ChangeListener listener){
        listeners.add(listener)
    }

    public void changeThingy(String newThingyVal){
        doSomething(newThingyVal);
        for(ChangeListener listener:listeners){
            listener.thingyChanged(newThingyVal);
        }
    }

}

interface ChangeListener{
    public void thingChanged(String newThingy);
}

注意:没有编译这个或任何东西。

这称为观察者模式。您正在使用界面来创建回调。

http://en.wikipedia.org/wiki/Observer_pattern

答案 1 :(得分:0)

一个选项可能是将您的类实现为JavaBean,然后实现PropertyChangeListener

快速浏览一下这项技术。

http://www.kodejava.org/examples/343.html