Curso Java Experto
Clase 4
Cuando se utiliza la clase Date, el tiempo se representa mediante el número de milisegundos transcurridos a partir de un punto prefijado, la denominada época que es 00:00:00 UTC que denota Tiempo Universal Coordinado, esto es la hora estándar científica, que a efectos prácticos es más conocido como Hora Media de Greenwich (GMT).
Mientras que la clase Date reprensenta un instante en el tiempo, la clase Gregorian Calendar expresa las fechas con la notación de calendario.
new GregorianCalendar();
new GregorianCalendar(2015,11,31);
new GregorianCalendar(2015,Calendar.DECEMBER,31);
new GregorianCalendar(2015,Calendar.DECEMBER,31,23,59,59);
GregorianCalendar fechaLimite = new GregorianCalendar(...);GregorianCalendar ahora = new GregorianCalendar();
int mes = ahora.get(Calendar.MONTH);
int diaSemana = ahora.get(Calendar.DAY_OF_WEEK);Permite calcular atributos de un instante de tiempo (por ejemplo día de la semana mes, año, etc). Se utiliza el método get y una constante definida.
También permite setear estos mismos atributos con el método set.
fechaLimite.set(Calendar.YEAR, 2015);
fechaLimite.set(Calendar.MONTH, Calendar.APRIL);
fechaLimite.set(Calendar.DAY_OF_MONTH,15);Se pueden añadir un cierto número de días, semanas y meses.
fechaLimite.add(Calendar.MONTH,3);Los métodos setTime y getTime determinan o fijan el instante de tiempo que representa un objeto tipo calendario.
Date lahora = calendario.getTime();
calendario.setTime(lahora);Si se conoce día, mes y año y se quiere un objeto Date:
GregorianCalendar calendario = new GregorianCalendar(anio,mes,dia);
Date fechaContrato = calendario.getTime();
Si se desea averiguar el año, mes o día de un objeto Date:
GregorianCalendar calendario = new GregorianCalendar();
calendario.setTime(fechaContrato);
int anio = calendario.get(Calendar.YEAR);Clase SimpleDateFormat
Nos ayuda a mostrar las fechas en el formato que queramos o a reconstruirlas a partir de una cadena de texto.
import java.text.SimpleDateFormat;
...
SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
// Esto muestra la fecha actual en pantalla así 05/07/2016
System.out.println(formateador.format(new Date()));Para reconstruir una fecha a partir de la cadena de texto, podemos usar la misma clase SimpleDateFormat. Por ejemplo, si un usuario escribe una fecha con este formato en un JTextField, podemos leerla así
JTextField textField = new JTextField();
SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
try
{
Date fecha = formateador.parse(textField.getText());
}
catch (ParseException e)
{
// Error, la cadena de texto no se puede convertir en fecha.
}
Una cosa interesante es que a la hora de convertir un String a Date, la clase SimpleDateFormat es "indulgente", es decir, si metemos mal el String, trata de corregirlo. Por ejemplo, si introducimos una fecha "32 de Enero", no obtendremos error, sino que se arreglará y nos devolverá un Date correspondiente a "1 de Febrero". Podemos eliminar este comportamiento con el método setLenient(false);
SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
formateador.setLenient(false);de esta forma, el "32 de Enero" dará un error.
Otro aspecto importante a tener en cuenta es nunca utilizar
SimpleDateFormat formateador = new SimpleDateFormat("dd/mm/yyyy");
debido a que mm se refiere a minutos y no meses
lamina.setLayout(new FlowLayout(FlowLayout.LEFT));
FlowLayout(int alineacion, int espX,int espY)Los componentes se añaden especificando una constante llamada CENTER, NORTH, SOUTH, EAST o WEST.
lamina.setLayout(new BorderLayout());
lamina.add(botonAmarillo, BorderLayout.SOUTH);BorderLayout(int espX, int espY)setLayout(new BorderLayout());
JButton botonAmarillo = new JButton("Amarillo");
JButton botonAzul = new JButton("Azul");
JButton botonRojo = new JButton("Rojo");
add(botonAzul,BorderLayout.NORTH);
add(botonRojo,BorderLayout.CENTER);
JPanel contenedor = new JPanel();
contenedor.add(botonAmarillo);
add(contenedor,BorderLayout.SOUTH);setLayout(new BorderLayout());
JButton botonAmarillo = new JButton("Amarillo");
JButton botonAzul = new JButton("Azul");
JButton botonRojo = new JButton("Rojo");
add(botonAmarillo,BorderLayout.SOUTH);
add(botonAzul,BorderLayout.NORTH);
add(botonRojo,BorderLayout.CENTER);En el constructor se especifica el número de filas y columnas deseado.
lamina.setLayout(new GridLayout(5,4));También se puede especificar los espacios horizontales y verticales que se deseen. Se especifican en los últimos 2 parámetros del constructor.
lamina.setLayout(new GridLayout(5,4,3,3);Los componentes se van añadiendo, empezando por la primera entrada de la primera fila, para añadir después la segunda entrada de la primera fila y así sucesivamente
lamina.add(new JButton("1"));
lamina.add(new JButton("2"));
Un campo de texto admite una línea de texto.
Una zona de texto admite múltiples líneas de texto.
void setText (String texto)
String getText()
JPanel lamina = new JPanel();
JTextField campoDeTexto = new JTextField("Valor predetermindado", 20);
lamina.add(campoDeTexto);Segundo parámetro refiere a "columnas". Puede ser impreciso. Se pueden cambiar las columnas durante la ejecución:
campoDeTexto.setColumns(10);
lamina.revalidate();Se puede modificar el contenido del campo de texto en cualquier momento utilizando setText
campoDeTexto.setText("Hola");Se puede averiguar lo que ha escrito el usuario llamando al texto getText. Para recortar posibles espacios en blanco anteriores y posteriores usamos trim.
String texto = campoDeTexto.getText().trim();Constructores:
JLabel rotulo = new JLabel("Minutos",JLabel.RIGHT);Los campos de texto en Swing están representados de la siguiente forma: la cadena que se ve en el campo de texto es solo una manifestación visible (la vista) de una estructura de datos subyacente (el modelo).
El modelo de todos los componentes de texto se describe mediante la interfaz Document.
Se le puede pedir a Document que nos envíe una notificación siempre que cambies los datos.
campoDeTexto.getDocument().addDocumentListener(oyente);| void |
changedUpdate(DocumentEvent e)
Gives notification that an attribute or set of attributes changed. |
| void |
insertUpdate(DocumentEvent e)
Gives notification that there was an insert into the document. |
| void |
removeUpdate(DocumentEvent e)
Gives notification that a portion of the document has been removed. |
private class OyenteCampos implements DocumentListener {
public void insertUpdate(DocumentEvent evento) {}
public void removeUpdate(DocumentEvent evento) {}
public void changeUpdate(DocumentEvent evento) {}
}JPasswordField
Cada carácter que se escribe se representa mediante un carácter de eco, que generalmente va a ser un asterisco *.
|
JPasswordField()
Constructs a new JPasswordField, with a default document, null starting text string, and 0 column width. |
|
JPasswordField(Document doc, String txt, int columns)
Constructs a new JPasswordField that uses the given text storage model and the given number of columns. |
|
JPasswordField(int columns)
Constructs a new empty JPasswordField with the specified number of columns. |
|
JPasswordField(String text)
Constructs a new JPasswordField initialized with the specified text. |
|
JPasswordField(String text, int columns)
Constructs a new JPasswordField initialized with the specified text and columns. |
void setEchoChar(char eco): determina el carácter de eco para este campo de contraseña.
char[] getPassword(): proporciona el texto contenido en este campo de contraseña. Para mayor seguridad se debe reescribir el contenido de la matriz proporcionada después de utilizarla. La contraseña no se proporciona como cadena porque la cadena permanecería en la máquina virtual hasta que actue el garbage collector.
JFormattedTextField campoInt = new JFormattedTextField(NumberFormat.getIntegerInstance());Al igual que los campos de texto pueden setearse las columnas:
campoInt.setColumns(6);Se puede especificar un valor predeterminado:
campoInt.setValue(new Integer(100));Obtener el valor ingresado:
Number valor = (Number) campoInt.getValue();
int v = valor.intValue();Cuando pierde el foco, el formateador examina la cadena de texto que ha generado el usuario.
Si el formateador conoce la forma de traducir la cadena de texto a un objeto, el texto es válido. De lo contrario es inválido.
Se puede utilizar el método isEditValid
Existen distintos comportamientos.
Para aplicarlos a campos de texto se utiliza el método isEditValid de la clase JFormattedTextField.
class Verificador extends InputVerifier {
public boolean verify(JComponent componente)
{
JFormattedTextField campo = (JFormattedTextField) componente;
return campo.isEditValid();
}
}Se puede asociar a cualquier JFormattedTextField
campoInt.setInputVerifier(new Verificador());Problema: si se hace click en un botón, entonces el botón envía notificaciones a sus oyentes de acción antes que un componente de contenido incorrecto pueda volver a conseguir el foco.
Además del formateador para números enteros, el JFormattedTextField admite otros. La clase NumberFormat posee los método estáticos:
JFormattedTextField campoMonetario = new FormattedTextField(NumberFormat.getCurrencyInstance());Para editar fechas y horas, invoque uno de los métodos estáticos de la clase DateFormat:
JFormattedTextField campoFechas = new JFormattedTextField(DateFormat.getDateInstance());Este campo permite editar fechas con el formato predeterminado o medio (medium), como el siguiente:
Feb 24, 2016
Se puede seleccionar el corto:
2/24/16
efectuando la llamada:
DateFormat.getDateInstance(DateFormat.SHORT)Es útil para patrones de tamaño fijo que contengan algunos caracteres constantes y algunos variables, por ejemplo patentes de autos.
new MaskFormatter("##UUU##");| # | Un dígito |
| ? | Una letra |
| U | Una letra en mayúscula |
| L | Una letra en minúscula |
| A | Una letra o dígito |
| H | Un dígito hexadecimal |
| * | Cualquier carácter |
| ' | Un carácter de escape, para incluir un símbolo en el patrón |
Símbolos de MaskFormatter
Se pueden restringir los carácteres que se pueden escribir en el campo invocando a uno de los métodos de MaskFormatter:
setValidCharacters
setInvalidCharacters
Por ejemplo en el sistema de calificaciones de EEUU se podría usar:
MaskFormatter formateador = new MaskFormatter("U*");
formateador.setValidCharacters("ABCD+-");Pero no hay forma de especificar que el segundo caracter no puede ser una letra.
Sirve para obtener entradas de usuario que ocupan más de una línea. Se utiliza el componente JTextArea.
// 8 líneas de 40 columnas cada una
JTextArea zonaTexto = new JTextArea(8,40);//las líneas largas pasan automáticamente a la siguiente
zonaTexto.setLineWrap(true);zonaTexto = new JTextArea(8,40);
JScrollPanel laminaDesplazamiento = new JScrollPanel(zonaTexto);El usuario marca el cuadro haciendo click en su interior y lo deja sin marcar haciendo click de nuevo. También puede pulsar la barra espaciadora cuando tiene el foco.
Las casillas de verificación precisan un rótulo para identificar su propósito, se da en el constructor:
JCheckBox casilla = new JCheckBox("Opcion 1");Para activar o desactivar una casilla de verificación se utiliza el método setSelected:
casilla.setSelected(true);El método isSelected() recupera entonces el estado actual de la casilla de verificación, toma el valor false si no esta marcaba y true si lo esta.
Boolean estaSeleccionada = casilla.isSelected();Cuando el usuario hace click en una casilla de verificación, se genera un evento de acción. Podremos asociar entonces, un oyente de acciones a la casilla de verificación.
ActionListener oyente = ...;
casilla.addActionListener(oyente);En las casillas de verificación el usuario puede marcar una de las casillas, las dos o ninguna. En muchos casos necesitamos que el usuario marque tan solo una. Cuando se marca otra casilla, la que estuviera marcada anteriormente, se quedaría sin marcar automáticamente. Estos grupos de cuadros suelen denominarse grupos de botones de radio.
Se construye un objeto de tipo ButtonGroup para cada grupo de botones. Después se van añadiendo objetos de tipo JRadioButton al grupo de botones. El objeto de grupo de botones tiene la responsabilidad de desactivar el botón que estuviera activado anteriormente cuando se hace click en un nuevo botón.
ButtonGroup grupo = new ButtonGroup();
JRadioButton botonPequeño = new JRadioButton("Pequeño", false);
grupo.add(botonPequeño);
JRadioButton botonMediano = new JRadioButton("Mediano",true);
grupo.add(botonMediano);
...El segundo argumento del constructor es true para el botón que debe quedar marcado inicialmente y false para los demás. Observe que el grupo de botones controla únicamente el comportamiento de los botones. Si se dese agrupar los botones a efecto de su disposición es necesario añadirlos a un contenedor tal como un JPanel.
Cuando el usuario marca un botón de radio, el botón de radio genera un evento de acción.
ActionListener oyente = new
ActionListener(){
public void actionPerformed(ActionEvent evento)
{
...
}
};
botonPequeño.addActionListener(oyente);Si se tiene múltiples grupos de botones de radio en una ventana, será necesario indicar visualmente que botones están agrupados.
Se puede aplicar un borde a cualquier componente que extienda de JComponent.
Ejemplo borde grabado con título:
Border grabado = BorderFactory.createEtchedBorder();
Border conTitulo = BorderFactory.createTitledBorder(grabado,"El título");
lamina.setBorder(conTitulo);2. Se puede añadir un título al borde pasando el borde a BorderFactory.createTitledBorder.
3. Añadir al componente el borde resultante mediante una llamada al método setBorder de la clase JComponent.
Si se disponen más de unas pocas alternativas, los botones de radio no son una opción.
Se puede utilizar un ComboBox. Cuando el usuario hace click en el componente, se despliega una lista de opciones y entonces el usuario puede seleccionar una de ellas.
JComboBox comboFuente = new JComboBox();
comboFuentes.setEditable(true);
comboFuentes.addItem("Serif");
comboFuentes.addItem("SansSerif");comboFuentes.insertItemAt("Monospaced",0);public void actionPerformed(ActionEvent evento)
{
String fuente = (String) comboFuentes.getSelectedItem();
...
}JTable es una herramienta visual de Java que sirve para poder dibujar tablas, con sus respectivas filas y columnas para visualizar información.
La JTable controla cómo se presentan los datos, siendo el TableModel quien controla los datos en sí mismos. Para crear una JTable habrá pues que crear un TableModel antes, normalmente.
https://docs.oracle.com/javase/tutorial/uiswing/components/table.html
|
JTable()
Constructs a default JTable that is initialized with a default data model, a default column model, and a default selection model. |
|
JTable(int numRows, int numColumns)
Constructs a JTable with numRows and numColumns of empty cells using DefaultTableModel. |
|
JTable(Object[][] rowData, Object[] columnNames)
Constructs a JTable to display the values in the two dimensional array, rowData, with column names, columnNames. |
|
JTable(TableModel dm)
Constructs a JTable that is initialized with dm as the data model, a default column model, and a default selection model. |
|
JTable(TableModel dm, TableColumnModel cm)
Constructs a JTable that is initialized with dm as the data model, cm as the column model, and a default selection model. |
|
JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm)
Constructs a JTable that is initialized with dm as the data model, cm as the column model, and sm as the selection model. |
|
JTable(Vector rowData, Vector columnNames)
Constructs a JTable to display the values in the Vector of Vectors, rowData, with column names, columnNames. |
El DefaultTableModel es una clase que implementa TableModel que contiene todos los métodos necesarios para modificar datos en su interior, añadir filas o columnas y darle a cada columna el nombre que se desee. Para utilizar DefaultTableModel debemos importarla y luego declararla para luego poder usar la clase JTable, un ejemplo es:
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
DefaultTableModel modelo = new DefaultTableModel();
JTable tabla = new JTable (modelo);|
DefaultTableModel()
Constructs a default DefaultTableModel which is a table of zero columns and zero rows. |
|
DefaultTableModel(int rowCount, int columnCount)
Constructs a DefaultTableModel with rowCount and columnCount of null object values. |
|
DefaultTableModel(Object[][] data, Object[] columnNames)
Constructs a DefaultTableModel and initializes the table by passing data and columnNames to the setDataVector method. |
|
DefaultTableModel(Object[] columnNames, int rowCount)
Constructs a DefaultTableModel with as many columns as there are elements in columnNames and rowCount of null object values. |
|
DefaultTableModel(Vector columnNames, int rowCount)
Constructs a DefaultTableModel with as many columns as there are elements in columnNames and rowCount of null object values. |
|
DefaultTableModel(Vector data, Vector columnNames)
Constructs a DefaultTableModel and initializes the table by passing data and columnNames to the setDataVector method. |
Es una clase importada en swing que permite asociarle una pequeña vista o ventana deslizable o corrediza, que permite solo que se vea una parte de dicho complemento en la tabla. Para poder usarlo, importamos la clase y luego la declaramos, un ejemplo sería:
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
DefaultTableModel modelo = new DefaultTableModel();
JTable tabla = new JTable (modelo);
JSrollPane scrollpane = new JScrollPane(tabla);Se añada directamente el JScrollPane a la lámina.
Según el modo de selección, el usuario podrá marcar filas, columnas o una celda individual de la tabla. Por defecto se activa la selección de filas.
Para desactivar este comportamiento:
tabla.setRowSelectionAllowed(false);Cuando está activa la selección de una fila, puede determinar si el usuario tiene permiso para elegir una sola fila, un rango continuo de ellas o cualquiera de la incluidas en la tabla. Para ello de debe recuperar el modelo de selección y usar su método setSelectionMode:
tabla.getSelectionModel().setSelectionMode(modo);En este caso modo es uno de estos tres valores:
La selección de columna esta desactivada por defecto. Para activarla utilice la siguiente llamada:
tabla.setColumnSelectionAllowed(true);Habilitar la selección de fila y columna es equivalente a permitir la selección de una celda. Después, el usuario puede marcar conjuntos de ellas. También puede habilitar el comportamiento con esta llamada:
tabla.setCellSelectionEnabled(true);Para determinar que filas y que columnas están seleccionadas utilice los métodos getSelectedRows y getSelectedColumns. Ambos devuelven un array int[] con las posiciones de dichos elementos.
En el caso de tratarse de una sola fila la que se puede seleccionar, puede utilizar el método getSelectedRow.
Determinar selección
Por defecto, las tablas creadas permiten la edición de sus celdas. Para evitar este comportamiento se debe sobreescribir un método de la clase JTable:
tabla = new JTable(modelTabla) {
public boolean isCellEditable(int row, int column) {
return false;
};
};Swing posee un conjunto de diálogos sencillos prefabricados, que nos bastan cuando necesitamos pedir al usuario poca información.
| showMessageDialog | Muestra un mensaje y espera que el usuario haga click en OK |
| showConfirmDialog | Muestra un mensaje y espera confirmación (tal como OK / Cancelar |
| showOptionDialog | Muestra un mensaje y obtiene una opción del usuario de un conjunto de opciones |
| showInputDialog | Muestra un mensaje y obtiene una línea de entrada de usuario. |
El diálogo tiene los componentes siguientes:
El ícono del lado izquierdo depende de uno de entre cinco tipos de mensaje:
Cada tipo de diálogo posee también un método que nos permite proporcionar nuestro propio ícono.
Puede ser una cadena, un ícono, un componente de interfaz de usuario o cualquier otro objeto.
| String | Se dibuja la cadena |
| Icon | Se muestra el ícono |
| Component | Se muestra el componente |
| Object[] | Se muestran los objetos |
| cualquier otro objeto | Se le aplica toString y se muestra la cadena resultante |
Dependen del tipo de diálogo y del tipo de opciones. Cuando se llama a showMessageDialog y showInputDialog, solo se obtiene un conjunto estándar de biblioteca (OK y OK/Cancelar, respectivamente). Cuando se llama showConfirmDialog, se puede optar entre 4 tipos de opciones:
Empleando el showOptionDialog se puede especificar un conjunto arbitrario de opciones. Proporcionamos una matriz de objetos para las opciones.
Los valores proporcionados por estas funciones son las siguientes:
| showMessageDialog | Ninguno |
| showConfirmDialog | Un entero que representa la opción seleccionada |
| showOptionDialog | Un entero que representa la opción seleccionada |
| showInputDialog | La cadena seleccionada o proporcionada por el usuario. |
Las llamadas a showConfirmDialog y showOptionDialog proporcionan enteros que denotan el botón seleccionado.
int seleccion = JOptionPane.showConfirmDialog(padre,
"Mensaje",
"Titulo",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if(seleccion == JOptionPane.OK_OPTION)...Revisar los ejercicios propuestos para la clase 4 https://github.com/marinabgarcia/CursoJava
Desarrollo de Interfaz de Usuario.