在我的公司,我们有一个任务来实现一个autoexpandable textfield。 由于默认情况下不提供此功能,因此我们必须从头开始开发。网络上有许多可能性,它是如何实现的,但没有人为之工作,因此我们决定将我们的代码放在SO上,因此其他开发人员也可以使用它。 由于不可能扩展文本字段,因此解决方案基于textarea:
public class TextFieldExpandable extends TextArea {
private final double DEFAULT_HEIGHT = 17.0;
public TextFieldExpandable() {
setMinHeight(DEFAULT_HEIGHT);
setPrefHeight(DEFAULT_HEIGHT);
setMaxHeight(DEFAULT_HEIGHT);
disableEnter();
}
@Override
protected void layoutChildren() {
super.layoutChildren();
setWrapText(true);
setPadding(new Insets(0, 0, 0, 0));
ScrollPane scrollPane = (ScrollPane)lookup(".scroll-pane");
scrollPane.setHbarPolicy(ScrollBarPolicy.NEVER);
scrollPane.setVbarPolicy(ScrollBarPolicy.NEVER);
scrollPane.setPadding(new Insets(0, 0, 0, 0));
StackPane viewport = (StackPane) scrollPane.lookup(".viewport");
viewport.setPadding(new Insets(0, 0, 0, 0));
Region content = (Region) viewport.lookup(".content");
content.setPadding(new Insets(-1, 1, 0, 1));
Text text = (Text) content.lookup(".text");
text.textProperty().addListener((property) -> {
double textHeight = text.getBoundsInLocal().getHeight();
if (textHeight < DEFAULT_HEIGHT) {
textHeight = DEFAULT_HEIGHT;
}
textHeight = textHeight + 1;
setMinHeight(textHeight);
setPrefHeight(textHeight);
setMaxHeight(textHeight);
});
}
private void disableEnter() {
setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (event.getCode() == KeyCode.ENTER) {
event.consume();
}
}
});
}
}
我希望它可以帮助你:)
答案 0 :(得分:0)
这对我来说很好
field.setMinWidth(40);
field.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue,
String newValue) {
int len = newValue.length();
field.setPrefWidth(len*10);
if(newValue.isEmpty() || oldValue.isEmpty()){
field.setPrefWidth(40);
}
});
答案 1 :(得分:-1)
您可以在文本字段的侦听器中设置PrefWidth。
//添加列表器
'textField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
textField.setPrefWidth(textField.getText().length());
}
});'