2012-10-23 16 views
12

मैं स्विंग के साथ एक जीयूआई बनाने की कोशिश कर रहा हूं। मेरी समस्या यह है कि मेरे पास एक टेक्स्टफील्ड है, लेकिन मैं चाहता हूं कि यह "प्लेसहोल्डर" (HTML में) जैसा हो। मैंने यहां और वहां पढ़ा है कि यह टेक्स्टफील्ड के पेंट() को ओवरराइड करके किया जा सकता है।जावा - टेक्स्टफील्ड पर प्लेसहोल्डर

चूंकि मेरा कोड जेनरेट किया गया है, मुझे पता चला कि मुझे जेनरेट किए गए कोड को ओवरराइड करने के लिए "कस्टम क्रिएशन कोड" का उपयोग करने की आवश्यकता है।

यहाँ है कि मैं क्या "कस्टम निर्माण कोड" क्षेत्र

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

यह अब मैं पाठ फ़ील्ड को देखने के लिए निम्न उत्पादन

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

उत्पन्न करता है लेकिन इसमें कोई बात नहीं है में डाल दिया है, शायद मुझे कुछ घटनाओं पर कुछ फ़ंक्शन जोड़ने की ज़रूरत है, लेकिन मुझे यकीन नहीं है।

अगर कोई हाथ उधार दे तो मैं आभारी रहूंगा।

संपादित करें: http://davidwalsh.name/demo/html5-placeholder.php

+0

भी [इस डुप्लिकेट प्रश्न] पर जवाब देखें (https://stackoverflow.com/q/16213836/642706)। –

उत्तर

8

मैं ओरेकल मंचों पर इस पाया: यहाँ मैं क्या करना चाहते हैं के एक डेमो है।

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

मैंने अभी अपना प्रश्न संपादित किया है, अब एक डेमो है। – Jordashiro

+0

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

+0

अच्छा खोज, मैं इसे देखता हूं – Jordashiro

11

मैं पाठ फ़ील्ड ओवरराइड करने के लिए का उपयोग विधि पेंट, जब तक मैं और अधिक कस्टम पाठ फ़ील्ड तो मैं वास्तव में चाहता था के साथ समाप्त हो गया ...

तब मैं this prompt API जो करने के लिए सरल है पाया उपयोग करें और आपको किसी भी घटक का विस्तार करने की आवश्यकता नहीं है। यह भी एक अच्छा "साथी" एपीआई

यह अब SwingLabs में शामिल किया गया, SwingX library जो इसे और भी eaiser उपयोग करने के लिए बनाता है ...

+0

+ 1 अच्छी लाइब्रेरी :) –

+1

यह वास्तव में नवीनतम स्विंगएक्स लाइब्रेरी का हिस्सा है! – MadProgrammer

0

इस प्रयास करें है।

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

सलाह दी जानी चाहिए, टेक्स्ट फ़ील्ड का नाम "txtUserName" है। आप आउटपुट को इस तरह देख सकते हैं।

image description here

+0

क्या होगा यदि मेरा उपयोगकर्ता नाम 'उपयोगकर्ता नाम" 'है? –

+0

कोई समस्या नहीं है। इसे एक नाम के रूप में माना जाता है। –

संबंधित मुद्दे