Java 如何缩放和设置MediaView的坐标?

Java 如何缩放和设置MediaView的坐标?,java,javafx-2,Java,Javafx 2,我想在我的JavaFX2.x场景中嵌入一个视频,并根据我的需要调整它的大小和位置。我遇到的问题如下。如果我构建一个MediaView组件,然后平移X或Y坐标,那么整个视图将正确移动,如下所示: MediaView mv = (...) mv.setTranslateX(200); mv.setTranslateY(200); 我可以对缩放属性进行类似的转换: MediaView mv = (...) mv.setScaleX(2); mv.setScaleY(2); 它将在维度中正确缩放mv

我想在我的JavaFX2.x场景中嵌入一个视频,并根据我的需要调整它的大小和位置。我遇到的问题如下。如果我构建一个
MediaView
组件,然后平移X或Y坐标,那么整个视图将正确移动,如下所示:

MediaView mv = (...)
mv.setTranslateX(200);
mv.setTranslateY(200);
我可以对缩放属性进行类似的转换:

MediaView mv = (...)
mv.setScaleX(2);
mv.setScaleY(2);
它将在维度中正确缩放
mv
实例两次

然而,问题是当我结合这两种翻译时。正在缩放
mv
实例,但它始终以屏幕坐标
(0,0)
结束。在我看来,这当然是不正确的行为

我还尝试将我的
MediaView
组件封装在一些包装器节点中,比如
Group
,并对该元素执行翻译。行为是一样的

如何同时正确移动和缩放
MediaView
组件?

编辑:

这是我的代码,尽管我在这里使用的是
ImageView
。然而,这并不重要。运行此代码后,图像将放置在
(0,0)
而不是
(100100)


使用setScaleX、setScaleY时,从节点中心开始缩放

如果除缩放外还希望按一定量进行平移,则在设置所需的平移值时需要考虑缩放扩展。例如,如果节点的大小加倍(并且要将节点平移到相对于未缩放节点左上角的位置),则需要将节点宽度和高度再平移一半

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.media.*;
import javafx.scene.transform.*;
import javafx.stage.Stage;

public class TransformedVideo extends Application {
  public static void main(String[] args) throws Exception { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    final MediaPlayer oracleVid = new MediaPlayer(new Media("http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv"));
    final MediaView mediaView = new MediaView(oracleVid);
    mediaView.setFitWidth(320); mediaView.setFitHeight(240); mediaView.setPreserveRatio(false);

    mediaView.setTranslateX(mediaView.getFitWidth()  / 2 + 200); 
    mediaView.setTranslateY(mediaView.getFitHeight() / 2 + 200);
    mediaView.setScaleX(2); mediaView.setScaleY(2);

// alternative method of scaling and translating.    
//    mediaView.getTransforms().addAll(
//      new Translate(200, 200),
//      new Scale(2, 2)
//    );

    Group group = new Group(mediaView);
    stage.setScene(new Scene(group, 1250, 800));
    stage.show();

    oracleVid.play();

    System.out.println(group.getBoundsInParent());
  }
}

当在一个节点上执行多个转换时,与使用setScale/setTransform/setRotate方法相比,只向getTransforms()方法提供一个转换列表通常更容易。

请粘贴代码,然后“组合这两个转换”。我添加了示例代码。看来您是对的。今天我将运行一些测试,如果他们能够证明这一说法,我将接受一个答案。确认-重要的部分确实是这样一个事实,即缩放不是从我预期的(0,0)开始,而是从节点的中心开始。Thx.当mediaview位于窗格内时,有没有办法使其居中?使用StackPane将内容cp居中。
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.media.*;
import javafx.scene.transform.*;
import javafx.stage.Stage;

public class TransformedVideo extends Application {
  public static void main(String[] args) throws Exception { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    final MediaPlayer oracleVid = new MediaPlayer(new Media("http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv"));
    final MediaView mediaView = new MediaView(oracleVid);
    mediaView.setFitWidth(320); mediaView.setFitHeight(240); mediaView.setPreserveRatio(false);

    mediaView.setTranslateX(mediaView.getFitWidth()  / 2 + 200); 
    mediaView.setTranslateY(mediaView.getFitHeight() / 2 + 200);
    mediaView.setScaleX(2); mediaView.setScaleY(2);

// alternative method of scaling and translating.    
//    mediaView.getTransforms().addAll(
//      new Translate(200, 200),
//      new Scale(2, 2)
//    );

    Group group = new Group(mediaView);
    stage.setScene(new Scene(group, 1250, 800));
    stage.show();

    oracleVid.play();

    System.out.println(group.getBoundsInParent());
  }
}