Javafx文本字段调整为文本长度?

Mar*_*sen 7 user-interface javafx textfield

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

我的问题是为了不使文本框太大或太小有没有办法使文本框调整大小(如果你愿意修剪)所以它适应文本字段中写的文字?

PS我正在使用JavaFx场景构建器来完成所有这些工作.

Moh*_*any 16

你可以在中使用computeTextWidth方法com.sun.javafx.scene.control.skin.Utils.该方法在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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

我已经添加了一个监听器textProperty,并且每次更改文本时都会更改文本prefWidth字段.

注意:只要Utils.computeTextWidth()不公开的,我抄的源代码,一个新的类(TextUtils).

这是完整的源代码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的解决方案! (2认同)

Kal*_*hni 8

在JavaFX 8中,有一个解决方案,这里是代码:

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!");
Run Code Online (Sandbox Code Playgroud)
  • 在JavaFX 2.2中,此代码的作用很小.您无法设置字体(因此,如果您不使用标准字体,则必须手动设置).
  • 您无法从TextField获取填充(因此,如果您知道填充,则将其写入硬编码).

快乐的编码,
卡拉施


Emi*_* L. 8

从JavaFX 8开始,这是迄今为止最简单的:

textField.prefColumnCountProperty().bind(textField.textProperty().length());
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这对于可变宽度字体(在典型的TextField上很可能是默认设置)不能很好地工作。JavaFX似乎会计算最宽字符('W')的宽度之外的首选项宽度,这会高估实际输入的文本的长度。 (2认同)

Ulu*_*Biy 5

现在是时候在幕后做一些编码(建设者):).
以下代码块不是一个简洁的解决方案,但总比没有好.:)

// 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.
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这假设存在的每个javafx字体的每个字符都是7px宽,在任何情况下......这可能只是人类历史上最糟糕的假设.它就像是从(巨型)软管的水压飞入太空. (5认同)
  • @DonLarynx 正是我写的。不可能写得更简单……也许你应该向会说英语的人寻求帮助。 (2认同)