2011-07-23 10 views
8

Mam dwa obiekty JFormattedTextField na moim obiekcie JFrame. Chcę podstawowej matematyki (dodatek) przez wartości tych obiektów JFormattedTextField. Chcę, aby to się stało, gdy fokus utracił albo pierwsze, albo drugie pole tekstowe. Ale gdy "focusLost()", zdarzenie nie otrzyma ostatniej wartości, otrzyma poprzednią wartość.FocusEvent nie otrzymuje ostatniej wartości JFormattedTextField, jak mogę ją uzyskać?

Na przykład; tf1 ma 0, a tf2 ma 0 na początku. Piszę 2 do tf1, a kiedy focusLost(), wynik (tf1+tf2) stają się jeszcze 0. kiedy zmiany któregokolwiek z nich, wynik staje 2 (poprzednia wartość)

Jak mogę dostać ostatnie wartości na focusLost?

Oto mój kod:

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

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

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

Odpowiedz

6

myślę, że należy użyć PropertyChangeListener patrz How to Write a Property Change Listener.

Jest to przykład korzystania 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

dobry wątek, istnieją trzy możliwe cechy, dokument i fokus Słuchacza +1 – mKorbel

+0

+1 Myślę, że to jest lepsze podejście. – trashgod

1

jest tam niektóre zestawy wartość liczbowa defalut twojej JFormattedTextField TF1, TF2;

dla mnie działa bez NPE np

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 Dobre złapanie na NPE. – trashgod

1

Domyślne zachowanie JFormattedTextField na focusLost jest COMMIT_OR_REVERT, więc jedno podejście jest zrobić aktualizację po słuchacz ostrości zawarł. A continuation działa ładnie, jak pokazano poniżej.

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(); 
      } 
     }); 
    } 
} 
Powiązane problemy