2011-07-23 29 views
8

我在我的JFrame對象上有兩個JFormattedTextField對象。我想通過這些JFormattedTextField對象的值來獲得基本的數學(加法)。當焦點丟失第一個或第二個文本字段時,我希望它發生。但是當「focusLost()」,事件沒有得到最後一個值時,它會得到以前的值。FocusEvent未獲取JFormattedTextField的最後一個值,我如何獲取它?

例如; 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))); 
} 

回答

6

我認爲你應該使用一個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... 
    } 
} 
+0

好主線,有三個可能的聽衆屬性,文檔和焦點+1 – mKorbel

+0

+1我認爲這是更好的方法。 – trashgod

1

有一些defalut數套價值在你的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(); 
      } 
     }); 
    } 
} 
+0

+1對NPE有好處。 – trashgod

1

JFormattedTextFieldfocusLost默認行爲是COMMIT_OR_REVERT,這樣一種方法是做更新後的焦點偵聽器已經結束。 A 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(); 
      } 
     }); 
    } 
}