2012-10-23 13 views
12

Sto provando a creare una GUI con Swing. Il mio problema è che ho un campo di testo, ma voglio che abbia un "segnaposto" (come in html). Leggo qui e là che può essere fatto sovrascrivendo il paint() del campo di testo.Java - segnaposto sul campo di testo

Poiché il mio codice è stato generato ho scoperto che ho bisogno di usare il "Codice di creazione personalizzata" per sovrascrivere il codice che è stato generato.

Ecco quello che ho messo in campo "Custom Codice Creazione"

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); 
    } 
} 

Questo genera il seguente 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); 
    } 
}; 

Per ora vedo la textField ma non c'è nulla in esso, forse ho bisogno di aggiungere qualche funzione su qualche evento, ma non ne sono sicuro.

Sarei grato se qualcuno potesse dare una mano.

EDIT: Ecco una demo di quello che voglio fare: http://davidwalsh.name/demo/html5-placeholder.php

+0

Vedere anche le risposte su [questa domanda duplicato] (https://stackoverflow.com/q/16213836/642706). –

risposta

8

Ho trovato questo sul forum di Oracle.

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

+0

Ho appena modificato la mia domanda, ora c'è una demo. – Jordashiro

+0

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

+0

bella scoperta, vorrei esaminarlo – Jordashiro

11

io uso per ignorare i campi di testo metodo paint, fino a quando ho finito con i campi di testo più personalizzati poi ho davvero voluto ...

poi ho trovato this prompt API che è semplice da utilizzare e non richiede di estendere alcun componente. Essa ha anche un bel "compagno" API

Questo ora è stato incluso nei SwingLabs, SwingX library che lo rende ancora eaiser da usare ...

+0

+ 1 Bella biblioteca :) –

+1

In realtà fa parte dell'ultima libreria SwingX! – MadProgrammer

0

Prova questo.

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); 
    } 
} 

Si consiglia, il nome del campo di testo è "txtUserName". Puoi vedere l'output come in questo modo.

image description here

+0

Cosa succede se il mio nome utente è '" Nome utente "'? –

+0

Non ci sono problemi. È considerato come un nome. –