JavaFX TextArea垂直对齐

时间:2017-01-11 18:15:11

标签: css javafx textarea

我正在尝试将文本放在文本框中间的文本框中,垂直居中。我已经能够使用textArea.setStyle("-fx-text-alignment: center");在java中水平居中文本。

我考虑过使用Center Center或Bottom Center等参数通过-fx-text-alignment字符串来实现这些结果的可能性,但我正在通过窗口上的两个不同按钮处理水平和垂直对齐,以及因此,不希望实现逻辑来关联这两种方法。

我也试图切换textArea的-fx-alignment,但没有成功。

有没有人对如何让我的文字出现在textArea的垂直中心有任何想法?

编辑:下面是我当前的窗口,我试图操作的文本区域位于中心。

enter image description here

1 个答案:

答案 0 :(得分:4)

我只能通过对文本区域的各种子节点的大小使用CSS查找和侦听器对文本区域的布局进行一些粗暴的黑客攻击来找到解决方案。

也许有人可以提出更强大的功能,但我认为没有任何方法可以使用API​​。

这是一个有效的例子:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.geometry.Bounds;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.shape.Path;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class TextAreaAlignment extends Application {

    @Override
    public void start(Stage primaryStage) {
        TextArea textArea = new TextArea();

        Scene scene = new Scene(textArea, 400, 400);

        hackTextAreaLayout(textArea);


        scene.getStylesheets().add("style.css");
        primaryStage.setScene(scene);
        primaryStage.show();


    }

    private void hackTextAreaLayout(TextArea textArea) {
        textArea.applyCss();
        textArea.layout();

        ScrollPane textAreaScroller = (ScrollPane) textArea.lookup(".scroll-pane");
        Text text = (Text) textArea.lookup(".text");


        ChangeListener<? super Bounds> listener = 
                (obs, oldBounds, newBounds) -> centerTextIfNecessary(textAreaScroller, text);
        textAreaScroller.viewportBoundsProperty().addListener(listener);
        text.boundsInLocalProperty().addListener(listener);

    }

    private void centerTextIfNecessary(ScrollPane textAreaScroller, Text text) {
        double textHeight = text.getBoundsInLocal().getHeight();
        double viewportHeight = textAreaScroller.getViewportBounds().getHeight();
        double offset = Math.max(0, (viewportHeight - textHeight) / 2 );
        text.setTranslateY(offset);
        Parent content = (Parent)textAreaScroller.getContent();
        for (Node n : content.getChildrenUnmodifiable()) {
            if (n instanceof Path) { // caret
                n.setTranslateY(offset);
            }
        }
    }



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

style.css只有

.text-area .text {
    -fx-text-alignment: center ;
}

由于我无法理解的原因,如果没有附加样式表,这根本不起作用。