【问题标题】:FocusEvent doesn't get the last value of JFormattedTextField, How I can get it?FocusEvent 没有得到 JFormattedTextField 的最后一个值,我怎样才能得到它?
【发布时间】:2011-07-23 23:34:33
【问题描述】:

我的JFrame 对象上有两个JFormattedTextField 对象。我想要这些JFormattedTextField 对象的值的基本数学(加法)。我希望它在焦点丢失第一个或第二个文本字段时发生。但是当“focusLost()”时,事件没有得到最后一个值,它得到了前一个值。

例如; tf1 最初为 0,tf2 最初为 0。我将2写入tf1,当focusLost()时,结果(tf1+tf2)仍然为0。当我更改其中任何一个时,结果变为2(之前的值)

如何获取 focusLost 上的最后一个值?

这是我的代码:

JFormattedTextField tf1,tf2;
NumberFormat format=NumberFormat.getNumberInstance();
tf1=new JFormattedTextField(format);
tf1.addFocusListener(this);

tf2=new JFormattedTextField(format);
tf2.addFocusListener(this);

focusLost():

public void focusLost(FocusEvent e) {
    if(tf1.getValue() == null) tf1.setValue(0); 
    if(tf2.getValue() == null) tf2.setValue(0);
    //because if I dont set, it throws nullPointerException for tf.getValue()

    BigDecimal no1 = new BigDecimal(tf1.getValue().toString());
    BigDecimal no2 = new BigDecimal(tf2.getValue().toString());
    System.out.println("total: " + (no1.add(no2)));
}

【问题讨论】:

    标签: java swing jframe jformattedtextfield


    【解决方案1】:

    我认为您应该使用PropertyChangeListener,请参阅How to Write a Property Change Listener

    有一个使用JFormattedTextField的例子:

    //...where initialization occurs:
    double amount;
    JFormattedTextField amountField;
    ...
    amountField.addPropertyChangeListener("value",
                                          new FormattedTextFieldListener());
    ...
    class FormattedTextFieldListener implements PropertyChangeListener {
        public void propertyChanged(PropertyChangeEvent e) {
            Object source = e.getSource();
            if (source == amountField) {
                amount = ((Number)amountField.getValue()).doubleValue();
                ...
            }
            ...//re-compute payment and update field...
        }
    }
    

    【讨论】:

    • 好线程,有三种可能的Listeners Property,Document和Focus +1
    【解决方案2】:

    您的 JFormattedTextField tf1,tf2 中是否有一些默认数字值集;

    例如,对我来说,没有 NPE 也可以工作

    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);
            formTextFieldFocus();
        }
        //
        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);
                }
            }
        };
    
        public void formTextFieldFocus1() {
            Runnable doRun = new Runnable() {
    
                @Override
                public void run() {
                    formTextField1.grabFocus();
                    formTextField1.requestFocus();
                    formTextField1.setText(formTextField1.getText());
                    formTextField1.selectAll();
                }
            };
            SwingUtilities.invokeLater(doRun);
        }
    
        public 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();
                }
            });
        }
    }
    

    【讨论】:

      【解决方案3】:

      JFormattedTextFieldfocusLost 上的默认行为是COMMIT_OR_REVERT,因此一种方法是在焦点侦听器结束后进行更新continuation 效果很好,如下所示。

      import java.awt.EventQueue;
      import java.awt.GridLayout;
      import java.awt.event.FocusAdapter;
      import java.awt.event.FocusEvent;
      import java.text.NumberFormat;
      import javax.swing.JFormattedTextField;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      
      /** @see http://stackoverflow.com/questions/6803976 */
      public class Adder extends JPanel {
      
          private final NumberFormat format = NumberFormat.getNumberInstance();
          private final JFormattedTextField a = new JFormattedTextField(format);
          private final JFormattedTextField b = new JFormattedTextField(format);
          private final JFormattedTextField sum = new JFormattedTextField(format);
      
          public Adder() {
              this.setLayout(new GridLayout(0, 1));
              this.add(init(a));
              this.add(init(b));
              sum.setEditable(false);
              sum.setFocusable(false);
              this.add(sum);
          }
      
          private JFormattedTextField init(JFormattedTextField jtf) {
              jtf.setValue(0);
              jtf.addFocusListener(new FocusAdapter() {
      
                  @Override
                  public void focusLost(FocusEvent e) {
                      EventQueue.invokeLater(new Runnable() {
      
                          @Override
                          public void run() {
                              Number v1 = (Number) a.getValue();
                              Number v2 = (Number) b.getValue();
                              sum.setValue(v1.longValue() + v2.longValue());
                          }
                      });
                  }
              });
              return jtf;
          }
      
          private void display() {
              JFrame f = new JFrame("Adder");
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              f.add(this);
              f.pack();
              f.setLocationRelativeTo(null);
              f.setVisible(true);
          }
      
          public static void main(String[] args) {
              EventQueue.invokeLater(new Runnable() {
      
                  @Override
                  public void run() {
                      new Adder().display();
                  }
              });
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 2015-12-15
        • 2015-06-08
        • 1970-01-01
        相关资源
        最近更新 更多