这似乎是一个简单的问题。但我没有找到简单的解决方案。如果缩放节点,新窗体将位于父窗体的中心。但我希望新表格具有与旧表格相同的左上角。
示例代码为:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class TestScale extends Application{
Group root;
Pane pane;
Scene scene;
Rectangle rect0;
@Override
public void start(Stage stage) {
root = new Group();
scene = new Scene(root, 200, 160);
rect0=new Rectangle(0, 0, 200, 160);
rect0.setFill(Color.BLUE);
pane = new Pane();
pane.getChildren().add(rect0);
Button btnForward = new Button();
btnForward.setText(">");
btnForward.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
transform(pane);
}
});
root.getChildren().add(pane);
root.getChildren().add(btnForward);
stage.setScene(scene);
stage.show();
}
void transform (Node node){
node.setScaleX(0.5);
node.setScaleY(0.5);
}
public static void main(String[] args) {
launch(args);
}
}
使用 Stackpane、Borderpane、Anchorpane、Groups 进行的所有测试都没有提供简单的解决方案。唯一的方法似乎是使用 setTransformX 和 setTransformY。但我需要对参数进行复杂的计算。
当您使用 ScaleX/ScaleY 时,缩放从节点的中心开始。
来自 JavaDocs
发生缩放的枢轴点是未变换的布局边界的中心。
因此,如果要平移缩放坐标,则在设置所需的平移值时需要考虑缩放压缩。
由于您当前的枢轴位于中心,因此您需要将平移设置为负值。由于X和Y的压缩是一半,所以需要转换为场景总大小的1/4。
node.setScaleX(0.5);
node.setScaleY(0.5);
node.setTranslateX(0 - node.getScene().getWidth()/4);
node.setTranslateY(0 - node.getScene().getHeight()/4);
这里是变换图像中的矩形的代码: 该过程为 setScaleX 和 setScaleY(缩放)提供了一个scalefaktor,并为 setTransformX 提供了设置值 tx,为 setTransformY 提供了 ty。
public Scaler(double sceneWidth, double sceneHeight, double imgWidth, double imgHeight,
int x, int y, int width, int height) {
double scrnRatio = sceneHeight / sceneWidth;
double offsetX = 0.;
double offsetY = 0.;
if (height / (double)width > scrnRatio) {
offsetX = (height / scrnRatio - width) / 2.;
scale = sceneHeight/height;
} else {
offsetY = (width * scrnRatio - height) / 2.;
scale = sceneWidth/width;
}
double dh = (1. - scale) / 2.;
tx = -(x - offsetX) * scale - dh * imgWidth;
ty = -(y - offsetY) * scale - dh * imgHeight;
}
有没有更简单的代码?