gpt4 book ai didi

css - JavaFX TextArea 垂直对齐

转载 作者:行者123 更新时间:2023-11-28 09:33:19 28 4
gpt4 key购买 nike

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

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

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

有人知道如何让我的文本出现在 textArea 的垂直中心吗?

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

enter image description here

最佳答案

我只能通过使用一些 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 ;
}

由于我不太明白的原因,如果没有附加样式表,这根本不起作用。

关于css - JavaFX TextArea 垂直对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41597890/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com