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)
.