首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javafx文本字段是否调整为文本长度?

问Javafx文本字段是否调整为文本长度?
EN

Stack Overflow用户
提问于 2012-10-05 08:18:38
回答 6查看 31.6K关注 0票数 8

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

我的问题是,为了不让文本框太大或太小,有没有一种方法可以让文本框调整大小(如果你愿意,可以裁剪),使其适应文本字段中写入的文本?

附注:我正在使用JavaFx场景构建器来完成所有这些工作。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-10-05 21:35:33

现在是时候在幕后进行一些编码了(Builder) :)。

下面的代码块不是一个整洁的解决方案,但总比没有好。:)

代码语言:javascript
复制
// define width limits
textField.setMinWidth(50);
textField.setPrefWidth(50);
textField.setMaxWidth(400);
// add listner
textField.textProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        textField.setPrefWidth(textField.getText().length() * 7); // why 7? Totally trial number.
    }
});
票数 4
EN

Stack Overflow用户

发布于 2013-09-04 16:08:43

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

我解决了我的问题如下:

代码语言:javascript
复制
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添加了一个侦听器,每次文本更改时,我都会更改文本字段的prefWidth。

注意:只要Utils.computeTextWidth()是而不是公共,我就会将源代码复制到一个新的类(TextUtils)中。

以下是完整的源代码:

代码语言:javascript
复制
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;
    }
}
票数 20
EN

Stack Overflow用户

发布于 2014-09-03 19:57:24

在JavaFX 8中,有一个解决方案,代码如下:

代码语言:javascript
复制
TextField tf = new TextField();
// Set Max and Min Width to PREF_SIZE so that the TextField is always PREF
tf.setMinWidth(Region.USE_PREF_SIZE);
tf.setMaxWidth(Region.USE_PREF_SIZE);
tf.textProperty().addListener((ov, prevText, currText) -> {
    // Do this in a Platform.runLater because of Textfield has no padding at first time and so on
    Platform.runLater(() -> {
        Text text = new Text(currText);
        text.setFont(tf.getFont()); // Set the same font, so the size is the same
        double width = text.getLayoutBounds().getWidth() // This big is the Text in the TextField
                + tf.getPadding().getLeft() + tf.getPadding().getRight() // Add the padding of the TextField
                + 2d; // Add some spacing
        tf.setPrefWidth(width); // Set the width
        tf.positionCaret(tf.getCaretPosition()); // If you remove this line, it flashes a little bit
    });
});
tf.setText("Hello World!");

  • In JavaFX 2.2这段代码几乎没有什么限制。您不能设置字体(因此,如果您不使用std-font,则必须手动设置)。
  • 您无法从TextField获取填充(因此,如果您知道填充,请将其编写为硬编码)。

快乐的编码,

Kalasch

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12737829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档