在使用JavaFX(Java8)工作一段时间之后,我发现Properties的概念非常有用,允许使用bean兼容变量绑定以使用计算树更新更改,例如:
class Person {
StringProperty name;
...
}
Run Code Online (Sandbox Code Playgroud)
Person owner;
Person human;
owner.name().bind(human.name());
Run Code Online (Sandbox Code Playgroud)
这允许将GUI控件绑定到"模型",以自动更新更改.
所以我也开始Property<T>在模型中使用该类(我的数据对象正在进行我的功能操作).但JavaFX是一个单线程GUI实现,只有在JavaFX线程中完成时,才允许设置链接到某些GUI控件的属性.否则将抛出异常:
Exception in thread "Thread-5" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-5
Run Code Online (Sandbox Code Playgroud)
如果我现在开始编写多线程代码,我终于无法使用这些属性,即使我愿意.我无法承担将Platform.runLater()调用中的每个更改封装到JavaFX线程中的能力.
为什么JavaFX不提供线程安全的Property-Binding?(或者是吗?)
我正在尝试使用zoomable/pannable画布创建一个应用程序.
特点:
只要您开始按比例缩放,缩放点就会起作用.将鼠标放在网格点上并滚动鼠标滚轮.枢轴点将保持开始缩放的位置.
问题:
放大时,然后将鼠标移动到另一个点并再次缩放,然后移动枢轴点并在初始鼠标位置不再进行缩放.
示例:
这是代码:
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;
/**
* The canvas which holds all of the nodes of the application.
*/
class PannableCanvas extends Pane {
Scale scaleTransform;
public PannableCanvas() {
setPrefSize(600, 600);
setStyle("-fx-background-color: lightgrey; -fx-border-color: blue;");
// add scale transform
scaleTransform …Run Code Online (Sandbox Code Playgroud)