Java组件自动调节大小_自动调整画布大小以填充封闭的父级

这个示例展示了如何创建一个JavaFX应用程序,其中Canvas组件会自动调整大小以填充其父Pane。通过覆盖`layoutChildren()`方法并设置Canvas的宽度和高度,可以实现这一效果。该程序还包含一个简单的动画,展示如何在Canvas上绘制动态图形。
摘要由CSDN通过智能技术生成

在下面的例子中,静态嵌套类CanvasPane包装的一个实例Canvas在一个Pane和覆盖layoutChildren(),使帆布尺寸的包围匹配Pane。请注意,从Canvas返回,因此“父级无法在布局期间调整其大小”和“除了将可调整大小的子级调整为其首选大小之外,不会执行布局”。的和用于构建画布成为其初始大小。在Ensemble粒子模拟中使用类似的方法来缩放背景图像,同时保留其长宽比。falseisResizable()PanewidthheightFireworks.java

顺便说一句,请注意与使用原始颜色相比,使用完全饱和的颜色有所不同。这些相关示例说明了如何将控件放置在动画背景上。

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、付费专栏及课程。

余额充值