2012-10-23 17 views
12

Próbuję utworzyć GUI z Swingiem. Mój problem polega na tym, że mam pole tekstowe, ale chcę, żeby miał "znak zastępczy" (jak w html). Czytam tu i tam, że można to zrobić, pomijając paint() pola tekstowego.Java - symbol zastępczy pola tekstowego

Od momentu wygenerowania mojego kodu dowiedziałem się, że muszę użyć "Niestandardowego kodu tworzenia", aby przesłonić wygenerowany kod.

Oto co mam umieścić w polu „kod niestandardowy Creation” pola

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

To generuje następujący wynik

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

Na razie widzę textField ale w nim nie ma nic, może muszę dodać jakąś funkcję do jakiegoś wydarzenia, ale nie jestem pewien.

Byłbym wdzięczny, gdyby ktoś mógł pomóc.

EDIT: Tutaj jest demo, co chcę zrobić: http://davidwalsh.name/demo/html5-placeholder.php

+0

Zobacz także odpowiedzi na temat tego duplikatu [Pytanie] (https://stackoverflow.com/q/16213836/642706). –

Odpowiedz

8

Znalazłem to na forum 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

Właśnie zredagowałem moje pytanie, jest teraz demo. – Jordashiro

+0

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

+0

fajne znalezisko, zajrzałbym do niego – Jordashiro

11

użyć do nadpisania pola tekstowe malować metodę, aż skończyło się więcej niestandardowych pól tekstowych, a następnie naprawdę chciałem ...

Potem znalazłem this prompt API który jest prosty do używać i nie wymaga przedłużania żadnych komponentów. Posiada również miły „Buddy” API

ten został uwzględniony w SwingLabs, SwingX library co sprawia, że ​​nawet eaiser używać ...

+0

+ 1 Ładna biblioteka :) –

+1

To właściwie część najnowszej biblioteki SwingX! – MadProgrammer

0

spróbować.

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

Uwaga, nazwa pola tekstowego to "txtUserName". Możesz zobaczyć wyniki w ten sposób.

image description here

+0

Co zrobić, jeśli moja nazwa użytkownika to '" Nazwa użytkownika "'? –

+0

Nie ma problemu. Jest to uważane za imię. –

Powiązane problemy