Java 如何调整包含svg图像的按钮大小

Java 如何调整包含svg图像的按钮大小,java,svg,javafx,resize,Java,Svg,Javafx,Resize,我想在按钮内放置一个svg图像,然后我想能够将按钮调整为任意大小 首先,我是如何在按钮中加载和放置svg图像的: SVGPath svg = new SVGPath(); svg.setContent("M87.5,50.002C87.5,29.293,70.712,12.5,50,12.5c-20.712,0-37.5,16.793-37.5,37.502C12.5,70.712,29.288,87.5,50,87.5 c6.668,0,12.918-1.756

我想在按钮内放置一个svg图像,然后我想能够将按钮调整为任意大小

首先,我是如何在按钮中加载和放置svg图像的:

SVGPath svg = new SVGPath();
        svg.setContent("M87.5,50.002C87.5,29.293,70.712,12.5,50,12.5c-20.712,0-37.5,16.793-37.5,37.502C12.5,70.712,29.288,87.5,50,87.5
        c6.668,0,12.918-1.756,18.342-4.809c0.61-0.22,1.049-0.799,1.049-1.486c0-0.622-0.361-1.153-0.882-1.413l0.003-0.004l-6.529-4.002
        L61.98,75.79c-0.274-0.227-0.621-0.369-1.005-0.369c-0.238,0-0.461,0.056-0.663,0.149l-0.014-0.012
        C57.115,76.847,53.64,77.561,50,77.561c-15.199,0-27.56-12.362-27.56-27.559c0-15.195,12.362-27.562,27.56-27.562
        c14.322,0,26.121,10.984,27.434,24.967C77.428,57.419,73.059,63,69.631,63c-1.847,0-3.254-1.23-3.254-3.957
        c0-0.527,0.176-1.672,0.264-2.111l4.163-19.918l-0.018,0c0.012-0.071,0.042-0.136,0.042-0.21c0-0.734-0.596-1.33-1.33-1.33h-7.23
        c-0.657,0-1.178,0.485-1.286,1.112l-0.025-0.001l-0.737,3.549c-1.847-3.342-5.629-5.893-10.994-5.893
        c-10.202,0-19.877,9.764-19.877,21.549c0,8.531,5.101,14.775,13.632,14.775c4.75,0,9.587-2.727,12.665-7.035l0.088,0.527
        c0.615,3.342,9.843,7.576,15.121,7.576c7.651,0,16.617-5.156,16.617-19.932l-0.022-0.009C87.477,51.13,87.5,50.569,87.5,50.002z
         M56.615,56.844c-1.935,2.727-5.101,5.805-9.763,5.805c-4.486,0-7.212-3.166-7.212-7.738c0-6.422,5.013-12.754,12.049-12.754
        c3.958,0,6.245,2.551,7.124,4.486L56.615,56.844z");

Button button = new Button();
        button.setGraphic(svg);
我尝试将SVGPath放在组对象中,然后缩放该组,如下所示:

Group graphics = new Group();
graphics.getChildren().add(svg);
graphics.getTransforms().add(new Scale(0.2, 0.2, 0 , 10));

Button button = new Button();
button.setGraphic(graphics);
这确实改变了svg图像的大小。问题是按钮的大小没有相应地改变。它的大小与图像从未重新缩放时的大小相同。我是否设置了按钮的最大尺寸并不重要。我只能把按钮弄大一点,但不能弄小一点

关于在JavaFx中使用SVG图像的文档似乎非常有限,所以如果有人能帮助我,我将不胜感激

更新:@ItachiUchiha指出,我可以使用
setScaleX(..)和
setScaleY(..)重新缩放按钮,其中的svg图像将随之重新缩放。但是,这样做似乎不会更改按钮的size属性。这意味着包含按钮的窗格仍将占用相同的空间,就像按钮未重新缩放一样。在窗格上设置最大大小也无济于事。此外,setScaleY和X方法重新缩放所有按钮,包括按钮的边框。这使按钮具有与包含纯文本的按钮不同的外观。“我的窗格”将包含包含svg内容的按钮和包含纯文本内容的按钮,除了内容之外,它们的外观应该相同


更新2:@ItachiUchiha经过编辑的回复将一切都讲清楚了。标记为答案。

SVG图像可以自行调整大小并适合其容器。您可以重新调整按钮的大小,SVG图像将适合其边界

Button button = new Button();
button.setGraphic(svg);
// Re-size the button
button.setScaleX(0.5);
button.setScaleY(0.5);

编辑-根据父项调整按钮大小

如果要根据父对象重新调整按钮的大小,并根据它缩放图像。可以将图像的缩放特性绑定到按钮的高度和宽度。每当父级的大小更改时,也更改按钮的大小

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.shape.SVGPath;
import javafx.stage.Stage;

public class Main extends Application{

    private final int MIN_BUTTON_SIZE = 10;

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        HBox root = new HBox();
        root.setAlignment(Pos.CENTER);
        SVGPath svg = new SVGPath();
        svg.setContent("M87.5,50.002C87.5,29.293,70.712,12.5,50,12.5c-20.712,0-37.5,16.793-37.5,37.502C12.5,70.712,29.288,87.5,50,87.5" +
                "c6.668,0,12.918-1.756,18.342-4.809c0.61-0.22,1.049-0.799,1.049-1.486c0-0.622-0.361-1.153-0.882-1.413l0.003-0.004l-6.529-4.002" +
        "L61.98,75.79c-0.274-0.227-0.621-0.369-1.005-0.369c-0.238,0-0.461,0.056-0.663,0.149l-0.014-0.012" +
        "C57.115,76.847,53.64,77.561,50,77.561c-15.199,0-27.56-12.362-27.56-27.559c0-15.195,12.362-27.562,27.56-27.562" +
        "c14.322,0,26.121,10.984,27.434,24.967C77.428,57.419,73.059,63,69.631,63c-1.847,0-3.254-1.23-3.254-3.957" +
        "c0-0.527,0.176-1.672,0.264-2.111l4.163-19.918l-0.018,0c0.012-0.071,0.042-0.136,0.042-0.21c0-0.734-0.596-1.33-1.33-1.33h-7.23" +
        "c-0.657,0-1.178,0.485-1.286,1.112l-0.025-0.001l-0.737,3.549c-1.847-3.342-5.629-5.893-10.994-5.893" +
        "c-10.202,0-19.877,9.764-19.877,21.549c0,8.531,5.101,14.775,13.632,14.775c4.75,0,9.587-2.727,12.665-7.035l0.088,0.527" +
        "c0.615,3.342,9.843,7.576,15.121,7.576c7.651,0,16.617-5.156,16.617-19.932l-0.022-0.009C87.477,51.13,87.5,50.569,87.5,50.002z" +
        "M56.615,56.844c-1.935,2.727-5.101,5.805-9.763,5.805c-4.486,0-7.212-3.166-7.212-7.738c0-6.422,5.013-12.754,12.049-12.754" +
        "c3.958,0,6.245,2.551,7.124,4.486L56.615,56.844z");

        Button buttonWithGraphics = new Button();
        buttonWithGraphics.setGraphic(svg);

        // Bind the Image scale property to the buttons size
        svg.scaleXProperty().bind(buttonWithGraphics.widthProperty().divide(100));
        svg.scaleYProperty().bind(buttonWithGraphics.heightProperty().divide(100));

        // Declare a minimum size for the button
        buttonWithGraphics.setMinSize(MIN_BUTTON_SIZE, MIN_BUTTON_SIZE);

        root.getChildren().addAll(buttonWithGraphics);
        root.layoutBoundsProperty().addListener((observableValue, oldBounds, newBounds) -> {
                double size = Math.max(MIN_BUTTON_SIZE, Math.min(newBounds.getWidth(), newBounds.getHeight()));
                buttonWithGraphics.setPrefSize(size, size);
            }
        );

        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
中央图像是默认大小,因此它可以减小按钮大小,也可以增大按钮大小


N.B.-您可以计算并使用不同的按钮高度和宽度值。

重新调整svg而不是按钮本身大小的原因是什么?我想问的是如何调整按钮本身的大小。虽然我需要调整svg图像的大小,因为我的原始图片太大了。我不能在按钮上只显示一半的图片。但是如果有一种方法可以调整按钮的大小,这样svg也可以调整大小,那也可以。谢谢!我只有两个问题:1:如果我移除
按钮,为什么
按钮.setPrefSize(..)
不起作用?我的意思是,当设置了
按钮.setPrefSize(..)时,
按钮.setMinSize(..)不起任何作用,并且按钮可以占据任意多的空间,那么为什么这很重要呢?2:如果我想在一个矩形按钮内显示一个方形svg图像,同时保持图像的比例,那么我是否可以实现这一点?因为在这个实现中,图像会被拉伸。除非外部指定,对于按钮,其最小尺寸是其首选尺寸。因此,我们需要定义
button.setMinSize(..)
以使按钮比其正常大小变小。2.是的,你可以,只是保持图像的缩放比例与按钮的大小成比例。请参阅我的上一次更新:如果我使用此新图像,为什么这不起作用?图片不会根据其
按钮调整大小。理想情况下,您应该开始一个新问题,而不是堆积旧问题。尽管如此,我检查了SVGPath,我认为您需要首先修复它。你能用你的路径创建一个新的路径吗?好的。我只是觉得这会被认为是重复的。你想让我开始一个新问题吗?不管怎样,你想让我用JSFIDLE做什么?它似乎包含一个JavaScript编译器,而不是普通的Java编译器。