如何在JavaFX上调整画布的大小以适应其大小

如何在JavaFX上调整画布的大小以适应其大小,java,canvas,javafx,javafx-2,javafx-8,Java,Canvas,Javafx,Javafx 2,Javafx 8,我是JavaFX新手,在调整画布大小时遇到了一个问题。 我试图让画布的大小正好适合我放入其中的内容。 输出应该是片段5/7中唯一的一个,但是我在我画的数字旁边有很多空白。 我尝试使用setWidth调整画布的大小,甚至从一开始就将画布设置为小尺寸,但似乎没有任何帮助 这是我的密码: import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import

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

}
编辑:我以前的答案是错的,这是新的

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

正如jewelsea在评论中指出的,您可以更改画布的宽度和高度。事实上,您已经在代码中完成了这项工作

我建议你为画布和场景选择不同的颜色。如果你用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);
    }

}
你会得到这个的

您可以清楚地看到画布已调整大小。你面临的问题是窗户不能再小了。这是场景中的白色(这里是黄色)空间,而不是画布上的。您可以尝试将“宽度”设置为1,“高度”设置为1,但最终仍然会出现以下情况:

我的猜测是,窗口大小不能因为“最小/最大/关闭”按钮而变小。您可以使用该方法更改样式以删除按钮

这一切都取决于你的需求是什么


旧(错)答案:

您不能修改该窗口的宽度/高度

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

画布节点以指定的宽度和高度构造 将画布绘制命令放入其中的图像的大小 提供。所有绘图操作都被剪裁到该图形的边界 形象


您的解决方案是要么将画布区域复制到另一个大小的新画布,要么根本不使用画布,而是使用e。G节点。但这一切都取决于您的要求。

我曾尝试复制到不同的画布,但问题似乎是画布有一个最小尺寸,即使我创建一个宽度为1的画布,它仍将具有与宽度为2、5、10等相同的特定最小尺寸。。当我增加宽度大小时,它会显示更多的图像,但仅包含画布的框架本身仍然比我提供的文本或画布上的大小大得多。Oracle集成示例应用程序中的中有一个示例用法。不过,如果调整大小,可能需要重新构建所有画布内容。有关罗兰基于文本解决问题的示例,请参阅。@jewelsea:您对画布的看法是正确的,谢谢。我更新了我的答案。但我猜他想要的是创建一个与他的(最终)15x55画布大小的窗口。