【发布时间】:2015-01-22 16:08:38
【问题描述】:
这么快,我正在做一个演示用于计算机绘图的方法的程序。我需要创建时间线或动作历史记录(例如 placeVertex(x,y)、moveVertex(newX,newY) 等)并迭代(向前和向后、自动或手动)
我已经通过使用命令设计模式实现了这一点,但是这些命令中很少有使用转换。第一个想法是在每个命令之间在setOnFinished 中使用Condition 接口的lock、await 和signal,但这会导致gui 冻结。
我尝试了 SequentialTransition 但这对我的问题没有用 - 无法在转换之间动态更改属性。
是否有可能以某种方式通知生成一个过渡结束并且下一个过渡可以在没有 GUI 冻结和绘制的情况下运行?
谢谢!
编辑:我会尽量简化 这是我的命令界面和以下命令之一:
public interface Command {
public void execute();
}
public class MoveVertex implements Command {
public MoveVertex(Data d, Vertex v, double changedX, double changedY){..};
@Override
public void execute() {
Path path = new Path();
path.getElements().add(new MoveTo(v.getCenterX(), v.getCenterY()));
path.getElements().add(new LineTo(changedX, changedY));
PathTransition pathTransition = new PathTransition();
pathTransition.setDuration(Duration.millis(velocity));
pathTransition.setPath(path);
pathTransition.setNode(v.getVertex());
pathTransition.play(); }
}
这些命令存储在我的历史类中,基本上是
private List<Command> history;
我确实浏览了列表并执行了命令
public boolean executeNext() {
if (history.size() != position) {
history.get(position).execute();
position++;
return true;
}
return false;
}
并且我试图在下一个命令启动时达到状态,只有在上一个完成的情况下。尝试在两者之间放置等待/信号但没有成功。
【问题讨论】:
-
Transition's onFinsihedProperty() 不是为你工作的吗?
-
@ItachiUchiha 不是真的,例如我有一个圆圈,两个路径转换,第一个将圆圈从 0 0 移动到 100 100,第二个将相同的圆圈移动到其他地方,我确实想根据情况更新位置第一步,但即使我将新的
MoveTo位置放入onFinishedProperty()它也不起作用,可能是因为之前已经创建了转换? -
onFinished 对你不起作用有点奇怪,你能在你的问题中包含一个mcve 来复制这个问题吗?使用对相关事件进行操作回调的事件处理程序/属性侦听器是正确的解决方案,使用暂停或休眠 JavaFX 应用程序线程的东西是错误的解决方案。
-
@jewelsea 你好,添加了几行代码。希望对你有帮助
标签: animation javafx transition command-pattern graph-drawing