Remove padding/margin from JavaFX Label
Asked Answered
H

4

8

Is there a way to remove the default space (padding/margin) that JavaFX label adds? I want to get rid of the space displayed between the black lines on the image below:

enter image description here

Source code:

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();
    }
}
Harl answered 18/12, 2015 at 16:23 Comment(0)
B
8

You can achieve that by adding -fx-padding: -10 0 0 0; to the list of your styles.

For more flexible solution you can use FontMetrics information:

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

NB: You need to call that code after scene.show(). Before that graphics engine is not ready to provide correct metrics.

Botts answered 18/12, 2015 at 17:59 Comment(2)
Is there a dynamic approach than hardcoding a value? I don't want to hardcode (-10 in your example) a value and later see that the actual text gets chopped offHarl
is there any other control that I can use which doesn't add the padding by default but just the text?Harl
R
9

One of the more dynamic ways to do this is to use a Text instead of a Label and set the boundsType as VISUAL. This results in a Text without any padding on the any of the sides of the Text, irrespective of the font size.

Text text = new Text();
text.setBoundsType(TextBoundsType.VISUAL);
Renin answered 4/12, 2016 at 14:10 Comment(1)
Can't we set it using CSS?Passer
B
8

You can achieve that by adding -fx-padding: -10 0 0 0; to the list of your styles.

For more flexible solution you can use FontMetrics information:

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

NB: You need to call that code after scene.show(). Before that graphics engine is not ready to provide correct metrics.

Botts answered 18/12, 2015 at 17:59 Comment(2)
Is there a dynamic approach than hardcoding a value? I don't want to hardcode (-10 in your example) a value and later see that the actual text gets chopped offHarl
is there any other control that I can use which doesn't add the padding by default but just the text?Harl
D
4

For me it was easiest to just use setPadding.

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

This way I did not have to deal with the css-style sheet.

Deity answered 29/5, 2019 at 11:52 Comment(0)
K
0

For more details see my post here Substructure styling

You could also do it like this after the stage.show().

With the example of an separator:

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

stage.show()

Do

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

or this way index 0 because it has only one element at index 0 which is an Region with style calss .line

separator.getChildrenUnmodifiable().get(0).setStyle(""
    + "-fx-border-insets: 0px;"
    + "-fx-border-width: 0px;"
    + "");
Karlise answered 7/5, 2019 at 6:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.