8

こんにちは、私はチャットサーバーを構築しています。画面上のテキストフィールドを使用して、ユーザーが書いたチャットメッセージを入力します。メッセージを入力すると、頭の上の泡のように機能するという考えです。

私の質問は、テキストボックスが大きすぎたり小さすぎたりしないようにするために、テキストボックスのサイズを変更して(必要に応じてトリミングして)、テキストフィールドに書かれたテキストに合わせて調整する方法はありますか?

PS私はJavaFxシーンビルダーを使用してこれらすべてを行っています。

4

6 に答える 6

20

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

にリスナーを追加しました。textPropertyテキストを変更するたびに、テキストフィールドの を変更しprefWidthます。

注: がpublic でない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;
    }
}
于 2013-09-04T08:08:42.640 に答える
8

JavaFX 8 以降では、これが最も単純です。

textField.prefColumnCountProperty().bind(textField.textProperty().length());
于 2016-07-08T11:46:56.987 に答える
4

舞台裏でコーディングを行う時が来ました(ビルダー):)。
次のコード チャンクはきちんとした解決策ではありませんが、ないよりはましです。:)

// 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.
    }
});
于 2012-10-05T13:35:33.193 に答える