JavaFX - получить высоту элемента Label в пикселях (или выровнять метку по вертикали, используя центр ее высоты) - PullRequest
0 голосов
/ 03 июля 2019

У меня есть программа, которая рисует график с осью со значениями.Значения должны быть нарисованы каждые 'y' пикселей.

Как показано на рисунке, черные линии показывают, где эти значения нарисованы.Соответствующая метка рисуется рядом с каждым значением оси.

Проблема в том, что без смещения источник берется в верхнем левом углу метки, поэтому текст не выравнивается по вертикали относительно линии.

Чтобы исправить это, я думаю получить высоту надписи и вручную сдвинуть позицию y для надписи.

Как узнать высоту надписи в пикселях?

Label vertical alignment

Это исходный код, используемый для рисования линий и надписей:

public void drawAxis() {
    int i = 0;
    for(i=0; i<20; i++) {
        long y_pos = 0;
        y_pos = i*100;
        Line gridTick = new Line(0, y_pos, 20, y_pos);

        Label gridLabel = new Label(getStringFromValue(y_pos));
        gridLabel.setTranslateX(30);
        gridLabel.setTranslateY(y_pos);

        rightAxisPanel.getChildren().add(gridTick);
        rightAxisPanel.getChildren().add(gridLabel);
    }
}

1 Ответ

1 голос
/ 03 июля 2019

Просто установите, убедитесь, что размер метки больше, чем нужно, а границы симметричны координатам y линии. Пусть Label справится с выравниванием.

Предполагая, что подкласс Parent, который вы расширяете, не изменяет положение макета, вы можете сделать

public void drawAxis() {
    int i = 0;
    for(i=0; i<20; i++) {
        double y_pos = i*100;
        Line gridTick = new Line(0, y_pos, 20, y_pos);

        Label gridLabel = new Label(getStringFromValue(y_pos));
        gridLabel.setLayoutX(30);

        // make sure label bounds range from y_pos-25 to y_pos+25 vertically
        gridLabel.setLayoutY(y_pos-25);
        gridLabel.setPrefHeight(2*25);
        gridLabel.setMinHeight(Region.USE_PREF_SIZE);
        // set text alignment in label area
        gridLabel.setAlignment(Pos.CENTER_LEFT);

        rightAxisPanel.getChildren().addAll(gridTick, gridLabel);
    }
}

Предполагается, что вы не используете размеры шрифта, для которых требуется вертикальное отображение более 50 пикселей.

...