当前位置: 首页 > 知识库问答 >
问题:

Javafx textfield调整为文本长度?

雍焱
2023-03-14

大家好,我正在构建一个聊天服务器,我在屏幕上使用一个文本字段来键入用户写的聊天消息,这个想法是,当他键入消息时,它就像一个泡泡在一个人的头上一样工作。

我的问题是,为了不使文本框太大或太小,有没有一种方法可以使文本框调整大小(如果你愿意,可以修剪),以便它调整到文本字段中所写的文本?

附言。我使用JavaFx scenebuilder来完成所有这些。

共有1个答案

龚承嗣
2023-03-14

您可以在com.sun.javafx.scene.control.skin.utils中使用ComputetexTwidth方法。该方法在javafx.scene.control.label类中用于计算标签内容的最小宽度。

我是这样解决我的问题的:

field.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> ob, String o,
                String n) {
            // expand the textfield
            field.setPrefWidth(TextUtils.computeTextWidth(field.getFont(),
                    field.getText(), 0.0D) + 10);
        }
    });

我为textproperty添加了一个侦听器,并且每次更改文本时,我都会更改textfield的prefwidt

package me.jone30rw.fxcontrol;

import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextBoundsType;

public class TextUtils {

    static final Text helper;
    static final double DEFAULT_WRAPPING_WIDTH;
    static final double DEFAULT_LINE_SPACING;
    static final String DEFAULT_TEXT;
    static final TextBoundsType DEFAULT_BOUNDS_TYPE;
    static {
        helper = new Text();
        DEFAULT_WRAPPING_WIDTH = helper.getWrappingWidth();
        DEFAULT_LINE_SPACING = helper.getLineSpacing();
        DEFAULT_TEXT = helper.getText();
        DEFAULT_BOUNDS_TYPE = helper.getBoundsType();
    }

    public static double computeTextWidth(Font font, String text, double help0) {
        // Toolkit.getToolkit().getFontLoader().computeStringWidth(field.getText(),
        // field.getFont());

        helper.setText(text);
        helper.setFont(font);

        helper.setWrappingWidth(0.0D);
        helper.setLineSpacing(0.0D);
        double d = Math.min(helper.prefWidth(-1.0D), help0);
        helper.setWrappingWidth((int) Math.ceil(d));
        d = Math.ceil(helper.getLayoutBounds().getWidth());

        helper.setWrappingWidth(DEFAULT_WRAPPING_WIDTH);
        helper.setLineSpacing(DEFAULT_LINE_SPACING);
        helper.setText(DEFAULT_TEXT);
        return d;
    }
}
 类似资料:
  • 问题内容: 我需要一个textarea,在框中输入文字,它会根据需要增加长度,以避免必须处理滚动条,并且在删除文本后需要缩小!我不想沿着mootools或jquery路线走,因为我有一个轻量级的表单。 问题答案: 您可以通过设置为,然后读取属性来检查内容的高度: 它可以在Firefox 3,IE 7,Safari,Opera和Chrome下运行。

  • 问题内容: 不是最好的标题,但是无论如何… 我有一个带有元素和一些文本的元素。 如果文本长于一行,那么我会得到: 换句话说,它占用了整个最大宽度,但是由于单词向下移动,因此右侧有一个空白空间。 有没有办法做到这一点呢? 问题答案: 单独的CSS不可能 根据BoltClock在此答案中,这是不可能的。这种解释是有道理的。为了使换行开始,行需要达到设置。完成后,它会自动换行,但不会收缩,因为它使用该大

  • 我使用的是iText 5.5.8 for Java。遵循默认的、简单的文本提取过程,即。 我很惊讶地在输出中发现了几个错误,特别是所有字母ds都变成了OS。 PDF示例可在http://www.fpozzi.com/stampastopper/download/文件名为0116_lr.PDF.抱歉,无法共享直接链接。这是一些文本提取的基本代码 在@Blagae和@MKL回答后编辑 在开始摆弄iTe

  • 我正在寻找一种比断点更精确的解决方案。我知道这需要JavaScript,但我很难找到合适的插件。 我网站上的大多数文本将保持不变,或者我将通过媒体查询对其进行调整(比如平板电脑和手机的90%)。这很好,但我正在为我的导航菜单和横幅等领域寻找“实时”解决方案。 在此处查看站点 您可以使用基本字体大小为100%的ems查看我的所有文本的相对大小 如果你调整网站的大小,你会注意到菜单“崩溃”,因为字体太

  • 问题内容: 我有一个只有一个标签的自定义。当我在StackOverflow上阅读时,我还将Interface Builder中的行数设置为0。 这是视图控制器要使用的部分: 因此,不做任何更改-它仍然将文本省略为1行,并且我需要标签的行数尽可能多,并且单元格的大小也适合标签。 问题答案: 您需要使用自动调整大小的单元格。 在情节提要或xib中,必须确保在单元格中设置了适当的约束。不要在标签中设置预