java设置canvas大小_java - 自动调整Canvas大小以填充封闭的Parent - SO中文参考 - www.soinside.com...

在下面的示例中,静态嵌套类CanvasPane在Canvas中包装Pane的实例并覆盖layoutChildren()以使画布尺寸与封闭的Pane匹配。请注意,Canvas从false返回isResizable(),因此“父级在布局期间无法调整大小”,而Pane“除了将可调整大小的子级调整为其首选大小外,不会执行布局。”用于构造画布的width和height成为其初始尺寸。在Ensemble粒子模拟中使用类似的方法Fireworks.java来缩放背景图像,同时保持其纵横比。

另外,请注意与使用完全饱和的颜色相比,与原始颜色的区别。这些相关的examples说明了在动画背景上放置控件。

eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9NRDRmUC5wbmcifQ==

import java.util.LinkedList;

import java.util.Queue;

import java.util.Random;

import javafx.animation.AnimationTimer;

import javafx.application.Application;

import javafx.beans.Observable;

import javafx.scene.Scene;

import javafx.scene.canvas.Canvas;

import javafx.scene.canvas.GraphicsContext;

import javafx.scene.control.CheckBox;

import javafx.scene.layout.BorderPane;

import javafx.scene.layout.Pane;

import javafx.scene.paint.Color;

import javafx.stage.Stage;

/**

* @see https://stackoverflow.com/a/31761362/230513

* @see https://stackoverflow.com/a/8616169/230513

*/

public class Baubles extends Application {

private static final int MAX = 64;

private static final double WIDTH = 640;

private static final double HEIGHT = 480;

private static final Random RND = new Random();

private final Queue queue = new LinkedList<>();

private Canvas canvas;

@Override

public void start(Stage stage) {

CanvasPane canvasPane = new CanvasPane(WIDTH, HEIGHT);

canvas = canvasPane.getCanvas();

BorderPane root = new BorderPane(canvasPane);

CheckBox cb = new CheckBox("Animate");

cb.setSelected(true);

root.setBottom(cb);

Scene scene = new Scene(root);

stage.setScene(scene);

stage.show();

for (int i = 0; i < MAX; i++) {

queue.add(randomBauble());

}

AnimationTimer loop = new AnimationTimer() {

@Override

public void handle(long now) {

GraphicsContext g = canvas.getGraphicsContext2D();

g.setFill(Color.BLACK);

g.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());

for (Bauble b : queue) {

g.setFill(b.c);

g.fillOval(b.x, b.y, b.d, b.d);

}

queue.add(randomBauble());

queue.remove();

}

};

loop.start();

cb.selectedProperty().addListener((Observable o) -> {

if (cb.isSelected()) {

loop.start();

} else {

loop.stop();

}

});

}

private static class Bauble {

private final double x, y, d;

private final Color c;

public Bauble(double x, double y, double r, Color c) {

this.x = x - r;

this.y = y - r;

this.d = 2 * r;

this.c = c;

}

}

private Bauble randomBauble() {

double x = RND.nextDouble() * canvas.getWidth();

double y = RND.nextDouble() * canvas.getHeight();

double r = RND.nextDouble() * MAX + MAX / 2;

Color c = Color.hsb(RND.nextDouble() * 360, 1, 1, 0.75);

return new Bauble(x, y, r, c);

}

private static class CanvasPane extends Pane {

private final Canvas canvas;

public CanvasPane(double width, double height) {

canvas = new Canvas(width, height);

getChildren().add(canvas);

}

public Canvas getCanvas() {

return canvas;

}

@Override

protected void layoutChildren() {

super.layoutChildren();

final double x = snappedLeftInset();

final double y = snappedTopInset();

// Java 9 - snapSize is deprecated, use snapSizeX() and snapSizeY() accordingly

final double w = snapSize(getWidth()) - x - snappedRightInset();

final double h = snapSize(getHeight()) - y - snappedBottomInset();

canvas.setLayoutX(x);

canvas.setLayoutY(y);

canvas.setWidth(w);

canvas.setHeight(h);

}

}

public static void main(String[] args) {

launch(args);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值