使用JavaFX 8 ScrollPane进行假滚动

时间:2015-12-22 20:02:26

标签: javafx-8 scenebuilder

我想做的事情:

  • 我尝试使用画布为用户渲染游戏板。用户 将能够放大。

  • 当用户使用时,渲染整个游戏板是不可能的 放大,因为游戏板非常大。相反,我会渲染什么 每隔1/30秒在屏幕上显示。

  • 我想创造整个游戏板众生的错觉 在像ScrollPane 这样的gui里面,用户可以用它滚动 鼠标。

  • 实际上, ScrollPane将完全链接到单个画布 视口的大小。

我不确定正确的方法是什么。滚动窗格似乎没有允许您假装它有一个大对象的属性。我可以在滚动窗格中放置一个大画布,但是大型画布会占用内存,正如我的崩溃所暗示的那样。 我应该使用AnchorPane还是什么?这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

似乎将一个AnchorPane放入ScrollPane,将AnchorPane设置为正确的大小(整个游戏板的大小)可以很好地让用户自由滚动。从那里你要做的就是在AnchorPane的正确位置放一个画布并继续移动它(并重新绘制它)使一切都运作完毕。为了让它顺利运行,我认为你应该在ScrollPane的视口之外渲染100到500个像素。这是我项目中的一些示例代码:

public class GridViewPane {
    /** ScrollPane that this grid exits in */
    private ScrollPane gridScroll;
    /** The anchor pane immediately inside of {@link #gridScroll}. The
     * dimensions of this equals the dimensions of the {@link #can} if it was to
     * render the entire grid at once */
    private Pane gridView;
    /** Exists in {@link #gridView} and is exactly the size of the viewport of
     * {@link #gridScroll} */
    private Canvas can;
    /** A label the specifies what hex is currently moused-over */
    private Label currentHexLabel;
    public void update() {
        // sets the canvas to the right size if needed
        final Bounds viewportSize = gridScroll.getBoundsInLocal();
        if (can == null || !can.getBoundsInLocal().equals(viewportSize)) {
            can = new Canvas(viewportSize.getWidth(),
                    viewportSize.getHeight());
            gc = can.getGraphicsContext2D();
        }
        // sets the anchorpane to the right size
        final double[] dim = getPixleSizeOfGrid(w.columns(), w.rows(), r);
        if (gridView == null) {
            gridView = new AnchorPane();
            gridScroll.setContent(gridView);
        }
        Bounds oldDim = gridView.getBoundsInLocal();
        if (!(oldDim.getWidth() == dim[0]
                && oldDim.getHeight() == dim[1])) {
            gridView.setPrefSize(dim[0], dim[1]);
        }
        // puts the canvas in the right position
        if (!gridView.getChildren().contains(can))
            gridView.getChildren().add(can);
        double[] x = getXScreenRange();
        double[] y = getYScreenRange();
        can.relocate(x[0], y[0]);
        // *********** Drawing Hexes ***********/

    }
}