Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自动调整画布大小以填充封闭的父对象_Java_Animation_Javafx_Resize - Fatal编程技术网

Java 自动调整画布大小以填充封闭的父对象

Java 自动调整画布大小以填充封闭的父对象,java,animation,javafx,resize,Java,Animation,Javafx,Resize,我最近想在JavaFX中创建一个动画背景,类似于所看到的Swing示例。我使用了用于绘制的,如中所示,以及用于绘制循环的,如中所示。不幸的是,我不知道如何自动调整画布的大小,因为封闭的阶段已调整大小。什么是好方法 中检查了一个类似的问题,但接受的答案缺少接受的答案中所示的绑定。在下面的示例中,静态嵌套类CanvasPane将的实例包装在A中,并重写layoutChildren(),以使画布尺寸与封闭的窗格相匹配。请注意,Canvas从返回false,因此“父级无法在布局期间调整其大小,窗格”除

我最近想在JavaFX中创建一个动画背景,类似于所看到的Swing示例。我使用了用于绘制的,如中所示,以及用于绘制循环的,如中所示。不幸的是,我不知道如何自动调整
画布
的大小,因为封闭的
阶段
已调整大小。什么是好方法


中检查了一个类似的问题,但接受的答案缺少接受的答案中所示的绑定。

在下面的示例中,静态嵌套类
CanvasPane
将的实例包装在A中,并重写
layoutChildren()
,以使画布尺寸与封闭的
窗格相匹配。请注意,
Canvas
从返回
false
,因此“父级无法在布局期间调整其大小,
窗格
”除了将可调整大小的子级调整为其首选大小之外,不会执行布局。“用于构建画布的
宽度
高度
成为其初始大小。粒子模拟中也使用了类似的方法,在保持纵横比的同时缩放背景图像

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

import java.util.LinkedList;
导入java.util.Queue;
导入java.util.Random;
导入javafx.animation.AnimationTimer;
导入javafx.application.application;
导入javafx.beans.Observable;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.control.CheckBox;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.stage.stage;
/**
*@见https://stackoverflow.com/a/31761362/230513
*@见https://stackoverflow.com/a/8616169/230513
*/
公共类饰品扩展应用{
私有静态最终int MAX=64;
专用静态最终双宽=640;
专用静态最终双倍高度=480;
私有静态最终随机RND=新随机();
private final Queue=new LinkedList();
私人帆布;
@凌驾
公众假期开始(阶段){
画布窗格画布窗格=新画布窗格(宽度、高度);
canvas=canvasPane.getCanvas();
BorderPane根=新的BorderPane(画布窗格);
复选框cb=新复选框(“动画”);
cb.已选择(正确);
根.立根(cb);
场景=新场景(根);
舞台场景;
stage.show();
对于(int i=0;i{
if(cb.isSelected()){
loop.start();
}否则{
loop.stop();
}
});
}
私人静态类饰品{
私人决赛双x,y,d;
专用最终颜色c;
公共装饰品(双x,双y,双r,c色){
这个.x=x-r;
y=y-r;
这个。d=2*r;
这个.c=c;
}
}
私人小玩意{
double x=RND.nextDouble()*canvas.getWidth();
双y=RND.nextDouble()*canvas.getHeight();
双r=RND.nextDouble()*MAX+MAX/2;
颜色c=Color.hsb(RND.nextDouble()*360,1,1,0.75);
返回新的饰品(x,y,r,c);
}
私有静态类CanvasPane扩展窗格{
私人最终画布;
公共画布(双宽双高){
画布=新画布(宽度、高度);
getChildren().add(画布);
}
公共画布getCanvas(){
返回画布;
}
@凌驾
受保护的void layoutChildren(){
super.layoutChildren();
最终双x=SnapdleftInset();
最终双y=SnapedTopInset();
//Java 9-不推荐使用snapSize,请相应地使用snapSizeX()和snapSizeY()
最终双精度w=snapSize(getWidth())-x-SnapDrighInset();
最终双精度h=snapSize(getHeight())-y-SnapedBottomSet();
canvas.setLayoutX(x);
canvas.setLayoutY(y);
画布设置宽度(w);
帆布。设置高度(h);
}
}
公共静态void main(字符串[]args){
发射(args);
}
}

您不能用
绑定也这样做吗?下面的代码似乎产生了相同的结果,而不必添加派生类

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.beans.binding.DoubleBinding;
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.paint.Color;
import javafx.stage.Stage;

/**
 * @see http://stackoverflow.com/a/31761362/230513
 * @see http://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<Bauble> queue = new LinkedList<>();
private Canvas canvas;

@Override
public void start(Stage stage) {
    canvas = new Canvas(WIDTH, HEIGHT);
    BorderPane root = new BorderPane(canvas);
    CheckBox cb = new CheckBox("Animate");
    cb.setSelected(true);
    root.setBottom(cb);
    Scene scene = new Scene(root);
    stage.setScene(scene);
    stage.show();

    // Create bindings for resizing.
    DoubleBinding heightBinding = root.heightProperty()
            .subtract(root.bottomProperty().getValue().getBoundsInParent().getHeight());
    canvas.widthProperty().bind(root.widthProperty());
    canvas.heightProperty().bind(heightBinding);

    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);
}

public static void main(String[] args) {
    launch(args);
}
}
import java.util.LinkedList;
导入java.util.Queue;
导入java.util.Random;
导入javafx.animation.AnimationTimer;
导入javafx.application.application;
导入javafx.beans.Observable;
导入javafx.beans.binding.DoubleBinding;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.control.CheckBox;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.paint.Color;
导入javafx.stage.stage;
/**
*@见http://stackoverflow.com/a/31761362/230513
*@见http://stackoverflow.com/a/8616169/230513
*/
公共类饰品扩展应用{
私有静态最终int MAX=64;
专用静态最终双宽=640;
私人静电
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.beans.binding.DoubleBinding;
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.paint.Color;
import javafx.stage.Stage;

/**
 * @see http://stackoverflow.com/a/31761362/230513
 * @see http://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<Bauble> queue = new LinkedList<>();
private Canvas canvas;

@Override
public void start(Stage stage) {
    canvas = new Canvas(WIDTH, HEIGHT);
    BorderPane root = new BorderPane(canvas);
    CheckBox cb = new CheckBox("Animate");
    cb.setSelected(true);
    root.setBottom(cb);
    Scene scene = new Scene(root);
    stage.setScene(scene);
    stage.show();

    // Create bindings for resizing.
    DoubleBinding heightBinding = root.heightProperty()
            .subtract(root.bottomProperty().getValue().getBoundsInParent().getHeight());
    canvas.widthProperty().bind(root.widthProperty());
    canvas.heightProperty().bind(heightBinding);

    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);
}

public static void main(String[] args) {
    launch(args);
}
}
private static class CanvasPane extends Pane {

    final Canvas canvas;

    CanvasPane(double width, double height) {
        setWidth(width);
        setHeight(height);
        canvas = new Canvas(width, height);
        getChildren().add(canvas);

        canvas.widthProperty().bind(this.widthProperty());
        canvas.heightProperty().bind(this.heightProperty());
    }
}