Java FocusEvent不';无法获取JFormattedTextField的最后一个值,如何获取它?

Java FocusEvent不';无法获取JFormattedTextField的最后一个值,如何获取它?,java,swing,jframe,jformattedtextfield,Java,Swing,Jframe,Jformattedtextfield,在我的JFrame对象上有两个JFormattedTextField对象。我想要通过这些JFormattedTextField对象的值进行基本的数学(加法)。我希望它发生在焦点丢失第一个或第二个文本字段时。但是当“focusLost()”事件没有得到最后一个值时,它会得到上一个值 比如,tf1首先有0,而tf2首先有0。我将2写入tf1,当focusLost()时,结果(tf1+tf2)仍然为0。当我更改其中任何一个时,结果变为2(上一个值) 如何获取focusLost上的最后一个值 这是我的密

在我的
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()


JFormattedTextField tf1、tf2中是否存在一些defalut Number值集

例如,对我来说,在没有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();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.math.RoundingMode;
导入java.text.NumberFormat;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.event.*;
公共类格式化程序限制{
私有JFrame=新JFrame();
private JPanel pnl=new JPanel();
专用JLabel focusLabel=新JLabel(“focusLost句柄”);
私有JFormattedTextField formTextField;
私有JLabel docLabel=新JLabel(“文档句柄”);
私有JFormattedTextFieldFormTextField1;
私有数字格式formTextFieldFormat;
私人双倍金额=10000.00;
公共格式化程序限制(){
formTextFieldFormat=NumberFormat.getNumberInstance();
formTextFieldFormat.setMinimumFractionDigits(2);
formTextFieldFormat.setMaximumFractionDigits(2);
formTextFieldFormat.setRoundingMode(RoundingMode.HALF_UP);
setFont(新字体(“衬线”,Font.BOLD,14));
focusLabel.setForeground(颜色:蓝色);
focusLabel.setPreferredSize(新尺寸(120,27));
formTextField=新的JFormattedTextField(formTextFieldFormat);
formTextField.setValue(金额);
setFont(新字体(“衬线”,Font.BOLD,22));
formTextField.setForeground(颜色为黑色);
formTextField.setBackground(颜色:黄色);
setPreferredSize(新维度(120,27));
formTextField.setHorizontalAlignment(SwingConstants.RIGHT);
addFocusListener(新FocusListener()){
@凌驾
获得公共无效焦点(焦点事件e){
formTextField.requestFocus();
formTextField.setText(formTextField.getText());
formTextField.selectAll();
}
@凌驾
公共无效焦点丢失(焦点事件e){
Runnable doRun=new Runnable(){
@凌驾
公开募捐{
double t1a1=((数字)formTextField.getValue()).doubleValue());
如果(t1a1<1000){
formTextField.setValue(金额);
}
}
};
SwingUtilities.invokeLater(多伦);
}
});
docLabel.setFont(新字体(“衬线”,Font.BOLD,14));
docLabel.setForeground(颜色:蓝色);
docLabel.setPreferredSize(新尺寸(120,27));
formTextField1=新的JFormattedTextField(formTextFieldFormat);
formTextField1.设置值(金额);
formTextField1.setFont(新字体(“衬线”,Font.BOLD,22));
formTextField1.设置前景(颜色为黑色);
formTextField1.挫折背景(颜色:黄色);
formTextField1.setPreferredSize(新维度(120,27));
formTextField1.设置水平对齐(SwingConstants.右);
formTextField1.addFocusListener(新FocusListener(){
@凌驾
获得公共无效焦点(焦点事件e){
formTextField1.requestFocus();
formTextField1.setText(formTextField1.getText());
formTextField1.selectAll();
}
@凌驾
公共无效焦点丢失(焦点事件e){
}
});
formTextField1.getDocument().addDocumentListener(docListener);
pnl=新的JPanel();
pnl.setboorder(新的空订单(2,2,2,2));
pnl.setLayout(新网格布局(2,2));
pnl.add(焦点标签);
pnl.add(formTextField);
pnl.add(docLabel);
pnl.add(formTextField1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(pnl,BorderLayout.CENTER);
帧设置位置(200200);
frame.pack();
frame.setVisible(true);
formTextFieldFocus();
}
//
私有DocumentListener docListener=新DocumentListener(){
@凌驾
public void changedUpdate(DocumentEvent DocumentEvent){
printIt(documentEvent);
}
@凌驾
公共作废插入更新(DocumentEvent DocumentEvent){
printIt(documentEvent);
}
@凌驾
公共作废移除更新(DocumentEvent DocumentEvent){
printIt(documentEvent);
}
private void printIt(DocumentEvent DocumentEvent){
DocumentEvent.EventType类型=DocumentEvent.getType();
double t1a1=((数字)formTextField1.getValue()).doubleValue());
如果(t1a1<1000){
Runnable doRun=new Runnable(){
@凌驾
公开募捐{
formTextField1.设置值(金额);
}
};
SwingUtilities.invokeLater(多伦);
}
}
};
公共无效formTextFieldFocus1(){
Runnable doRun=new Runnable(){
@凌驾
公开募捐{
formTextField1.grabFocus();
formTextField1.requestFocus(
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();
            }
        });
    }
}
//...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...
    }
}
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();
            }
        });
    }
}