Изменение размера JavaFX TextField с моноширинным шрифтом - PullRequest
0 голосов
/ 15 мая 2018

Я хочу создать TextField, который автоматически изменяет размер своего содержимого. Если я использую textField.prefColumnCountProperty().bind(textField.textProperty().length());, это работает. Но как только я использую моноширинный шрифт, TextField изменяет размер, но текст становится невидимым, пока я его не выберу. Как я могу использовать свойство resize с моноширинным шрифтом?

Перед выделением текста:

Before selecting the text

После выделения текста:

After selecting the text

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>

1 Ответ

0 голосов
/ 15 мая 2018

Short:

Проблема возникает, только когда getAlignment() установлено влево (BASELINE_LEFT, BOTTOM_LEFT, CENTER_LEFT или TOP_LEFT), поэтому просто используйте textField.setAlignment(Pos.CENTER);.


Длинный ответ, так как это все еще странное поведение:

Текст расположен неправильно, весь текст перемещен влево из видимой области. Кажется, что причина этого поведения в том, что ширина текстового поля слишком мала.

enter image description here

Это небольшой пример, когда текст «test» набирается, а затем перемещает курсор влево.


Ну, я думаю, это проблема, как работает TextFieldSkin.computePrefWidth, так как он не вычисляет размер курсора.

Вы можете создать свой собственный TextFieldSkin, который computePrefWidth возвращает большее значение: (В этом примере кода используется com.sun.javafx.scene.control.skin.TextFieldSkin.TextFieldSkin для 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));

См. Также: Что такое свойство prefColumnCount для TextField?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...