缩放在JavaFX和ScrollPanes(Scaling in JavaFX and Scroll

2019-09-22 08:21发布

我一直在试图与缩放JavaFX中变换工作,但还没有完全能够环绕它我的头。 基本上,我有含有复合图形窗格,并希望能够重新调整它。 缩放部本身工作正常,但是,将封闭滚动窗格将无法适应图形。

为简单起见,我会后在我的图形是由标签替换,很短的例子:

public class TestApp extends Application {
    @Override public void start(final Stage stage) throws Exception {
        final Label label = new Label("Hello World");
        label.getTransforms().setAll(new Scale(0.5, 0.5));

        label.setStyle("-fx-background-color:blue");
        label.setFont(new Font(200));

        final ScrollPane scrollPane = new ScrollPane();
        scrollPane.setContent(label);

        stage.setScene(new Scene(scrollPane));
        stage.setWidth(200);
        stage.setHeight(100);
        stage.show();
    }

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

标签将正确缩放,但是封闭滚动窗格的工具栏将仍然容纳原始大小的一个组成部分。

到目前为止,我已经试过:

  • 有标签分钟,PREF大小玩耍
  • 包装一组内侧的标签(没有滚动条就会出现任何)
  • 缩放封闭集团,而不是标签

我在想什么? 我能做些什么,使滚动窗格适应内容的看法?

谢谢你的帮助。

Answer 1:

我实现缩放在一个ScrollPane为图形和其他节点中滚动窗格视口变换和布局界限JavaFX中的该示例 。

该代码,当我第一次学习JavaFX的,所以肯定的代码可能是更清洁,也许还有(如中建议例如,使用一个组作为缩放节点的容器更简单的方法来做到这一点是实施滚动窗格文档 )。

一个键获得我想要的(滚动条只出现当您在放大和节点比可见视大)的解决方案,是这样的代码:

// create a container for the viewable node.
final StackPane nodeContainer = new StackPane();
nodeContainer.getChildren().add(node);

// place the container in the scrollpane and adjust the pane's viewports as required.
final ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(nodeContainer);
scrollPane.viewportBoundsProperty().addListener(
  new ChangeListener<Bounds>() {
  @Override public void changed(ObservableValue<? extends Bounds> observableValue, Bounds oldBounds, Bounds newBounds) {
    nodeContainer.setPrefSize(
      Math.max(node.getBoundsInParent().getMaxX(), newBounds.getWidth()),
      Math.max(node.getBoundsInParent().getMaxY(), newBounds.getHeight())
    );
  }
});

...

// adjust the view layout based on the node scalefactor.
final ToggleButton scale = new ToggleButton("Scale");
scale.setOnAction(new EventHandler<ActionEvent>() {
  @Override public void handle(ActionEvent actionEvent) {
    if (scale.isSelected()) {
      node.setScaleX(3); node.setScaleY(3);
    } else {
      node.setScaleX(1); node.setScaleY(1);
    }
    // runlater as we want to size the container after a layout pass has been performed on the scaled node.
    Platform.runLater(new Runnable() { 
      @Override public void run() {
        nodeContainer.setPrefSize(
          Math.max(nodeContainer.getBoundsInParent().getMaxX(), scrollPane.getViewportBounds().getWidth()),
          Math.max(nodeContainer.getBoundsInParent().getMaxY(), scrollPane.getViewportBounds().getHeight())
        );
      }
    });
  }
});


Answer 2:

据到滚动文档,你可以尝试在一个组包一个窗格,从而将ScrollPane被束缚的视觉束缚而不是实际的布局滚动。

ScrollPane layout calculations are based on the layoutBounds rather than the
boundsInParent (visual bounds) of the scroll node. If an application wants the
scrolling to be based on the visual bounds of the node (for scaled content etc.),
they need to wrap the scroll node in a Group. 


文章来源: Scaling in JavaFX and ScrollPanes
标签: javafx-2