Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java - placeholder on textfield

I'm trying to create a GUI with Swing. My problem is, I have a textfield, but I want it to have a "placeholder" (like in html). I read here and there that it can be done by overriding the paint() of the textfield.

Since my code is generated I found out that I need to use the "Custom Creation Code" to override the code that was generated.

Here is what I have put in the "Custom Creation Code" field

new javax.swing.JTextField()
{
    String test = super.getText();
    String hint = "Username";

    public void paint(Graphics g)
    {
        if ( test == null || test.length() < 1 ) {
            g.setColor( Color.red );
            g.drawString(hint, 0, 0);
        }

        g.setColor(Color.BLACK);
        super.paint(g);
    }
}

This generates the following output

javax.swing.JTextField username = new javax.swing.JTextField()
{
    String test = super.getText();
    String hint = "Username";

    public void paint(Graphics g)
    {
        if ( test == null || test.length() < 1 ) {
            g.setColor( Color.red );
            g.drawString(hint, 0, 0);
        }

        g.setColor(Color.BLACK);
        super.paint(g);
    }
};

For now I see the textField but there is nothing in it, maybe I need to add some function onto some event, but I am not sure.

I would be grateful if anyone could lend a hand.

EDIT : Here is a demo of what I want to do : http://davidwalsh.name/demo/html5-placeholder.php

like image 839
Jordashiro Avatar asked Oct 23 '12 15:10

Jordashiro


People also ask

What is placeholder in Java?

A Placeholder is a predefined location in a JSP that displays a single piece of web content at a time that is dynamically retrieved from the BEA Virtual Content Repository.

What is a JTextField in Java?

JTextField is a lightweight component that allows the editing of a single line of text. For information on and examples of using text fields, see How to Use Text Fields in The Java Tutorial. JTextField is intended to be source-compatible with java.

How do I add text to a text field in Java?

Use setText to write some text to the text field. Use new JTextField("Some text") to initialize the text field with some text. Use new JTextField(10) to set the default columns of the text field. Use new JTextField("some text", 3) to specify the above properties at once.


3 Answers

I use to override the text fields paint method, until I ended up with more custom text fields then I really wanted...

Then I found this prompt API which is simple to use and doesn't require you to extend any components. It also has a nice "buddy" API

This has now been included in the SwingLabs, SwingX library which makes it even eaiser to use...

like image 155
MadProgrammer Avatar answered Sep 25 '22 22:09

MadProgrammer


I found this on the oracle forums.

public class TextFieldWithPrompt extends JTextField{

@Override
protected void paintComponent(java.awt.Graphics g) {
    super.paintComponent(g);

    if(getText().isEmpty() && ! (FocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == this)){
        Graphics2D g2 = (Graphics2D)g.create();
        g2.setBackground(Color.gray);
        g2.setFont(getFont().deriveFont(Font.ITALIC));
        g2.drawString("zip", 5, 10); //figure out x, y from font's FontMetrics and size of component.
        g2.dispose();
    }
  }

https://forums.oracle.com/forums/thread.jspa?threadID=1349874

like image 32
Itchy Nekotorych Avatar answered Sep 25 '22 22:09

Itchy Nekotorych


Try this.

private void txtUserNameFocusGained(java.awt.event.FocusEvent evt) {                                        
    String username = txtUserName.getText();
    if(username.equals("User Name")){
        txtUserName.setCaretPosition(0);
    }

}                                       

private void txtUserNameFocusLost(java.awt.event.FocusEvent evt) {                                      
    String username = txtUserName.getText();
    if(username.equals("")){
        txtUserName.setForeground(new java.awt.Color(86, 86, 86));
        txtUserName.setCaretPosition(0);
        txtUserName.setText("User Name");
    }
}                                     

private void txtUserNameKeyPressed(java.awt.event.KeyEvent evt) {                                       
    String username = txtUserName.getText();
    if(username.equals("User Name")){
        txtUserName.setForeground(new java.awt.Color(0, 0, 0));
        txtUserName.setText(null);
        txtUserName.setCaretPosition(0);
    }
}

Be adviced, the name of the text field is "txtUserName". You can see the output as like this.

image description here

like image 29
Panduka Nandara Avatar answered Sep 24 '22 22:09

Panduka Nandara