JavaFx可扩展的Textfield示例

时间:2017-05-23 17:16:01

标签: javafx textfield

在我的公司,我们有一个任务来实现一个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();
    }
  }
});
}
}

我希望它可以帮助你:)

2 个答案:

答案 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());
    }
});'