JavaFx可扩展的Textfield示例 [英] JavaFx expandable Textfield sample

查看:1098
本文介绍了JavaFx可扩展的Textfield示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的公司,我们有一个任务来实现一个autoexpandable textfield。
由于默认情况下不提供此功能,我们必须从头开始。网络上有许多可能性,它是如何实现的,但没有人为之工作,所以我们决定将我们的代码放在SO上,所以其他开发人员也可以使用它。
因为不可能扩展文本字段,所以解决方案基于textarea:

in my company we got a task to implement an autoexpandable textfield. As this functionality is not provided by default we had to develop it from scratch. There are many posibilities across web, how it can be achived, but no one worked for as, so we decided to put our code on SO, so other devs can also use it. As it is not possbile to expand a textfield the solution is textarea based:

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

我希望它可以帮助你:)

I hope it helps you :)

推荐答案

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

you can set PrefWidth in the listener of the text field.

//添加列表器

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

这篇关于JavaFx可扩展的Textfield示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆