gpt4 book ai didi

java - 自动调整 JavaFX TextArea 的宽度

转载 作者:行者123 更新时间:2023-11-29 04:46:15 31 4
gpt4 key购买 nike

所以,我一直在研究一个由 TextAreas 组成的动态 UI,但问题是 TextAreas 的输入来自数据库,因此具有不同的长度。而且我还必须根据数据库中字符串的长度使 TextAreas 动态化。这是一项艰巨的任务,因为字符串的长度不会自动告知其以像素为单位的长度。因此,例如字符串:

a)"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"

b)“MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM”

这两个字符串由 70 个字母组成,但它们的像素长度完全不同。我需要确保 TextArea 的宽度基于字符串的像素长度。

我试过用这样的东西:

int textwidth = (int) font.getStringBounds(ta.getText(), frc).getWidth();

但它给我错误,因为字体如下:

textLabel.getFont()
-> Font[name=System Regular, family=System, style=Regular, size=12.0]

但是在前面的 getStringBounds 方法中使用这种字体会给我错误:

Cannot resolve method 'getStringBounds(java.lang.String, java.awt.font.FontRenderContext)'

我们将不胜感激任何帮助。如果需要,我可以提供更多信息。

提前致谢!

最佳答案

您可以通过创建一个 Text 对象来测量一些文本的大小,将它放在一个 Pane 中(例如 StackPane)并调用 layout() 在 Pane 上,然后获取文本的布局边界。将字体设置为您要在文本区域中使用的相同字体。

唯一剩下的问题是文本区域的边框需要一些填充等,下面的代码示例仅使用固定填充(通过反复试验建立)但效果很好。如果需要,您可能可以对此进行改进。

在文本字段中输入内容并按回车键;它将更新文本区域的文本和大小:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class SizeTextAreaToString extends Application {

@Override
public void start(Stage primaryStage) {
TextField enterField = new TextField();
TextArea textArea = new TextArea();
textArea.setPrefRowCount(1);

enterField.setOnAction(e -> sizeTextAreaToText(textArea, enterField.getText()));

VBox root = new VBox(5, enterField, textArea);
VBox.setVgrow(textArea, Priority.NEVER);
root.setPadding(new Insets(5));
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
}

private void sizeTextAreaToText(TextArea textArea, String text) {
Text t = new Text(text);
t.setFont(textArea.getFont());
StackPane pane = new StackPane(t);
pane.layout();
double width = t.getLayoutBounds().getWidth();
double padding = 20 ;
textArea.setMaxWidth(width+padding);
textArea.setText(text);
}

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

关于java - 自动调整 JavaFX TextArea 的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003753/

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