gpt4 book ai didi

JavaFX TextField 使用等宽字体调整大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:25 26 4
gpt4 key购买 nike

我想制作一个自动调整大小以适应其内容大小的 TextField。如果我使用 textField.prefColumnCountProperty().bind(textField.textProperty().length()); 它会起作用。但是,一旦我使用等宽字体,TextField 就会调整大小,但在我选择它之前,文本是不可见的。如何将调整大小属性与等宽字体一起使用?

在选择文本之前:

Before selecting the text

选择文本后:

After selecting the text

主.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() 时出现设置为左侧(BASELINE_LEFTBOTTOM_LEFTCENTER_LEFTTOP_LEFT),因此只需使用 textField.setAlignment(Pos.CENTER);


长答案,因为这仍然是一种奇怪的行为:

文本位置不正确,所有文本都移到可见区域的左侧。看起来这种行为的原因是文本字段的宽度太小了。

enter image description here

这是一个小示例,其中键入文本“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));

另见:What is the prefColumnCount property for a TextField?

关于JavaFX TextField 使用等宽字体调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50344657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com