2009-07-24 20 views
33

मेरे पास एक छोटा जावा डेस्कटॉप ऐप है जो स्विंग का उपयोग करता है। विभिन्न प्रकार के कुछ इनपुट फ़ील्ड (JTextField, JComboBox, JSpinner, JFormattedTextField) के साथ एक डेटा प्रविष्टि संवाद है। जब मैं फॉर्म के माध्यम से टैबबिंग करके या माउस के साथ क्लिक करके JFormattedTextFields को सक्रिय करता हूं, तो मैं इसे वर्तमान में मौजूद सभी टेक्स्ट का चयन करना चाहता हूं। इस तरह, उपयोगकर्ता सिर्फ टाइपिंग शुरू कर सकते हैं और डिफ़ॉल्ट मानों को ओवरराइट कर सकते हैं।जब यह फोकस हो जाता है तो JFormattedTextField में सभी टेक्स्ट का चयन कैसे करें?

मैं यह कैसे कर सकता हूं? मैंने एक फोकस लिस्टनर/फोकस एडाप्टर का उपयोग किया जो JFormattedTextField पर selectAll() को कॉल करता है, लेकिन यह कुछ भी नहीं चुनता है, हालांकि फोकसएडाप्टर की फोकस प्राप्त() विधि को कॉल किया गया है (नीचे कोड नमूना देखें)।

private javax.swing.JFormattedTextField pricePerLiter; 
// ... 
pricePerLiter.setFormatterFactory(
    new JFormattedTextField.AbstractFormatterFactory() { 
    private NumberFormatter formatter = null; 
    public JFormattedTextField.AbstractFormatter 
     getFormatter(JFormattedTextField jft) { 
     if (formatter == null) { 
      formatter = new NumberFormatter(new DecimalFormat("#0.000")); 
      formatter.setValueClass(Double.class); 
     } 
     return formatter; 
    } 
}); 
// ... 
pricePerLiter.addFocusListener(new java.awt.event.FocusAdapter() { 
    public void focusGained(java.awt.event.FocusEvent evt) { 
     pricePerLiter.selectAll(); 
    } 
}); 

कोई विचार? मजाकिया बात यह है कि कम से कम जब फॉर्म के माध्यम से टैबबिंग करते हैं, तो उसके सभी टेक्स्ट को चुनकर जेटीक्स्टफिल्ड और जेएसपीनर दोनों के लिए डिफ़ॉल्ट व्यवहार होता है।

उत्तर

65

SwingUtilities.invokeLater के साथ अपने कॉल लपेटें तो यह सभी लंबित AWT घटनाओं संसाधित किया गया है के बाद क्या होगा: क्योंकि JFormattedTextfield processFocusEvent ओवरराइड करता है फोकस प्राप्त/फोकस खो पर स्वरूपित करने के लिए

pricePerLiter.addFocusListener(new java.awt.event.FocusAdapter() { 
    public void focusGained(java.awt.event.FocusEvent evt) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       pricePerLiter.selectAll(); 
      } 
     }); 
    } 
}); 
+3

धन्यवाद, बस इतना ही। मैं केवल अनुमान लगा सकता हूं कि NumberFormatter कुछ ऐसा कर रहा है जो selectAll() को पूर्ववत करता है? –

+3

हां यह करता है। यह मान स्वरूपित करता है और पाठ को रीसेट करता है। –

+1

+1 इसे चाहिए, तुरंत यह याद नहीं कर सका कि यह मेरा स्वयं कैसे करें, गुगल हो गया और तुरंत यह जवाब मिला। धन्यवाद! –

6

Thats।

new JFormattedTextField("...") { 
     protected void processFocusEvent(FocusEvent e) { 
      super.processFocusEvent(e); 
      if (e.isTemporary()) 
       return; 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        selectAll(); 
       } 
      }); 
     } 
    }; 

एक focusListener का उपयोग करना हमेशा यह work..since नहीं हो सकता है समय, जिस पर यह processFocusEvent के सापेक्ष कहा जाता है पर निर्भर करेगा:

एक निश्चित शॉट तरीका JFormattedTextField का विस्तार करने और processFocusEvent विधि ओवरराइड करने के लिए है ।

14

उपरोक्त के अतिरिक्त, अगर आप आप बस कर सकते हैं सभी टेक्स्ट फ़ील्ड के लिए इस चाहते हैं:

KeyboardFocusManager.getCurrentKeyboardFocusManager() 
    .addPropertyChangeListener("permanentFocusOwner", new PropertyChangeListener() 
{ 
    public void propertyChange(final PropertyChangeEvent e) 
    { 
     if (e.getNewValue() instanceof JTextField) 
     { 
      SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        JTextField textField = (JTextField)e.getNewValue(); 
        textField.selectAll(); 
       } 
      }); 

     } 
    } 
}); 
2

camickr का कोड थोड़ा सुधार किया जा सकता। जब फोकस किसी JTextField से दूसरे प्रकार के घटक (ऐसे बटन) तक जाता है, तो अंतिम स्वचालित चयन साफ़ नहीं होता है। यह इस तरह से तय किया जा सकता है:

KeyboardFocusManager.getCurrentKeyboardFocusManager() 
     .addPropertyChangeListener("permanentFocusOwner", new PropertyChangeListener() 
    { 
     @Override 
     public void propertyChange(final PropertyChangeEvent e) 
     { 

      if (e.getOldValue() instanceof JTextField) 
      { 
        SwingUtilities.invokeLater(new Runnable() 
        { 
          @Override 
          public void run() 
          { 
            JTextField oldTextField = (JTextField)e.getOldValue(); 
            oldTextField.setSelectionStart(0); 
            oldTextField.setSelectionEnd(0); 
          } 
        }); 

      } 

      if (e.getNewValue() instanceof JTextField) 
      { 
        SwingUtilities.invokeLater(new Runnable() 
        { 
          @Override 
          public void run() 
          { 
            JTextField textField = (JTextField)e.getNewValue(); 
            textField.selectAll(); 
          } 
        }); 

      } 
     } 
    }); 
7

मैं जानता हूँ कि इस वर्ष की तरह है, लेकिन मैं एक क्लीनर समाधान के साथ आया था, invokeLater बिना:

private class SelectAllOfFocus extends FocusAdapter { 

    @Override 
    public void focusGained(FocusEvent e) { 
     if (! e.isTemporary()) { 
      JFormattedTextField textField = (JFormattedTextField)e.getComponent(); 
      // This is needed to put the text field in edited mode, so that its processFocusEvent doesn't 
      // do anything. Otherwise, it calls setValue, and the selection is lost. 
      textField.setText(textField.getText()); 
      textField.selectAll(); 
     } 
    } 

} 
+0

सभी मामलों में मेरे लिए काम करता है +1 – mKorbel

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

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