Java JTextField with input hint Java JTextField with input hint java java

Java JTextField with input hint


You could create your own:

import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import javax.swing.*;public class Main {  public static void main(String[] args) {    final JFrame frame = new JFrame();    frame.setLayout(new BorderLayout());    final JTextField textFieldA = new HintTextField("A hint here");    final JTextField textFieldB = new HintTextField("Another hint here");    frame.add(textFieldA, BorderLayout.NORTH);    frame.add(textFieldB, BorderLayout.CENTER);    JButton btnGetText = new JButton("Get text");    btnGetText.addActionListener(new ActionListener() {      @Override      public void actionPerformed(ActionEvent e) {        String message = String.format("textFieldA='%s', textFieldB='%s'",            textFieldA.getText(), textFieldB.getText());        JOptionPane.showMessageDialog(frame, message);      }    });    frame.add(btnGetText, BorderLayout.SOUTH);    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);    frame.setVisible(true);    frame.pack();  }}class HintTextField extends JTextField implements FocusListener {  private final String hint;  private boolean showingHint;  public HintTextField(final String hint) {    super(hint);    this.hint = hint;    this.showingHint = true;    super.addFocusListener(this);  }  @Override  public void focusGained(FocusEvent e) {    if(this.getText().isEmpty()) {      super.setText("");      showingHint = false;    }  }  @Override  public void focusLost(FocusEvent e) {    if(this.getText().isEmpty()) {      super.setText(hint);      showingHint = true;    }  }  @Override  public String getText() {    return showingHint ? "" : super.getText();  }}

If you're still on Java 1.5, replace the this.getText().isEmpty() with this.getText().length() == 0.


Here is a simple way that looks good in any L&F:

public class HintTextField extends JTextField {    public HintTextField(String hint) {        _hint = hint;    }    @Override    public void paint(Graphics g) {        super.paint(g);        if (getText().length() == 0) {            int h = getHeight();            ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);            Insets ins = getInsets();            FontMetrics fm = g.getFontMetrics();            int c0 = getBackground().getRGB();            int c1 = getForeground().getRGB();            int m = 0xfefefefe;            int c2 = ((c0 & m) >>> 1) + ((c1 & m) >>> 1);            g.setColor(new Color(c2, true));            g.drawString(_hint, ins.left, h / 2 + fm.getAscent() / 2 - 2);        }    }    private final String _hint;}


Here is a single class copy/paste solution:

import java.awt.Color;import java.awt.Graphics;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import javax.swing.plaf.basic.BasicTextFieldUI;import javax.swing.text.JTextComponent;public class HintTextFieldUI extends BasicTextFieldUI implements FocusListener {    private String hint;    private boolean hideOnFocus;    private Color color;    public Color getColor() {        return color;    }    public void setColor(Color color) {        this.color = color;        repaint();    }    private void repaint() {        if(getComponent() != null) {            getComponent().repaint();                   }    }    public boolean isHideOnFocus() {        return hideOnFocus;    }    public void setHideOnFocus(boolean hideOnFocus) {        this.hideOnFocus = hideOnFocus;        repaint();    }    public String getHint() {        return hint;    }    public void setHint(String hint) {        this.hint = hint;        repaint();    }    public HintTextFieldUI(String hint) {        this(hint,false);    }    public HintTextFieldUI(String hint, boolean hideOnFocus) {        this(hint,hideOnFocus, null);    }    public HintTextFieldUI(String hint, boolean hideOnFocus, Color color) {        this.hint = hint;        this.hideOnFocus = hideOnFocus;        this.color = color;    }    @Override    protected void paintSafely(Graphics g) {        super.paintSafely(g);        JTextComponent comp = getComponent();        if(hint!=null && comp.getText().length() == 0 && (!(hideOnFocus && comp.hasFocus()))){            if(color != null) {                g.setColor(color);            } else {                g.setColor(comp.getForeground().brighter().brighter().brighter());                          }            int padding = (comp.getHeight() - comp.getFont().getSize())/2;            g.drawString(hint, 2, comp.getHeight()-padding-1);                  }    }    @Override    public void focusGained(FocusEvent e) {        if(hideOnFocus) repaint();    }    @Override    public void focusLost(FocusEvent e) {        if(hideOnFocus) repaint();    }    @Override    protected void installListeners() {        super.installListeners();        getComponent().addFocusListener(this);    }    @Override    protected void uninstallListeners() {        super.uninstallListeners();        getComponent().removeFocusListener(this);    }}

Use it like this:

TextField field = new JTextField();field.setUI(new HintTextFieldUI("Search", true));

Note that it is happening in protected void paintSafely(Graphics g).