效果图

image.png
注:未输入内容时显示Hint,获取到焦点以后自动清空Hint,失去焦点且内容为空时,再次显示Hint

代码实现

  1. import javafx.beans.value.ChangeListener;
  2. import javafx.beans.value.ObservableValue;
  3. import javafx.event.EventHandler;
  4. import javafx.scene.control.TextArea;
  5. import javafx.scene.input.KeyEvent;
  6. import javafx.scene.input.MouseEvent;
  7. public class HintTextArea extends TextArea {
  8. private String mHint = "";
  9. public HintTextArea(){
  10. super();
  11. this.setOnMouseClicked(new EventHandler<MouseEvent>() {
  12. @Override
  13. public void handle(MouseEvent event) {
  14. cleanHint();
  15. }
  16. });
  17. this.setOnKeyPressed(new EventHandler<KeyEvent>() {
  18. @Override
  19. public void handle(KeyEvent event) {
  20. cleanHint();
  21. }
  22. });
  23. this.focusedProperty().addListener(new ChangeListener<Boolean>() {
  24. @Override
  25. public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
  26. if (oldValue&&!newValue&&getLength()==0&&!mHint.isEmpty()){
  27. setHint(mHint);
  28. }
  29. }
  30. });
  31. }
  32. private void cleanHint(){
  33. if (mHint.isEmpty()){
  34. return;
  35. }
  36. if (getText().equals(mHint)){
  37. clear();
  38. setStyle("-fx-text-fill: #000000");
  39. }
  40. }
  41. public void setHint(String hint){
  42. this.mHint = hint;
  43. this.setText(mHint);
  44. this.setStyle("-fx-text-fill: #008B8B");
  45. }
  46. }