【问题标题】:JavaFx expandable Textfield sampleJavaFx 可扩展文本域示例
【发布时间】:2017-05-23 17:16:01
【问题描述】:

在我的公司,我们的任务是实现一个可自动扩展的文本字段。 由于默认情况下不提供此功能,我们不得不从头开始开发它。网络上有很多可能性,如何实现它,但没有人适合,所以我们决定把我们的代码放在 SO 上,这样其他开发人员也可以使用它。 由于无法扩展文本字段,因此解决方案基于文本区域:

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

希望对你有帮助:)

【问题讨论】:

    标签: javafx textfield


    【解决方案1】:

    这对我来说很好

     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);
            }        
         });
    

    【讨论】:

      【解决方案2】:

      您可以在文本字段的监听器中设置 PrefWidth。

      // 添加监听器

      'textField.textProperty().addListener(new ChangeListener<String>() {
          @Override
          public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
              textField.setPrefWidth(textField.getText().length());
          }
      });'
      

      【讨论】:

      • 我在监听器内部添加了Text text = new Text(newValue); Platform.runLater(() -&gt; textField.setPrefWidth(text.getBoundsInLocal().getWidth()));,在监听器外部添加了textField.setMinWidth(100);。 TextField 会增长,但里面的 String 会向后扩展。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 2019-02-15
      • 2011-12-06
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多