JFormattedTextField Formatter.setCommitsOnValidEdit (true) does not work on first focus

I have jFormattedTextField and I set setCommitsOnValidEdit to true, after which I added an event listener to the “change property” in the value property.

At the beginning of the focus of this jFormattedTextField it does not call the event listener method when entering it. But on "focusLost" it calls the event listener, and after that, when it gets focus again, it calls the event listener on input.

I want the event listener to be called after any change at any time in jFormattedTextField (even in focus).

What is the problem? How can i fix this?

+3
source share
2 answers

You probably need to look at the DocumentListener example here

EDIT:

I know this problem from my first touch of JFormattedTextField , here is an example that does not work on firts focusLost :-) and probably demonstrated your problem

the minimum limit is set to 10.000,- for JFormattedTextField ,

first. JFormattedTextField handling FocusListener (output should be delayed by invokeLater )

second. JFormattedTextField handling DocumentListener (every one works ...)

outward look

enter image description here

here is the same problem, because I'm only 500 here, and nothing has changed on focusLost, the correct amount should be> = 10.000,-

enter image description here

at 2dn. focusLost works ....

enter image description here

I do not know how this is possible, but it is solved by packing in invokeLater() , and then it works on the 1st one. focusLost (you need to uncomment these lines of code)

from code

 import java.awt.*; import java.awt.event.*; import java.math.RoundingMode; import java.text.NumberFormat; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class FormatterLimit { private JFrame frame = new JFrame(); private JPanel pnl = new JPanel(); private JLabel focusLabel = new JLabel(" focusLost Handle "); private JFormattedTextField formTextField; private JLabel docLabel = new JLabel(" document Handle "); private JFormattedTextField formTextField1; private NumberFormat formTextFieldFormat; private double amount = 10000.00; public FormatterLimit() { formTextFieldFormat = NumberFormat.getNumberInstance(); formTextFieldFormat.setMinimumFractionDigits(2); formTextFieldFormat.setMaximumFractionDigits(2); formTextFieldFormat.setRoundingMode(RoundingMode.HALF_UP); focusLabel.setFont(new Font("Serif", Font.BOLD, 14)); focusLabel.setForeground(Color.blue); focusLabel.setPreferredSize(new Dimension(120, 27)); formTextField = new JFormattedTextField(formTextFieldFormat); formTextField.setValue(amount); formTextField.setFont(new Font("Serif", Font.BOLD, 22)); formTextField.setForeground(Color.black); formTextField.setBackground(Color.yellow); formTextField.setPreferredSize(new Dimension(120, 27)); formTextField.setHorizontalAlignment(SwingConstants.RIGHT); formTextField.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { formTextField.requestFocus(); formTextField.setText(formTextField.getText()); formTextField.selectAll(); } @Override public void focusLost(FocusEvent e) { //Runnable doRun = new Runnable() { //@Override //public void run() { double t1a1 = (((Number) formTextField.getValue()).doubleValue()); if (t1a1 < 1000) { formTextField.setValue(amount); } //} // }; //SwingUtilities.invokeLater(doRun); } }); docLabel.setFont(new Font("Serif", Font.BOLD, 14)); docLabel.setForeground(Color.blue); docLabel.setPreferredSize(new Dimension(120, 27)); formTextField1 = new JFormattedTextField(formTextFieldFormat); formTextField1.setValue(amount); formTextField1.setFont(new Font("Serif", Font.BOLD, 22)); formTextField1.setForeground(Color.black); formTextField1.setBackground(Color.yellow); formTextField1.setPreferredSize(new Dimension(120, 27)); formTextField1.setHorizontalAlignment(SwingConstants.RIGHT); formTextField1.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { formTextField1.requestFocus(); formTextField1.setText(formTextField1.getText()); formTextField1.selectAll(); } @Override public void focusLost(FocusEvent e) { } }); formTextField1.getDocument().addDocumentListener(docListener); pnl = new JPanel(); pnl.setBorder(new EmptyBorder(2, 2, 2, 2)); pnl.setLayout(new GridLayout(2, 2)); pnl.add(focusLabel); pnl.add(formTextField); pnl.add(docLabel); pnl.add(formTextField1); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(pnl, BorderLayout.CENTER); frame.setLocation(200, 200); frame.pack(); frame.setVisible(true); formTextFieldFocus1(); } // private DocumentListener docListener = new DocumentListener() { @Override public void changedUpdate(DocumentEvent documentEvent) { printIt(documentEvent); } @Override public void insertUpdate(DocumentEvent documentEvent) { printIt(documentEvent); } @Override public void removeUpdate(DocumentEvent documentEvent) { printIt(documentEvent); } private void printIt(DocumentEvent documentEvent) { DocumentEvent.EventType type = documentEvent.getType(); double t1a1 = (((Number) formTextField1.getValue()).doubleValue()); if (t1a1 < 1000) { Runnable doRun = new Runnable() { @Override public void run() { formTextField1.setValue(amount); } }; SwingUtilities.invokeLater(doRun); } } }; private void formTextFieldFocus1() { Runnable doRun = new Runnable() { @Override public void run() { formTextField1.grabFocus(); formTextField1.requestFocus(); formTextField1.setText(formTextField1.getText()); formTextField1.selectAll(); } }; SwingUtilities.invokeLater(doRun); } private void formTextFieldFocus() { Runnable doRun = new Runnable() { @Override public void run() { formTextField.grabFocus(); formTextField.requestFocus(); formTextField.setText(formTextField.getText()); formTextField.selectAll(); formTextFieldFocus1(); } }; SwingUtilities.invokeLater(doRun); } public static void main(String args[]) { EventQueue.invokeLater(new Runnable() { @Override public void run() { FormatterLimit fl = new FormatterLimit(); } }); } } 
+2
source

In fact, setCommitOnValidEdit should always work as you expect (and in the code snippet below), there is no need for a DocumentListener, after all, a method for that purpose. Therefore, I suspect that something else is wrong in your context. Or for some reason, the first edit is not analyzed for anything real?

  NumberFormatter numberFormatter = new NumberFormatter( NumberFormat.getIntegerInstance()); // allow or not doesn't make a difference numberFormatter.setAllowsInvalid(false); numberFormatter.setCommitsOnValidEdit(true); JFormattedTextField readTimeOut = new JFormattedTextField(numberFormatter); PropertyChangeListener l = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { LOG.info("got new value: " + evt.getNewValue()); } }; readTimeOut.addPropertyChangeListener("value", l); readTimeOut.setColumns(20); readTimeOut.setHorizontalAlignment(SwingConstants.RIGHT); JFormattedTextField other = new JFormattedTextField(numberFormatter); other.addPropertyChangeListener("value", l); other.setColumns(20); other.setHorizontalAlignment(SwingConstants.RIGHT); JPanel box = new JPanel(); box.add(readTimeOut); box.add(other); 
+3
source

All Articles