Java 如何创建自己的事件。当传感器的值发生变化时,如何调用方法?
我目前正在使用LeJOS Ev3库,并编程了以下侦听器: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
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()。在这两种情况下,你必须保持恒定