【问题标题】:Remove padding/margin from JavaFX Label从 JavaFX 标签中删除填充/边距
【发布时间】:2016-03-25 09:54:13
【问题描述】:

有没有办法删除 JavaFX 标签添加的默认空间(填充/边距)?我想去掉下图中黑线之间显示的空间:

源代码:

public class LabelTest extends Application
{

    @Override
    public void start(final Stage primaryStage)
    {
        final Group root = new Group();
        final Scene scene = new Scene(root, 300, 130, Color.WHITE);

        final GridPane gridpane = new GridPane();
        gridpane.setPadding(new Insets(5));
        gridpane.setHgap(10);
        gridpane.setVgap(10);

        final Label label = new Label("Label");
        label.setStyle("-fx-font-size:44px;-fx-font-weight: bold;-fx-text-fill:#5E34B1;-fx-background-color:#ffc300;");
        GridPane.setHalignment(label, HPos.CENTER);
        gridpane.add(label, 0, 0);

        root.getChildren().add(gridpane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

【问题讨论】:

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


    【解决方案1】:

    执行此操作的更动态方法之一是使用Text 而不是标签并将boundsType 设置为VISUAL。这会导致文本在文本的任何一侧都没有任何填充,而与字体大小无关。

    Text text = new Text();
    text.setBoundsType(TextBoundsType.VISUAL);
    

    【讨论】:

    • 不能用 CSS 设置吗?
    【解决方案2】:

    您可以通过将-fx-padding: -10 0 0 0; 添加到您的样式列表中来实现。

    如需更灵活的解决方案,您可以使用FontMetrics 信息:

    FontMetrics metrics = Toolkit.getToolkit().getFontLoader().getFontMetrics(label.getFont());
    label.setPadding(new Insets(-metrics.getDescent(), 0, 0, 0));
    

    注意:您需要在scene.show() 之后调用该代码。在该图形引擎尚未准备好提供正确指标之前。

    【讨论】:

    • 有没有比硬编码值更动态的方法?我不想硬编码(在您的示例中为 -10)一个值,然后看到实际文本被截断
    • 是否还有其他我可以使用的控件,默认情况下不添加填充,而只添加文本?​​
    【解决方案3】:

    对我来说,使用 setPadding 是最简单的。

    label.setPadding(new Insets(-2,0,0,0)); //top, right, bottom, left
    

    这样我就不必处理 css 样式表了。

    【讨论】:

      【解决方案4】:

      更多详情请看我的帖子Substructure styling

      您也可以在 stage.show() 之后这样做。

      以分隔符为例:

      Separator separator = new Separator();
      separator.setStyle(""
          + "-fx-border-width: 1px;"
          + "-fx-border-color: black;"
          + "-fx-padding: 0px;"
          + "");
      
      stage.show()
      

      Node line = separator.lookup(".line");
      line.setStyle(""
          + "-fx-border-insets: 0px;"
          + "-fx-border-width: 0px;"
          + "");
      

      或者这种方式索引 0 因为它在索引 0 处只有一个元素,这是一个风格为 .line

      的区域
      separator.getChildrenUnmodifiable().get(0).setStyle(""
          + "-fx-border-insets: 0px;"
          + "-fx-border-width: 0px;"
          + "");
      

      【讨论】: