通过监听器一般更改变量

时间:2014-08-14 08:50:37

标签: java listener function-pointers

我有一组名为Marker的类的实例,它具有Marker#setDelay(double)方法。基于鼠标拖动调用此方法(您可以拖动标记)。每个标记在配置类中都有一个对应的double变量。

我想将配置类与标记实例同步。因此,每当调用Marker#setDelay(double)方法时,配置类中的相应变量也应该更改。我怎么能这样做?

我尝试使用可以应用于标记的Runnables,因此可以从Marker#setDelay(double)方法中调用runnable,但是此Runnable无法访问延迟值。是否存在某种方法指针workarround?

我的最后一招是每个标记的interface和匿名实例。但这看起来有点难看......

3 个答案:

答案 0 :(得分:2)

JavaFX具有...属性类,您可以绑定它们以接收更改通知。这是一个被低估/监督的UI功能。

所以使用DoubleProperty。 (警告:javadoc不太容易使用。) 请参阅使用here

  • 拥有DoubleProperty
  • addListener new ChangeListener with ObservableValue DoubleProperty

答案 1 :(得分:2)

这里的一般现成模式很简单:引入类似MarkerListener的界面。然后,您可以创建一个(可能是匿名的)MarkerListener实现来更新您的配置,并将其添加到相应的“标记”。

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

interface MarkerListener
{
    void delayChanged(double oldDelay, double newDelay);
}

class Marker
{
    private double delay;

    private final List<MarkerListener> markerListeners = 
        new CopyOnWriteArrayList<MarkerListener>();

    void addMarkerListener(MarkerListener markerListener)
    {
        markerListeners.add(markerListener);
    }

    void removeMarkerListener(MarkerListener markerListener)
    {
        markerListeners.add(markerListener);
    }

    void setDelay(double newDelay)
    {
        if (newDelay != this.delay)
        {
            double oldDelay = this.delay;
            this.delay = newDelay;
            fireDelayChanged(oldDelay, newDelay);
        }

    }

    private void fireDelayChanged(double oldDelay, double newDelay)
    {
        for (MarkerListener markerListener : markerListeners)
        {
            markerListener.delayChanged(oldDelay, newDelay);
        }
    }
}

当然,这涉及一些代码膨胀。它基本上是一种简约的实现,当使用Joop Eggen在他的回答中提到的来自JavaFX的DoubleProperty时也可以实现。因此,您可能需要考虑使用DoubleProperty。 (人们也可以用PropertyChangeListeners来解决这个问题,但这些可能不太合适了。)

由于您提到了“函数指针”:您还可以使用DoubleConsumer实例而不是引入自己的接口。但是,从这个问题来看,这是否是最好的解决方案是不可能的。

答案 2 :(得分:1)

我没有完全理解这个问题。 无论如何,这是我的解决方案

创建一个监听器

public interface MarkerChangeListener{
      void markerChanged(double value);
}

使用侦听器实现Config类

    public class Config implements MarkerChangeListener{

        private double delay;

        @override
        public void markerChanged(double value){
             this.delay = value;
         }

         .... 

   }

向Marker类添加一个方法,以便在更新值时添加侦听器并触发侦听器

    public class Marker{

    private MarkerChangeListener listener;

    public void addListener(MarkerChangerListener listener){

         this.listener = listener;

    }

    public void setDelay(double delay){
    this.delay = delay;
    listener.markerChanged(delay)
    }

}

将侦听器添加到您创建标记的Marker类中。

marker.addListener(config);