2011-09-11 19 views
8

enter image description hereenter image description hereJFormattedTextField मुद्दों

1) कैसे मैं कैरट का उपयोग किए बिना 0 स्थिति के लिए कर्सर सेट कर सकते हैं या invokeLater() (confortly Formatted Text Field Tips @camickr का उपयोग करके हल किया जा सकता) में लपेटा ध्यान देते हैं, वहाँ कोई ऐसा जो एक और तरीका जानता है

enter image description hereenter image description here

2) How to reset Formatter कभी कभी (कीबोर्ड से टैब) द्वारा फोकस उठाकर, रीसेट वापस नहीं काम करता है और focusLost (खाली क्षेत्र) फ़ॉर्मेटर रिटर्न/reincarnated वर्ण या स्ट्रिंग पर करता है (पिछले पता सेटटेक्स्ट ("") से पहले;),

नोट: ओटीएन से फ़ॉर्मेटर को रीसेट करने के तरीके के बारे में कोड या निम्नलिखित कोड is only this way पता है, लेकिन उनके भयानक खोज फैसले ...., केवल कोड (जेनेट द्वारा प्रश्न या उत्तर ?? ?)

import java.awt.event.*; 
import java.beans.*; 
import java.text.ParseException; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.text.Document; 

public class FormattedNull { 

    private JFormattedTextField field; 
    private JButton focusButton; 

    private JComponent createContent() { 
     JComponent content = new JPanel(); 
     field = new JFormattedTextField(new Integer(55)); 
     field.setColumns(20); 
     field.addPropertyChangeListener(getPropertyChangeListener()); 
     field.getDocument().addDocumentListener(getDocumentListener()); 
     content.add(field); 
     focusButton = new JButton("just something focusable"); 
     focusButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       field.setValue(0); 
       field.requestFocusInWindow(); 
      } 
     }); 
     content.add(focusButton); 
     return content; 
    } 

    protected void maybeCommitEdit(Document document) { 
     try { 
      field.commitEdit(); 
     } catch (ParseException e) { 
      // uncomment to map empty string to null 
      if (field.getText().length() == 0) { 
       field.setValue(null); 
      } 
     } 
    } 

    /*public void commitEdit() throws ParseException { 
    if(allowsNull() && isBlank()) { 
    setValue(null); 
    } 
    else { 
    super.commitEdit(); 
    } 
    }*/ 
    private PropertyChangeListener getPropertyChangeListener() { 
     PropertyChangeListener propertyChangeListener = new PropertyChangeListener() { 

      @Override 
      public void propertyChange(PropertyChangeEvent evt) { 
       if ("value".equals(evt.getPropertyName())) { 
        matchValueChanged(evt.getNewValue()); 
       } 
      } 
     }; 
     return propertyChangeListener; 
    } 

    protected void matchValueChanged(Object value) { 
     System.out.println("got new value: " + value); 
    } 

    private DocumentListener getDocumentListener() { 
     DocumentListener documentListener = new DocumentListener() { 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       maybeCommitEdit(e.getDocument()); 
      } 

      @Override 
      public void insertUpdate(DocumentEvent e) { 
       maybeCommitEdit(e.getDocument()); 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
      } 
     }; 
     return documentListener; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame(""); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new FormattedNull().createContent()); 
       frame.setLocationRelativeTo(null); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

enter image description here

संलग्न छवियों मेरी sscce पर आधारित होते हैं

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 
import javax.swing.text.MaskFormatter; 

public class TestTest { 

    private JFormattedTextField myFormattedField1 = new JFormattedTextField(createFormatter("AAAAAAAAAAAA")); 
    private JFormattedTextField myFormattedField2 = new JFormattedTextField(createFormatter("AAAAAAAAAAAA")); 
    private JFormattedTextField myFormattedField3 = new JFormattedTextField(createFormatter("AAAAAAAAAAAA")); 
    private JFormattedTextField myFormattedField4 = new JFormattedTextField(createFormatter("AAAAAAAAAAAA")); 
    private JButton jb = new JButton("Reset to Default"); 
    private JFrame frame = new JFrame("Text Test"); 

    public TestTest() { 
     myFormattedField1.setText("ABCDEFGHIJKL"); 
     myFormattedField2.setText("ABCDEFGHIJKL"); 
     myFormattedField3.setText("ABCDEFGHIJKL"); 
     myFormattedField4.setText("ABCDEFGHIJKL"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(150, 150); 
     frame.setLayout(new GridLayout(5, 0)); 
     frame.add(jb); 
     frame.add(myFormattedField1); 
     frame.add(myFormattedField2); 
     frame.add(myFormattedField3); 
     frame.add(myFormattedField4); 
     jb.addActionListener(new java.awt.event.ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       myFormattedField1.setText(""); 
       myFormattedField2.setText(""); 
       myFormattedField3.setText(""); 
       myFormattedField4.setText(""); 
      } 
     }); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     TestTest textTest = new TestTest(); 
    } 

    protected MaskFormatter createFormatter(String s) { 
     MaskFormatter formatter = null; 
     try { 
      formatter = new MaskFormatter(s); 
     } catch (java.text.ParseException exc) { 
      System.err.println("formatter is bad: " + exc.getMessage()); 
     } 
     return formatter; 
    } 
} 
+1

1) क्यों? 2) खाली स्ट्रिंग एक अमान्य प्रविष्टि है, इसलिए फ़ील्ड मास्क पर ही लौटता है (एक जगह सेट करने के लिए होल्डररहर को देखने के लिए, रिक्त स्थान अदृश्य हैं :-) – kleopatra

उत्तर

8
  1. मैक ओएस, यूआई प्रतिनिधि के डिफ़ॉल्ट व्यवहार, com.apple.laf.AquaTextFieldF, पर CaretPositionListener के समान है:

    • टैब या शिफ्ट - टैब: जगह फ़ील्ड के शुरू में कैरट।

    • क्लिक करें: संक्षेप में क्षेत्र की शुरुआत में देखभाल करें और फिर इसे क्लिक बिंदु पर ले जाएं।

    IMO, CaretPositionListener और अधिक सुचारू रूप से उत्तरार्द्ध करता है।

  2. JFormattedTextField का डिफ़ॉल्ट व्यवहार COMMIT_OR_REVERT खो गया है। नीचे दिए गए उदाहरण में, टैब हालांकि प्रभाव देखने के लिए पहला, अमान्य फ़ील्ड। फॉर्मेटर न तो अमान्य मूल्य को न तो प्रतिबद्ध कर सकता है और न ही वापस कर सकता है, इसलिए यह MASK.length() रिक्त स्थान को प्रतिस्थापित करता है। यह मान वैध है, अगर थोड़ा अस्पष्ट है।

परिशिष्ट: मैंने setFocusLostBehavior() को बदलने की अनुमति देने के लिए नीचे दिए गए कोड को अपडेट किया है।

कोड:

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.text.MaskFormatter; 

/** @see http://stackoverflow.com/questions/7378821 */ 
public class TrashTest { 

    private static final String MASK = "########"; 
    private static final String DEFAULT = ""; 
    private static final String BOGUS = ""; 
    private JFormattedTextField jtf1 = createField(); 
    private JFormattedTextField jtf2 = createField(); 
    private JFormattedTextField jtf3 = createField(); 
    private JFormattedTextField jtf4 = createField(); 
    private JButton reset = new JButton("Reset to Default"); 
    private JComboBox combo = new JComboBox(); 
    private JFrame frame = new JFrame("Text Test"); 

    public TrashTest() { 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(150, 150); 
     frame.setLayout(new GridLayout(0, 1)); 
     frame.add(reset); 
     frame.add(jtf1); 
     frame.add(jtf2); 
     frame.add(jtf3); 
     frame.add(jtf4); 
     frame.add(combo); 
     this.initFields(); 
     reset.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       initFields(); 
      } 
     }); 
     for (Edit e : Edit.values()) { 
      combo.addItem(e); 
     } 
     combo.setSelectedIndex(jtf1.getFocusLostBehavior()); 
     combo.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Edit current = (Edit) combo.getSelectedItem(); 
       jtf1.setFocusLostBehavior(current.value); 
      } 
     }); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void initFields() { 
     jtf1.setText(BOGUS); 
     jtf2.setText(DEFAULT); 
     jtf3.setText(DEFAULT); 
     jtf4.setText(DEFAULT); 
    } 

    protected JFormattedTextField createField() { 
     MaskFormatter formatter = null; 
     try { 
      formatter = new MaskFormatter(MASK); 
     } catch (java.text.ParseException e) { 
      e.printStackTrace(System.out); 
     } 
     JFormattedTextField jtf = new JFormattedTextField(formatter); 
     return jtf; 
    } 

    enum Edit { 

     COMMIT(JFormattedTextField.COMMIT), 
     COMMIT_OR_REVERT(JFormattedTextField.COMMIT_OR_REVERT), 
     REVERT(JFormattedTextField.REVERT), 
     PERSIST(JFormattedTextField.PERSIST); 
     private int value; 

     private Edit(int n) { 
      this.value = n; 
     } 

     public static Edit getEnum(int n) { 
      for (Edit e : Edit.values()) { 
       if (e.value == n) { 
        return e; 
       } 
      } 
      return Edit.COMMIT_OR_REVERT; 
     } 
    } 

    public static void main(String[] args) { 
     TrashTest textTest = new TrashTest(); 
    } 
} 
+0

यह उत्तर अपेक्षाकृत अनुभवजन्य है; मैं किसी भी सुधार या बेहतर जवाब का स्वागत करता हूं। – trashgod

+0

उत्तर के लिए धन्यवाद, हैकिश :-) – mKorbel

+0

संदर्भ के लिए, मैंने फोकस-खोई सेटिंग का चयन करने के लिए कोड अपडेट किया है। – trashgod

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