package tk.amberide.ide.swing.textbox; import javax.swing.*; import javax.swing.text.JTextComponent; import java.awt.*; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; public class HintTextField extends JTextField implements FocusListener { private String hint; public HintTextField() { this(""); } public HintTextField(final String hint) { setHint(hint); super.addFocusListener(this); } public void setHint(String hint) { this.hint = hint; setUI(new HintTextFieldUI(hint, true)); } public void focusGained(FocusEvent e) { if (this.getText().length() == 0) { super.setText(""); } } public void focusLost(FocusEvent e) { if (this.getText().length() == 0) { setHint(hint); } } public String getText() { String typed = super.getText(); return typed.equals(hint) ? "" : typed; } } class HintTextFieldUI extends javax.swing.plaf.basic.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; } 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(Color.gray); } int padding = (comp.getHeight() - comp.getFont().getSize()) / 2; g.drawString(hint, 5, comp.getHeight() - padding - 1); } } public void focusGained(FocusEvent e) { if (hideOnFocus) { repaint(); } } public void focusLost(FocusEvent e) { if (hideOnFocus) { repaint(); } } protected void installListeners() { super.installListeners(); getComponent().addFocusListener(this); } protected void uninstallListeners() { super.uninstallListeners(); getComponent().removeFocusListener(this); } }