package org.jabref.gui.util.component;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextField;
import javax.swing.UIManager;
/**
* A text field which displays a predefined text (e.g. "Search") if the text field is empty.
* This is similar to a html5 input element with a defined placeholder attribute.
* Implementation based on https://gmigdos.wordpress.com/2010/03/30/java-a-custom-jtextfield-for-searching/
*/
public class JTextFieldWithPlaceholder extends JTextField implements KeyListener {
private final String textWhenNotFocused;
/**
* Additionally to {@link JTextFieldWithPlaceholder#JTextFieldWithPlaceholder(String)}
* this also sets the initial text of the text field component.
*
* @param content as the text of the textfield
* @param placeholder as the placeholder of the textfield
*/
public JTextFieldWithPlaceholder(String content, String placeholder) {
this(placeholder);
setText(content);
}
/**
* This will create a {@link JTextField} with a placeholder text. The placeholder
* will always be displayed if the text of the {@link JTextField} is empty.
*
* @param placeholder as the placeholder of the textfield
*/
public JTextFieldWithPlaceholder(String placeholder) {
super();
this.setEditable(true);
this.setText("");
this.textWhenNotFocused = placeholder;
}
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
if (this.getText().isEmpty()) {
int height = this.getHeight();
Font prev = graphics.getFont();
Color prevColor = graphics.getColor();
graphics.setColor(UIManager.getColor("textInactiveText"));
int textHeight = graphics.getFontMetrics().getHeight();
int textBottom = (((height - textHeight) / 2) + textHeight) - 4;
int x = this.getInsets().left;
Graphics2D g2d = (Graphics2D) graphics;
RenderingHints hints = g2d.getRenderingHints();
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.drawString(textWhenNotFocused, x, textBottom);
g2d.setRenderingHints(hints);
graphics.setFont(prev);
graphics.setColor(prevColor);
}
}
@Override
public void keyTyped(KeyEvent e) {
if (this.getText().isEmpty()) {
this.repaint();
}
}
@Override
public void keyPressed(KeyEvent e) {
if (this.getText().isEmpty()) {
this.repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
if (this.getText().isEmpty()) {
this.repaint();
}
}
}