lunes, 18 de agosto de 2014

Datos de entrada en JFormattedTextField


algo un poco mas complicado a ver si entienden jaja es mas complicado y  mejor que el JTextField



import java.awt.GridLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Date;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.text.MaskFormatter;
import javax.swing.text.NumberFormatter;

/**
 * Además de la forma especificada aquí, se pueden usar
 * FormatterFactories. También se le puede usar setColumns
 */
public class NumberExample extends JFrame {
    private static final long serialVersionUID = 1L;

    private JLabel lblNumérico = new JLabel("Números");

    private JFormattedTextField txtObjeto = getTxtObjeto();

    private JFormattedTextField txtNumérico = getNumérico();

    private JLabel lblCadena = new JLabel("Cadenas");

    private JFormattedTextField txtCadena = getTexto();

    private JLabel lblFecha = new JLabel("Fechas");

    private JFormattedTextField txtFecha = getTxtFecha();

    public NumberExample() {
        super("Texto con Formato");
        setContentPane(new JScrollPane(getPanel()));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }

    private JPanel getPanel() {
        JPanel panel = new JPanel(new GridLayout(4, 2));
        panel.add(lblNumérico);
        panel.add(txtObjeto);
        panel.add(new JLabel());
        panel.add(txtNumérico);
        panel.add(lblCadena);
        panel.add(txtCadena);
        panel.add(lblFecha);
        panel.add(txtFecha);
        return panel;
    }
 
    /**
     * Devuelve un JFormattedTextField que captura datos del tipo del objeto que
     * recibe. Es la forma más simple de utilizar estos componentes.
     */
    private JFormattedTextField getTxtObjeto() {
        //Crea un campo de 6 columnas con un valor inicial numérico
        //entero.
        JFormattedTextField txtObjeto = new JFormattedTextField(new Integer(0));
        //Los campos numéricos normalmente se alínean a la derecha
        txtObjeto.setHorizontalAlignment(JFormattedTextField.TRAILING);
        //Este evento se activa al perder el foco u oprimir enter
        txtObjeto.addPropertyChangeListener("value",
                new PropertyChangeListener() {
                    public void propertyChange(PropertyChangeEvent evt) {
                        leeTxtObjeto();
                    }
                });
        return txtObjeto;
    }
 
    /**
     * Devuelve un JFormattedTextField que captura datos de tipo numérico
     * y obliga a que se respete la máscara de captura. Revisar la
     * especificación de la DecimalFormat para obtener el formato de
     * la máscara de captura.
     * En este esquema se usa un DecimalFormat para desplegar la información
     * capturada y un NumberFormatter para validar la información.
     * Para el DecimalFormat las cadenas tinen uno de dos formatos:
     * "formato de positivos;formato de negativos"
     * "formato de positivos" automáticamente los números negativos tienen el
     * mismo formato, pero le antepone el signo '-'. Los caracteres permitidos
     * son:
     * 0          | Dígito
     * #          | Dígito. Si no aparece, pone cero
     * .          | Separador decimal o de moneda
     * -          | Signo menos
     * ,          | Separador de grupo
     * E          | Separa mantisa del exponente en notación científica
     * ;          | separador de patrones para positivos y para negativos
     * %          | Multiplica por 100 y muestra como porcentaje
     * \u2030     | Multiplica por 1000 y muestra como valor por mil
     * ¤ (\u00A4) | Se reemplaza por el signo de la moneda
     * '          | Caracter de escape, por ejemplo, "'#'#"
     *            | formatea 123 como "#123". Para ' usa ''.
     */
    public static JFormattedTextField getNumérico() {
        DecimalFormat nf = new DecimalFormat("#.00");
        NumberFormatter formatter = new NumberFormatter(nf);
        formatter.setValueClass(Double.class);
        formatter.setMinimum(new Double(0.0));
        formatter.setMaximum(new Double(40000.0));
        formatter.setAllowsInvalid(false);
        JFormattedTextField texto = new JFormattedTextField(formatter);
        texto.setHorizontalAlignment(JFormattedTextField.TRAILING);
        return texto;
    }
    /**
     * Devuelve un JFormattedTextField que captura datos de tipo texto
     * y obliga a que se respete la máscara de captura. Revisar la
     * especificación de la MaskFormatter para obtener el formato de
     * la máscara de captura. Los caracteres permitidos en el formato
     * son:
     * # | Cualquier dígito. Usa Character.isDigit.
     * ' | Caracter de escape para cualquier caracter especial
     * U | Cualquier letra (Character.isLetter). Las minúsculas
     *   |    se convierten en mayúsculas.
     * L | Cualquier letra (Character.isLetter). Las mayúsculas
     *   |    se convierten en minúsculas.
     * A | Cualquier letra o número. (Character.isLetter o Character.isDigit)
     * ? | Cualquier letra (Character.isLetter).
     * * | Cualquier caracter.
     * H | Cualquier caracter hexadecimal (0-9, a-f or A-F).
     */
    public static JFormattedTextField getTexto() {
        MaskFormatter formatter = null;
        try {
            formatter = new MaskFormatter("*****");
        } catch (ParseException e) {
            //Se llega a esta línea si la máscara no tiene el formato
            //correcto.
            e.printStackTrace();
        }
        JFormattedTextField texto = new JFormattedTextField(formatter);
        return texto;
    }
    /**
     * Devuelve un JFormattedTextField que captura datos de tipo fecha
     * y obliga a que se respete el formato especificado. Revisar la
     * especificación de la clase DateFormat para saber como configurar
     * el formato de la fecha. Se pueden crear con las siguientes
     * operaciones estáticas de DateFormat.
     * getDateInstance() - Obtiene un DateFormat solo para fechas con el
     *                  estilo por defecto para el locale por defecto.
     * getDateInstance(int estilo)- Obtiene un DateFormat solo para fechas
     *                  con el estilo indicado, para el locale por defecto.
     *                  El estilo puede ser
     *                  SHORT - completamente numérico como
     *                          12/13/52 o 3:30pm
     *                  MEDIUM - es más larga, como Jan 12, 1952
     *                  LONG - más larga, como January 12, 1952 o 3:30:32pm
     *                  FULL - completamente especificada, como
     *                          Tuesday, April 12, 1952 AD o 3:30:42pm PST.
     * getDateInstance(int estilo, Locale unLocale)
     * getDateTimeInstance() - Obtiene un DateFormat para fecha con hora,
     *                  con el estilo por defecto para el locale por defecto.
     * getDateTimeInstance(int estiloFecha, int estiloHora)
     * getDateTimeInstance(int estiloFecha,int estiloHora, Locale unLocale)
     * getInstance() - Obtiene un DateFormat para fecha con hora, que usa
     *                  el estilo SHORT para ambas y el locale por defecto.
     * getTimeInstance() - Obtiene un DateFormat para hora, con el estilo por
     *                  defecto para el locale por defecto.
     * getTimeInstance(int estilo)
     * getTimeInstance(int estilo, Locale unLocale)
     */
    private JFormattedTextField getTxtFecha() {
        DateFormat formato = DateFormat.getDateInstance();
        JFormattedTextField texto = new JFormattedTextField(formato);
        texto.setEditable(false);
        //Muestra la fecha de hoy
        texto.setValue(new Date());
        return texto;
    }

    public void leeTxtObjeto() {
        //Cuando el componente pierde el foco o se oprime enter,
        //Se invoca la instrucción commitEdit y se valida el
        //contenido. Si este no es válido, se descarta y regresa
        //al valor anterior.
        Number valor = (Number) txtObjeto.getValue();
        int nuevoValor = valor.intValue() * 2;
        //Cambia el valor
        txtCadena.setValue(String.valueOf(nuevoValor));
    }

    public static void muestra() {
        JFrame.setDefaultLookAndFeelDecorated(true);
        NumberExample frame = new NumberExample();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                muestra();
            }
        });
    }
}

No hay comentarios:

Publicar un comentario