在 javafx 中复制组件的视图



我正在寻找一种在javafx中复制组件视图的方法。此副本不会有任何鼠标或键事件,并且基本上类似于画布。 只要这个副本不改变,我就可以使用节点具有的快照(...(方法。我的问题是我希望这是动态的。例如,我有一个窗格显示某种动画(可能取决于用户输入(,我想要第二个窗格显示完全相同的图像(但本身不能像鼠标按下一样具有用户输入(。 反射效果是我需要的非常具体的情况。一般来说有什么办法可以做到吗?

一种方法(到目前为止我使用过(是创建第二个重复组件并将其所有输入连接到第一个组件。问题是,对于我想复制的每个组件来说,这都是大量的工作,而且不能一般地完成。 第二种方法是每次原始组件更改时拍摄快照并将其复制到副本中。这应该是解决方案,但我认为应该有一个更低级别的解决方案,而不是侦听更改,创建一个图像副本,然后更新一个 ImageView。

您可以使用某种绑定。这是一个基本示例

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Control;
import javafx.scene.control.Separator;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
*
* @author blj0011
*/
public class JavaFXTestingGround extends Application
{
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
Circle circle = new Circle(0, 200, 25, Color.BLUE);
Circle duplicateCircle = new Circle(25, Color.BLUE);
@Override
public void start(Stage primaryStage)
{
duplicateCircle.centerXProperty().bind(circle.centerXProperty());
duplicateCircle.centerYProperty().bind(circle.centerYProperty());
Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1.0 / 40.0), (ActionEvent t) -> {
circle.setCenterX(circle.getCenterX() + 1);
}));
timeline.setCycleCount(Timeline.INDEFINITE);
circle.setOnMouseClicked((t) -> {
switch (timeline.getStatus()) {
case STOPPED:
timeline.play();
break;
case RUNNING:
timeline.stop();
break;
}
});
Pane root = new Pane(circle);
primaryStage.setTitle("Test");
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
Pane duplicateRoot = new Pane(duplicateCircle);
Stage duplicatStage = new Stage();
duplicatStage.setScene(new Scene(duplicateRoot, 400, 400));
duplicatStage.setX(primaryStage.getX() + primaryStage.getWidth() + 10);
duplicatStage.setY(primaryStage.getY());
duplicatStage.show();
}
}

最新更新