jFormattedTextField的Formatter.setCommitsOnValidEdit(true)在第一次焦点时不起作用

我有一个jFormattedTextField ,我将setCommitsOnValidEdit设置为true然后我在“value”属性上添加了一个事件监听器“属性更改”。

jFormattedTextField第一个焦点处,它在键入时不会调用事件侦听器方法。 但是在“focusLost”上它会调用事件监听器,之后当它再次获得焦点时,它会在键入时调用事件监听器。

我希望在jFormattedTextField中的任何时间发生任何变化之后调用事件监听jFormattedTextField (即使在第一个焦点中)。

有什么问题? 我该如何解决?

可能你必须在这里查看DocumentListener示例

编辑:

我从第一次接触JFormattedTextField知道了这个问题,这里的例子不适用于firts focusLost :-)并且可能certificate了你的问题

最小限制设置为10.000,-对于两个JFormattedTextField

1。 JFormattedTextField处理FocusListener (输出必须延迟到invokeLater

第2位。 处理DocumentListener JFormattedTextField (适用于所有…)

初始看

在此处输入图像描述

这里是同样的问题,因为我这里只放了500,而且在focusLost上没什么变化,正确的数量必须> = 10.000,-

在此处输入图像描述

在2dn。 focusLost有效….

在此处输入图像描述

不知道怎么可能,但通过包装到invokeLater()解决,然后工作在第1。 focusLost (您必须取消注释这些代码行)

来自代码

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

实际上,setCommitOnValidEdit应该始终按预期工作(并在下面的代码片段中工作),不需要DocumentListener,毕竟,该方法完全是为了这个目的。 所以我怀疑你的背景中还有其他错误。 或者由于某种原因,第一次编辑没有被解析为有效的东西?

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