Javafx 2 JavaFX缩放和平移操作导致异常

Javafx 2 JavaFX缩放和平移操作导致异常,javafx-2,Javafx 2,我有一个窗格(test_)作为边框窗格的中心子级。当窗口按预期拉伸时,子对象将填充其区域并增长 现在,我进行了规模测试。通常它会在它的区域居中,但我不想这样,所以我把它转换回它区域的左上角 但现在,当我拉伸寡妇时,它会将test_u从其区域的左上角拉开。有人能解释为什么会这样吗?下面的示例包含了一个滑块,用于缩放测试结果 多谢各位 package fxuicontrols; import javafx.application.Application; import javafx.beans.v

我有一个窗格(test_)作为边框窗格的中心子级。当窗口按预期拉伸时,子对象将填充其区域并增长

现在,我进行了规模测试。通常它会在它的区域居中,但我不想这样,所以我把它转换回它区域的左上角

但现在,当我拉伸寡妇时,它会将test_u从其区域的左上角拉开。有人能解释为什么会这样吗?下面的示例包含了一个滑块,用于缩放测试结果

多谢各位

package fxuicontrols;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class ScaleTest
    extends Application
    implements ChangeListener<Number>
{
    private final Pane  test_    = new Pane();

    public static void main(String[] args)
    {
        launch();
    }

    @Override
    public void start(Stage stage) throws Exception
    {
        test_.setStyle( "-fx-background-color: blue;" );

        Text    text    = new Text( "Upper left corner" );
        text.setFill( Color.WHITE );
        text.relocate( 0, 0 );
        test_.getChildren().add( text  );

        final Slider    scaler  = new Slider( .25, 1, 1 );
        scaler.valueProperty().addListener( this );
        test_.scaleXProperty().bind( scaler.valueProperty() );
        test_.scaleYProperty().bind( scaler.valueProperty() );

        BorderPane  root    = new BorderPane();
        root.setPrefSize( 250, 250 );
        root.setCenter( test_ );
        root.setBottom( scaler );

        stage.setScene( new Scene( root ) );
        stage.show();
    }

    @Override
    public void
    changed( ObservableValue<? extends Number> oVal,
                Number oldNm,
                Number newNum
    )
    {
        double  scale   = newNum.doubleValue();
        Bounds  bounds  = test_.getLayoutBounds();
        double  width   = bounds.getWidth();
        double  height  = bounds.getHeight();
        test_.setTranslateX( (scale * width - width) / 2 );
        test_.setTranslateY( (scale * height - height) / 2 );
    }
}
package fxs;
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.geometry.Bounds;
导入javafx.scene.scene;
导入javafx.scene.control.Slider;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.text.text;
导入javafx.stage.stage;
公共类ScaleTest
扩展应用程序
实现ChangeListener
{
专用最终窗格测试=新窗格();
公共静态void main(字符串[]args)
{
发射();
}
@凌驾
public void start(Stage)引发异常
{
测试设置样式(“-fx背景色:蓝色;”);
文本文本=新文本(“左上角”);
text.setFill(Color.WHITE);
文本。重新定位(0,0);
test.getChildren().add(文本);
最终滑块缩放器=新滑块(.25,1,1);
scaler.valueProperty().addListener(此);
test.scaleXProperty().bind(scaler.valueProperty());
test.scaleYProperty().bind(scaler.valueProperty());
BorderPane根=新的BorderPane();
root.setPrefSize(250250);
根。设置中心(测试);
根.立根(定标器);
舞台场景(新场景(根));
stage.show();
}
@凌驾
公共空间

更改(ObservalEvalue调整场景大小时,解决方案出错的原因是窗格是可调整大小的节点,因此窗格的布局边界在调整窗格大小时发生变化,但在平移计算中没有考虑到这一点

下面直接使用缩放和平移变换来避免任何与调整大小相关的问题。此示例代码是否满足您的要求

import javafx.application.Application;
import javafx.beans.value.*;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.scene.transform.*;
import javafx.stage.Stage;

// demonstrates scaling a test pane with content in it.
// slide the slider at the bottom of the scene around to shrink and grow the content.
public class ScaleTest extends Application {
  public static void main(String[] args) { launch(); }
  @Override public void start(Stage stage) throws Exception {
    // create a test pane for scaling.
    Pane testPane = new Pane();
    // make the test pane background a different color if you want to see the extent of the pane.
    testPane.setStyle("-fx-background-color: blue;");

    // create some text content to place in the test pane.
    Text text = new Text("Upper left corner");
    text.setStyle("-fx-font-size: 30px;");
    text.setFill(Color.WHITE);
    text.setTextOrigin(VPos.TOP);
    testPane.getChildren().add(text);
    Scale scaleTransform = new Scale();
    testPane.getTransforms().addAll(scaleTransform, new Translate(0, 0));

    // slider to scale the test pane.
    final Slider scaler = new Slider(.25, 3, 1);
    scaleTransform.xProperty().bind(scaler.valueProperty());
    scaleTransform.yProperty().bind(scaler.valueProperty());

    // stackpane added to pad out empty space when testPane is scaled small.
    // stackpane also clips the zoomed content when it gets larger than it's standard layout.
    final StackPane stack = new StackPane();
    stack.getChildren().addAll(testPane);
    StackPane.setAlignment(testPane, Pos.TOP_LEFT);
    stack.setStyle("-fx-background-color: blue;");

    final Rectangle clip = new Rectangle();
    testPane.layoutBoundsProperty().addListener(new ChangeListener<Bounds>() {
      @Override public void changed(ObservableValue<? extends Bounds> observable, Bounds oldBounds, Bounds bounds) {
        clip.setWidth(bounds.getWidth());
        clip.setHeight(bounds.getHeight());
      }
    });
    stack.setClip(clip);

    // layout everything.
    VBox layout = new VBox();
    layout.setPrefSize(250, 250);
    layout.getChildren().setAll(stack, scaler);
    VBox.setVgrow(stack, Priority.ALWAYS);

    // show the stage.
    stage.setScene(new Scene(layout));
    stage.show();
  }
}
导入javafx.application.application;
导入javafx.beans.value.*;
导入javafx.geometry.*;
导入javafx.scene.scene;
导入javafx.scene.control.Slider;
导入javafx.scene.layout.*;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.scene.text.text;
导入javafx.scene.transform.*;
导入javafx.stage.stage;
//演示如何缩放包含内容的测试窗格。
//滑动场景底部的滑块以缩小和扩大内容。
公共类ScaleTest扩展了应用程序{
公共静态void main(字符串[]args){launch();}
@覆盖公共无效开始(阶段)引发异常{
//创建用于缩放的测试窗格。
Pane testPane=new Pane();
//如果要查看窗格的范围,请将测试窗格背景设置为不同的颜色。
testPane.setStyle(“-fx背景色:蓝色;”);
//创建一些文本内容以放置在测试窗格中。
文本文本=新文本(“左上角”);
text.setStyle(“-fx字体大小:30px;”);
text.setFill(颜色为白色);
text.setTextOrigin(VPos.TOP);
testPane.getChildren().add(文本);
Scale scaleTransform=新比例();
testPane.getTransforms().addAll(scaleTransform,新的Translate(0,0));
//滑块以缩放测试窗格。
最终滑块缩放器=新滑块(.25,3,1);
scaleTransform.xProperty().bind(scaler.valueProperty());
scaleTransform.yProperty().bind(scaler.valueProperty());
//当testPane缩小时,添加stackpane以填充空白空间。
//stackpane还可以在缩放内容超过标准布局时对其进行剪辑。
最终StackPane堆栈=新StackPane();
stack.getChildren().addAll(testPane);
StackPane.setAlignment(测试窗格,位置左上方);
stack.setStyle(“-fx背景色:蓝色;”);
最终矩形剪辑=新矩形();
testPane.layoutBoundsProperty().addListener(新的ChangeListener()){
@覆盖公共无效已更改(我不确定)(我恐怕几天内不会),但它看起来确实很有趣。谢谢。