簡體   English   中英

JavaFX TextField使用等寬字體調整大小

[英]JavaFX TextField resize with monospace font

我想創建一個自動調整大小到其內容大小的TextField。 如果我使用textField.prefColumnCountProperty().bind(textField.textProperty().length()); 有用。 但是一旦我使用等寬字體,TextField會調整大小,但文本在我選擇之前是不可見的。 如何使用等寬字體的resize屬性?

在選擇文本之前:

在選擇文本之前

選擇文字后:

選擇文本后

Main.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

Controller.java

package sample;

import javafx.fxml.FXML;
import javafx.scene.control.TextField;


public class Controller {

    @FXML
    private TextField textField;

    @FXML
    public void initialize() {
        textField.setStyle("-fx-font-family: 'monospaced';");
        textField.prefColumnCountProperty().bind(textField.textProperty().length());
    }

}

sample.fxml

<?import javafx.scene.layout.GridPane?>

<?import javafx.scene.control.TextField?>
<GridPane fx:controller="sample.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
        <TextField fx:id="textField"></TextField>
</GridPane>

短:

僅當getAlignment()設置為left( BASELINE_LEFTBOTTOM_LEFTCENTER_LEFTTOP_LEFT )時才會出現此問題,因此只需使用textField.setAlignment(Pos.CENTER);


很長的答案,因為這仍然是一個奇怪的行為:

文本定位不正確,所有文本都移動到可見區域的左側。 看起來這種行為的原因是文本字段的寬度很小。

在此輸入圖像描述

這是一個小例子,其中鍵入文本“test”,然后將光標移動到左側。


嗯,我想這是TextFieldSkin.computePrefWidth如何工作的問題,因為它不計算光標的大小。

您可以創建自己的TextFieldSkin,computePrefWidth返回一個更大的值:(此代碼示例使用com.sun.javafx.scene.control.skin.TextFieldSkin.TextFieldSkin for Java-8)

textField.setSkin(new TextFieldSkin(textField){
    @Override
    protected double computePrefWidth(double height, double topInset, double rightInset, double bottomInset, double leftInset) {
        return 1 + super.computePrefWidth(height, topInset, rightInset, bottomInset, leftInset);
    }
});

您也可以使用prefColumnCount

textField.prefColumnCountProperty().bind(textField.textProperty().length().add(1));

另請參閱: TextField的prefColumnCount屬性是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM