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