Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建自己的事件。当传感器的值发生变化时,如何调用方法?_Java_Events_Observer Pattern_Listeners_Lejos Nxj - Fatal编程技术网

Java 如何创建自己的事件。当传感器的值发生变化时,如何调用方法?

Java 如何创建自己的事件。当传感器的值发生变化时,如何调用方法?,java,events,observer-pattern,listeners,lejos-nxj,Java,Events,Observer Pattern,Listeners,Lejos Nxj,我目前正在使用LeJOS Ev3库,并编程了以下侦听器: import lejos.hardware.port.Port; import robots.ev3.drive.parts.LightSensor; public abstract class LightListener { protected int trigger; protected boolean dark; public LightListener(i

我目前正在使用LeJOS Ev3库,并编程了以下侦听器:

    import lejos.hardware.port.Port;
    import robots.ev3.drive.parts.LightSensor;

    public abstract class LightListener {
        protected int trigger;
        protected boolean dark;

        public LightListener(int triggerLevel) { trigger = triggerLevel; }
        public void notify(LightSensor s) {
            // Depending on the value that s measures, either the method
            // dark or bright is called
        }
        public void initialValue(int level) {
            dark = level < trigger;
        }

        abstract public void bright(Port port, int level);
        abstract public void dark(Port port, int level);
    }
但是,再一次,我甚至不知道是否可以等待事件发生(不需要不断检查值)


编辑-由于反复向我建议,我将提到我已经在我的LightSensor上添加了一个名为addLightListener(LightListener listener)的方法。这并不能解决我避免轮询的问题。

不熟悉该库,但您的两个基本选项是轮询(您到目前为止已经尝试过的)或使用

在观察者模式中,当事件发生时,您将通知已注册到提供程序的所有类

class ObserveMe {
    List<Observer> observers = new ArrayList<>();

    public updateSensorValue(){
        //do what you need to
        for(Observer observer : observers){
            observer.notify();
        }
    }

    public void addObserver(Observer o){
        this.observers.add(o);
    }
}

interface Observer {
    public void notify();
}
class-ObserveMe{
列表观察者=新的ArrayList();
公共更新传感器值(){
//做你需要做的事
观察员(观察员:观察员){
observer.notify();
}
}
公众观察员(观察员o){
本条增补(o);
}
}
界面观察者{
公开无效通知();
}

不熟悉该库,但您的两个基本选项是轮询(到目前为止您已经尝试过的)或使用

在观察者模式中,当事件发生时,您将通知已注册到提供程序的所有类

class ObserveMe {
    List<Observer> observers = new ArrayList<>();

    public updateSensorValue(){
        //do what you need to
        for(Observer observer : observers){
            observer.notify();
        }
    }

    public void addObserver(Observer o){
        this.observers.add(o);
    }
}

interface Observer {
    public void notify();
}
class-ObserveMe{
列表观察者=新的ArrayList();
公共更新传感器值(){
//做你需要做的事
观察员(观察员:观察员){
observer.notify();
}
}
公众观察员(观察员o){
本条增补(o);
}
}
界面观察者{
公开无效通知();
}

您必须注册并将您的
LightListener
连接到传感器,以便传感器在每次灯光变化时调用您的监听器。这样,在通知时,您只需验证
LightSensor
的值并相应地采取行动。@aribeiro这听起来像是一个有效的答案,可能需要一个小的代码示例。@aribeiro我已经创建了一个名为LightSensor的类,您可以将LightListener附加到该类。但是,没有从超类(NXTLightSensor)继承的方法,在值更改时可以使用该方法调用方法。所以它不能解决我的问题。@aribeiro这就是我不知道怎么做的。如何使光传感器在值发生变化时调用方法,而不定期检查传感器测量的值并将其与前一个值进行比较?从leJOS wiki上的示例中,它被用作
while(true)
按照@N.Pich的建议获取样本。您必须注册并将
LightListener
连接到传感器,以便传感器在每次光线变化时调用您的监听器。这样,在通知时,您只需验证
LightSensor
的值并相应地采取行动。@aribeiro这听起来像是一个有效的答案,可能需要一个小的代码示例。@aribeiro我已经创建了一个名为LightSensor的类,您可以将LightListener附加到该类。但是,没有从超类(NXTLightSensor)继承的方法,在值更改时可以使用该方法调用方法。所以它不能解决我的问题。@aribeiro这就是我不知道怎么做的。如何使光传感器在值发生变化时调用方法,而不定期检查传感器测量的值并将其与前一个值进行比较?从leJOS wiki上的示例中,它被使用
while(true)
来获取@N.Pich建议的样本。我已经这样做了。它的问题是,您需要不断调用方法updateSensorValue(),在这种情况下,如果当前值与以前测量的值不同,则只会通知侦听器;或者,您必须运行while循环,如果当前值与以前的值不同,则只会调用updateSensorValue()。在这两种情况下,您必须经常定期检查传感器测量的值,以决定是否调用notify()方法。不过,还是要感谢您的回答。@N.Pich-听起来好像您正在尝试轮询光传感器,并查看值何时变化-这几乎与观察者模式相反。在观察者模式中,LightListener需要向LightSensor注册,并且LightSensor会在值发生变化时通知LightListener。LightListener将是订阅者/观察者,LightSensor将是发布者(上面的ObserveMe类),正如我反复声明的那样,我不想轮询传感器以检查当前值是否。。。我想做的是您建议的:LightSensor仅在值更改时才在其侦听器上调用notify()。但是,我不知道如何做到这一点,您描述的类也没有做到这一点,因为我必须自己调用updateSensorValue()方法。我的问题是:有没有一种方法可以让LightSensor仅在值更改时调用notify(),而不与其他值进行比较,就像单击鼠标时自动发生ActionEvent一样?如果无法直接修改LightSensor类以实现observer模式,您可以扩展它并添加LightListener列表。然后创建一个新方法“ObservateGetSensorValue()”,该方法调用原始的LightSensor“getSensorValue()”,然后通知所有已注册的LightListener。光传感器还需要保留上次读取的值,以便您可以检测下一次读取是否有变化。我已经这样做了。它的问题是,您需要不断调用方法updateSensorValue(),在这种情况下,如果当前值与以前测量的值不同,则只会通知侦听器;或者,您必须运行while循环,如果当前值与以前的值不同,则只会调用updateSensorValue()。在这两种情况下,你必须保持恒定