2011-07-23 6 views
8

Tengo dos objetos JFormattedTextField en mi objeto JFrame. Quiero una Matemática básica (adición) por los valores de estos objetos JFormattedTextField. Quiero que suceda cuando el foco perdió el primero o el segundo campo de texto. Pero cuando "focusLost()", el evento no obtiene el último valor, obtiene el valor anterior.FocusEvent no obtiene el último valor de JFormattedTextField, ¿cómo puedo obtenerlo?

Por ejemplo; tf1 tiene 0 y tf2 tiene 0 al principio. Escribo 2 a tf1, y cuando focusLost(), resultado (tf1+tf2) se vuelven aún 0. cuando cambie cualquiera de ellos, el resultado se convierte en 2 (el valor anterior)

¿Cómo consigo los últimos valores en focusLost?

Aquí está mi código:

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

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

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

Respuesta

6

Creo que se debe utilizar un PropertyChangeListener, ver How to Write a Property Change Listener.

No es un ejemplo usando 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

buen hilo, hay tres posibles de Listeners Property, Document y Focus +1 – mKorbel

+0

+1 Creo que este es el mejor enfoque. – trashgod

1

¿Hay alguna conjuntos de valores numéricos defalut en su JFormattedTextField TF1, TF2;

para mí funciona sin NPE, por ejemplo

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 Buena captura en NPE. – trashgod

1

El comportamiento predeterminado de JFormattedTextField en focusLost es COMMIT_OR_REVERT, por lo que un enfoque consiste en hacer la actualización después de el oyente enfoque ha concluido. A continuation funciona muy bien, como se muestra a continuación.

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