こんにちは、私はチャットサーバーを構築しています。画面上のテキストフィールドを使用して、ユーザーが書いたチャットメッセージを入力します。メッセージを入力すると、頭の上の泡のように機能するという考えです。
私の質問は、テキストボックスが大きすぎたり小さすぎたりしないようにするために、テキストボックスのサイズを変更して(必要に応じてトリミングして)、テキストフィールドに書かれたテキストに合わせて調整する方法はありますか?
PS私はJavaFxシーンビルダーを使用してこれらすべてを行っています。
こんにちは、私はチャットサーバーを構築しています。画面上のテキストフィールドを使用して、ユーザーが書いたチャットメッセージを入力します。メッセージを入力すると、頭の上の泡のように機能するという考えです。
私の質問は、テキストボックスが大きすぎたり小さすぎたりしないようにするために、テキストボックスのサイズを変更して(必要に応じてトリミングして)、テキストフィールドに書かれたテキストに合わせて調整する方法はありますか?
PS私はJavaFxシーンビルダーを使用してこれらすべてを行っています。
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;
}
}
JavaFX 8 以降では、これが最も単純です。
textField.prefColumnCountProperty().bind(textField.textProperty().length());
舞台裏でコーディングを行う時が来ました(ビルダー):)。
次のコード チャンクはきちんとした解決策ではありませんが、ないよりはましです。:)
// 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.
}
});