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

3

我希望在一个按钮中放置一张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 对象中,然后对该 Group 进行缩放,例如:
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图像也将随之重新调整大小。然而,这样做似乎并不会改变按钮的大小属性。这意味着包含按钮的面板仍将占据与未调整大小的按钮相同的空间。在面板上设置最大大小也无济于事。此外,setScaleY和X方法会重新调整整个按钮,包括按钮的边框。这使得该按钮的外观与包含纯文本内容的按钮不同。我的面板将包含具有SVG内容和纯文本内容的按钮,它们除了内容外应该看起来完全相同。

更新2:@ItachiUchiha的编辑回答使一切变得清晰明了。标记为答案。


重新调整SVG而不是按钮本身的原因是什么? - ItachiUchiha
我想知道如何调整按钮本身的大小。由于我的原始图片太大,我还需要调整SVG图像的大小。我不能让按钮中只显示一半的图片。但是,如果有一种方法可以调整按钮大小以使SVG也随之调整大小,那也可以。 - Jonatan Stenbacka
1个回答

5

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

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

编辑 - 根据父元素调整按钮大小。

如果您想根据父元素重新调整按钮大小,并且还要按比例缩放图像。您可以将图像的比例属性绑定到按钮的高度和宽度上。每当父元素的大小发生变化时,也要相应地更改按钮的prefSize。

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

中心图像是默认大小,因此在减小和增加按钮大小时都能起作用。

输入图片描述

注意:您可以计算并使用不同的高度和宽度值来制作按钮。


谢谢!我有两个问题:1:如果我删除button.setMinSize(..),为什么button.setPrefSize(..)不起作用?我的意思是,当设置了button.setPrefSize(..)时,button.setMinSize(..)不起作用,按钮可以占用任意空间,那么它为什么很重要?2:如果我想在矩形按钮内显示正方形SVG图像并保持图像的比例,是否有任何方法可以使其工作?因为使用此实现,图像会被拉伸。 - Jonatan Stenbacka
  1. 除非外部指定,按钮的最小尺寸为其首选尺寸。因此,我们需要定义 button.setMinSize(..) 来使按钮缩小到比正常尺寸更小。
  2. 是的,您可以这样做,只需将图像的缩放与按钮的大小成比例即可。
- ItachiUchiha
请查看我的最新更新:如果我使用这张新图片,为什么它不能正常工作?该图片不会根据其“按钮”进行调整大小。 - Jonatan Stenbacka
当我在JSFiddle测试SVGPath时,我没有得到任何输出,即没有图像。但是,如果我在这个答案中加载它,我就能看到图片。这是什么意思? - Jonatan Stenbacka
我不确定,但如果我要猜的话,我建议您再次检查您的路径。 - ItachiUchiha
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接