【问题标题】:Automatically adjust the width of a JavaFX TextArea自动调整 JavaFX TextArea 的宽度
【发布时间】:2016-05-03 12:09:16
【问题描述】:

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

a)"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"

b)“MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM”

这两个字符串由 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)'

任何帮助都会受到高度评价。如果需要,我可以提供更多信息。

提前致谢!

【问题讨论】:

  • 您似乎将 AWT Font 类与 JavaFX Font 类混淆了。有一个简单的no method 称为getStringBounds()
  • 好的,谢谢!可能是这种情况,是的,我想。但是您对我应该做什么以及如何做有什么建议吗?

标签: java javafx fonts textarea javafx-8


【解决方案1】:

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

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

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

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);
    }
}

【讨论】:

  • 谢谢!今天/明天我会试试那个,然后告诉你!
  • 为什么我在“t.setFont(textArea.getFont());”处收到错误无法解析方法“getFont()”
猜你喜欢
  • 2012-11-19
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 2020-10-11
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
相关资源
最近更新 更多