我有一组名为Marker
的类的实例,它具有Marker#setDelay(double)
方法。基于鼠标拖动调用此方法(您可以拖动标记)。每个标记在配置类中都有一个对应的double
变量。
我想将配置类与标记实例同步。因此,每当调用Marker#setDelay(double)
方法时,配置类中的相应变量也应该更改。我怎么能这样做?
我尝试使用可以应用于标记的Runnables,因此可以从Marker#setDelay(double)
方法中调用runnable,但是此Runnable无法访问延迟值。是否存在某种方法指针workarround?
我的最后一招是每个标记的interface
和匿名实例。但这看起来有点难看......
答案 0 :(得分:2)
JavaFX具有...属性类,您可以绑定它们以接收更改通知。这是一个被低估/监督的UI功能。
所以使用DoubleProperty。 (警告:javadoc不太容易使用。) 请参阅使用here。
答案 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);