【问题标题】:How to resize a canvas on JavaFX to fit the size如何在 JavaFX 上调整画布大小以适应大小
【发布时间】:2015-07-06 12:57:51
【问题描述】:

我是 JavaFX 新手,在调整画布大小时遇到​​了问题。 我试图让画布大小完全适合我放入其中的内容。 输出应该是唯一的片段 5/7,但我在绘制的数字旁边有很多空白。 我尝试使用 setWidth 调整画布大小,甚至从一开始就将画布设置为小尺寸,但似乎没有任何帮助。

这是我的代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;

public class Example extends Application {

    Font fontLarge = Font.font("Droid Sans", FontWeight.BOLD, 15);

    @Override
    public void start(Stage stage) {

        HBox root = new HBox();
        Scene scene = new Scene(root);

        root.getChildren().add(getCanvasOfRationalNumber("5", "7"));
        scene.setRoot(root);
        stage.setScene(scene);
        stage.show();
    }

    public Canvas getCanvasOfRationalNumber(String num, String denom) {
        final Canvas rnCanvas = new Canvas(300, 55);
        GraphicsContext gc = rnCanvas.getGraphicsContext2D();
        gc.setFont(fontLarge);

        gc.fillText(num, 0, 15);
        gc.fillText("___", 0, 20);
        gc.fillText(denom, 0, 40);

        rnCanvas.setWidth(15);
        return rnCanvas;
    }

    public static void main(String[] args) {
        launch(args);
    }

}

【问题讨论】:

    标签: java canvas javafx javafx-2 javafx-8


    【解决方案1】:

    编辑:我之前的答案是错误的,这是新的。

    我们需要澄清您真正想要什么。如果我现在理解正确,您想要的是窗口大小本身不大于 Canvas 大小。

    正如 Jewelsea 在 cmets 中指出的那样,您可以更改画布的宽度和高度。事实上,您已经在代码中这样做了。

    我建议你为画布和场景选择不同的颜色。如果您使用 e 执行此操作。 g.:

    public class Example extends Application {
    
        Font fontLarge = Font.font("Droid Sans", FontWeight.BOLD, 15);
    
        @Override
        public void start(Stage stage) {
    
            HBox root = new HBox();
            Scene scene = new Scene(root, Color.YELLOW);
    
            root.getChildren().add(getCanvasOfRationalNumber("5", "7"));
            scene.setRoot(root);
            stage.setScene(scene);
            stage.show();
        }
    
        public Canvas getCanvasOfRationalNumber(String num, String denom) {
            final Canvas rnCanvas = new Canvas(300, 55);
            GraphicsContext gc = rnCanvas.getGraphicsContext2D();
            gc.setFont(fontLarge);
    
            gc.setFill(Color.LIGHTBLUE);
            gc.fillRect(0, 0, 300, 55);
    
            gc.setFill(Color.BLUE);
    
            gc.fillText(num, 0, 15);
            gc.fillText("___", 0, 20);
            gc.fillText(denom, 0, 40);
    
            rnCanvas.setWidth(15);
            return rnCanvas;
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    
    }
    

    你会得到这个

    您清楚地看到 Canvas 已调整大小。您面临的问题是窗口不能更小。那是场景中的白色(或此处为黄色)空间,而不是画布中的空间。您可以尝试将宽度设置为 1,将高度设置为 1,但您仍然会得到以下结果:

    我的猜测是窗口大小不能因为最小/最大/关闭按钮而变小。您可以使用initStyle 方法更改样式以摆脱按钮。

    这一切都取决于您的要求。


    旧的(错误的)答案:

    您不能修改Canvas 的宽度/高度。

    画布是可以使用一组图形绘制的图像 GraphicsContext 提供的命令。

    Canvas 节点由指定的宽度和高度构成 画布绘图命令所在的图像大小 呈现。所有绘图操作都被限制在那个范围内 图片。

    您的解决方案是将画布区域复制到具有其他大小的新画布,或者根本不使用画布,而是使用 e。 G。 Text 节点。但这一切都取决于您的要求。

    【讨论】:

    • 我试图复制到不同的画布,但问题似乎是画布有一个我无法绕过的最小尺寸,即使我创建一个宽度尺寸为 1 的画布它仍然会在特定的最小尺寸与宽度尺寸 2、5、10 等相同。当我增加宽度尺寸时,它会显示更多图像,但仅包含画布的框架本身仍然比我提供的文本或尺寸大得多
    • 您可以在画布上使用setWidthsetHeight。 Oracle Ensemble 示例应用程序中的canvas fireworks 中有一个示例用法。但是,如果您调整大小,您可能需要重建所有画布内容。
    • 有关 Roland 基于文本的解决方案示例,请参阅my answer to your previous question
    • @jewelsea:你对 Canvas 的看法是对的,谢谢。我更新了我的答案。但我猜他想要的是创建一个与他的(最终)15x55 Canvas 大小相同的窗口。
    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2010-12-12
    • 2014-08-23
    • 2014-07-04
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多