所以,我一直在研究一个动态UI,它由TextAreas组成,但问题是TextAreas的输入来自数据库,因此具有不同的长度。我还必须根据数据库中字符串的长度使TextAreas动态化。这是一项艰巨的任务,因为字符串的长度不会自动以像素为单位来表示其长度。 所以,例如字符串:
一) “iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii”
b)中 “MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM”
这两个字符串由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)'
任何帮助都会受到高度关注。如果需要,我可以提供更多信息。
提前致谢!
答案 0 :(得分:3)
您可以通过创建Text
对象,将其放在窗格(例如StackPane
)并在窗格上调用layout()
来测量某些文本的大小,然后获取布局文本的界限。将字体设置为您要在文本区域中使用的相同字体。
唯一剩下的问题是文本区域需要一些填充边框等,下面的代码示例只使用固定填充(通过试错法建立),但效果很好。如果需要,你可以改进它。
在文本字段中输入内容并按Enter键;它将更新文本区域的文本和大小:
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);
}
}