我想在滚动事件上缩放窗格中的所有节点.
到目前为止我尝试了什么:
当我执行scaleX或scaleY时,窗格的边框分别缩放(在设置窗格样式时看到-fx-border-color: black;).因此,如果我不是从窗格的边界开始,并非每个事件都会启动,所以我需要它.
下一步我试图扩展每个节点,结果非常糟糕,就像这样 - (通过点延伸的线条).或者如果在另一侧滚动,则会更少
我尝试的另一种方法是缩放Node的点.它更好,但我不喜欢它.它看起来
point.setScaleX(point.getScaleX()+scaleX)和y和其他节点适当.
我有一个需要在ScrollPane中放大的应用程序,但是按照我目前的方法,我仍然面临着两个挑战.为了复制问题,我编写了一个小应用程序ZoomApp,您将找到下面的代码.它的有限功能允许在某些任意形状上放大和缩小(使用Ctrl +鼠标滚轮).当缩放的内容超出窗口范围时,滚动条应该显示.
挑战1. 当内部组缩小尺寸时出现滚动条时,ScrollEvent不再到达我的ZoomHandler.相反,我们开始向下滚动窗口,直到它到达底部,当再次缩放按预期工作时.我想也许吧
scrollPane.setPannable(false);
Run Code Online (Sandbox Code Playgroud)
会有所作为,但没有.如何避免这种不良行为?
挑战2. 我将如何去到中心innerGroup滚动窗格内,不诉诸画一个像素的左上角innerGroup与所需三角洲平方?
作为旁注,根据JavaDoc for ScrollPane:"如果应用程序希望滚动基于节点的可视边界(对于缩放内容等),则需要将滚动节点包装在一个组中".这就是为什么我在ScrollPane中有一个innerGroup 和一个outerGroup的原因.
这个JavaFX新手非常赞赏任何指导我解决方案的建议.
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.ScrollPane;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
/**
* Demo of a challenge I have with zooming inside a {@code ScrollPane}.
* <br>
* I am running JavaFx 2.2 on a Mac. {@code java -version} yields:
* <pre> …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
标签将正确缩放,但封闭的滚动窗格的条仍然可以容纳原始大小的组件.
我到目前为止尝试过:
我错过了什么?如何使ScrollPane适应内容视图?
谢谢你的帮助.
我正在尝试实现一个场景,ScrollPane用户可以在其中拖动节点并动态缩放它.我使用鼠标滚轮进行拖动和缩放以及重置缩放,但是我在计算上遇到问题以使节点适合父节点的宽度.
这是我的代码作为sscce.
如果我放大或缩小或更改窗口大小,适合宽度不起作用.
如果有人可以帮助我进行计算以使节点符合父节点的宽度,我将非常感激.
编辑:
fitWidth(),通过鼠标右键双击调用.希望现在更清楚了.
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.StrokeType;
import javafx.stage.Stage;
import javafx.util.Duration;
public class ZoomAndPanExample extends Application {
private ScrollPane scrollPane = new ScrollPane();
private final DoubleProperty zoomProperty = new SimpleDoubleProperty(1.0d);
private …Run Code Online (Sandbox Code Playgroud)