├── .gitignore ├── Clase2 ├── bin │ └── app │ │ ├── App.class │ │ ├── App$1.class │ │ ├── login │ │ └── LoginTemplate.class │ │ └── vistaPrincipal │ │ └── VistaPrincipalTemplate.class ├── .classpath ├── src │ └── app │ │ ├── App.java │ │ ├── vistaPrincipal │ │ └── VistaPrincipalTemplate.java │ │ └── login │ │ └── LoginTemplate.java ├── .settings │ └── org.eclipse.jdt.core.prefs └── .project └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | resources -------------------------------------------------------------------------------- /Clase2/bin/app/App.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrissUD/InterfazGraficaJavaClase2/HEAD/Clase2/bin/app/App.class -------------------------------------------------------------------------------- /Clase2/bin/app/App$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrissUD/InterfazGraficaJavaClase2/HEAD/Clase2/bin/app/App$1.class -------------------------------------------------------------------------------- /Clase2/bin/app/login/LoginTemplate.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrissUD/InterfazGraficaJavaClase2/HEAD/Clase2/bin/app/login/LoginTemplate.class -------------------------------------------------------------------------------- /Clase2/bin/app/vistaPrincipal/VistaPrincipalTemplate.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrissUD/InterfazGraficaJavaClase2/HEAD/Clase2/bin/app/vistaPrincipal/VistaPrincipalTemplate.class -------------------------------------------------------------------------------- /Clase2/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Clase2/src/app/App.java: -------------------------------------------------------------------------------- 1 | package app; 2 | 3 | import javax.swing.SwingUtilities; 4 | 5 | import app.login.LoginTemplate; 6 | 7 | public class App { 8 | public static void main(String[] args) { 9 | Runnable runApplication = new Runnable() { 10 | public void run(){ 11 | LoginTemplate login = new LoginTemplate(); 12 | login.getClass(); 13 | } 14 | }; 15 | SwingUtilities.invokeLater(runApplication); 16 | } 17 | } -------------------------------------------------------------------------------- /Clase2/src/app/vistaPrincipal/VistaPrincipalTemplate.java: -------------------------------------------------------------------------------- 1 | package app.vistaPrincipal; 2 | 3 | import javax.swing.JFrame; 4 | 5 | public class VistaPrincipalTemplate extends JFrame { 6 | private static final long serialVersionUID = 1L; 7 | 8 | public VistaPrincipalTemplate() { 9 | super("Vista Principal"); 10 | 11 | setDefaultCloseOperation(EXIT_ON_CLOSE); 12 | setSize(1200, 700); 13 | setLocationRelativeTo(this); 14 | setLayout(null); 15 | setVisible(true); 16 | } 17 | } -------------------------------------------------------------------------------- /Clase2/.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=10 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 | org.eclipse.jdt.core.compiler.source=11 12 | -------------------------------------------------------------------------------- /Clase2/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | Clase2 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | 19 | 1599510390565 20 | 21 | 30 22 | 23 | org.eclipse.core.resources.regexFilterMatcher 24 | node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Clase2/src/app/login/LoginTemplate.java: -------------------------------------------------------------------------------- 1 | package app.login; 2 | 3 | import java.awt.Color; 4 | import javax.swing.JPanel; 5 | import javax.swing.JPasswordField; 6 | // import javax.swing.JRadioButton; 7 | // import javax.swing.JTextArea; 8 | import javax.swing.JTextField; 9 | import javax.swing.SwingConstants; 10 | import javax.swing.ButtonGroup; 11 | import javax.swing.JButton; 12 | import javax.swing.JCheckBox; 13 | import javax.swing.JComboBox; 14 | import javax.swing.JFrame; 15 | import javax.swing.JLabel; 16 | 17 | public class LoginTemplate extends JFrame { 18 | private static final long serialVersionUID = 1L; 19 | 20 | // Declaración Objetos Gráficos 21 | private JPanel pDerecha, pIzquierda; 22 | private JLabel lTituloApp, lEslogan, lTituloLogin, lNotificaciones; 23 | private JTextField tNombreUsuario; 24 | private JPasswordField tClaveUsuario; 25 | private JComboBox cbTipoUsuario; 26 | private JButton bEntrar, bCerrar, bRegistrarse, bOpcion1, bOpcion2, bOpcion3; 27 | private JCheckBox checkSi, checkNo; 28 | private ButtonGroup grupo; 29 | // private JRadioButton rbOpcion1, rbOpcion2; 30 | // private JTextArea taSugerencias; 31 | 32 | public LoginTemplate() { 33 | super("Login Usuario"); 34 | 35 | pIzquierda = new JPanel(); 36 | pIzquierda.setSize(600, 500); 37 | pIzquierda.setLocation(0, 0); 38 | pIzquierda.setBackground(Color.BLUE); 39 | pIzquierda.setLayout(null); 40 | this.add(pIzquierda); 41 | 42 | pDerecha = new JPanel(); 43 | pDerecha.setSize(400, 500); 44 | pDerecha.setLocation(600, 0); 45 | pDerecha.setBackground(Color.WHITE); 46 | pDerecha.setLayout(null); 47 | this.add(pDerecha); 48 | 49 | lTituloApp = new JLabel("Login de Usuario"); 50 | lTituloApp.setBounds(100, 20, 220, 30); 51 | lTituloApp.setForeground(Color.WHITE); 52 | pIzquierda.add(lTituloApp); 53 | 54 | lEslogan = new JLabel("Te ayudamos en todo"); 55 | lEslogan.setSize(130, 20); 56 | lEslogan.setLocation((pDerecha.getWidth() - lEslogan.getWidth()) / 2, 40); 57 | lEslogan.setForeground(Color.DARK_GRAY); 58 | lEslogan.setHorizontalAlignment(SwingConstants.CENTER); 59 | pDerecha.add(lEslogan); 60 | 61 | lTituloLogin = new JLabel("Registra tus Datos"); 62 | lTituloLogin.setSize(150, 30); 63 | lTituloLogin.setLocation((pDerecha.getWidth() - lTituloLogin.getWidth()) / 2, 60); 64 | lTituloLogin.setForeground(Color.DARK_GRAY); 65 | lTituloLogin.setHorizontalAlignment(SwingConstants.CENTER); 66 | pDerecha.add(lTituloLogin); 67 | 68 | lNotificaciones = new JLabel("¿Recibir Notificaciones?"); 69 | lNotificaciones.setSize(140, 20); 70 | lNotificaciones.setLocation((pDerecha.getWidth() - lNotificaciones.getWidth()) / 2, 370); 71 | lNotificaciones.setForeground(Color.DARK_GRAY); 72 | lNotificaciones.setHorizontalAlignment(SwingConstants.CENTER); 73 | pDerecha.add(lNotificaciones); 74 | 75 | tNombreUsuario = new JTextField("Nombre Usuario"); 76 | tNombreUsuario.setSize(260, 40); 77 | tNombreUsuario.setLocation((pDerecha.getWidth() - tNombreUsuario.getWidth()) / 2, 120); 78 | tNombreUsuario.setForeground(Color.DARK_GRAY); 79 | tNombreUsuario.setBackground(Color.WHITE); 80 | tNombreUsuario.setCaretColor(Color.BLUE); 81 | tNombreUsuario.setHorizontalAlignment(SwingConstants.CENTER); 82 | pDerecha.add(tNombreUsuario); 83 | 84 | tClaveUsuario = new JPasswordField("Clave Usuario"); 85 | tClaveUsuario.setSize(260, 40); 86 | tClaveUsuario.setLocation((pDerecha.getWidth() - tClaveUsuario.getWidth()) / 2, 240); 87 | tClaveUsuario.setForeground(Color.DARK_GRAY); 88 | tClaveUsuario.setCaretColor(Color.BLUE); 89 | tClaveUsuario.setHorizontalAlignment(SwingConstants.CENTER); 90 | pDerecha.add(tClaveUsuario); 91 | 92 | cbTipoUsuario = new JComboBox(); 93 | cbTipoUsuario.addItem("Cliente"); 94 | cbTipoUsuario.addItem("Cajero"); 95 | cbTipoUsuario.addItem("Administrador"); 96 | cbTipoUsuario.setSize(220, 30); 97 | cbTipoUsuario.setLocation((pDerecha.getWidth() - cbTipoUsuario.getWidth()) / 2, 185); 98 | cbTipoUsuario.setForeground(Color.DARK_GRAY); 99 | cbTipoUsuario.setBackground(Color.WHITE); 100 | ((JLabel) cbTipoUsuario.getRenderer()).setHorizontalAlignment(SwingConstants.CENTER); 101 | pDerecha.add(cbTipoUsuario); 102 | 103 | bEntrar = new JButton("Entrar"); 104 | bEntrar.setSize(250, 45); 105 | bEntrar.setLocation((pDerecha.getWidth() - bEntrar.getWidth()) / 2, 300); 106 | bEntrar.setFocusable(false); 107 | bEntrar.setBackground(Color.BLUE); 108 | bEntrar.setForeground(Color.WHITE); 109 | pDerecha.add(bEntrar); 110 | 111 | bCerrar = new JButton("X"); 112 | bCerrar.setBounds(330, 10, 45, 30); 113 | bCerrar.setFocusable(false); 114 | bCerrar.setBackground(Color.BLUE); 115 | bCerrar.setForeground(Color.WHITE); 116 | pDerecha.add(bCerrar); 117 | 118 | bRegistrarse = new JButton("Registrarse"); 119 | bRegistrarse.setBounds(230, 420, 145, 35); 120 | bRegistrarse.setFocusable(false); 121 | bRegistrarse.setBackground(Color.BLUE); 122 | bRegistrarse.setForeground(Color.WHITE); 123 | pDerecha.add(bRegistrarse); 124 | 125 | bOpcion1 = new JButton(); 126 | bOpcion1.setBounds(10, 220, 30, 20); 127 | pIzquierda.add(bOpcion1); 128 | 129 | bOpcion2 = new JButton(); 130 | bOpcion2.setBounds(10, 250, 30, 20); 131 | pIzquierda.add(bOpcion2); 132 | 133 | bOpcion3 = new JButton(); 134 | bOpcion3.setBounds(10, 280, 30, 20); 135 | pIzquierda.add(bOpcion3); 136 | 137 | checkSi = new JCheckBox("Si"); 138 | checkSi.setSize(45, 25); 139 | checkSi.setFocusable(false); 140 | checkSi.setBackground(Color.WHITE); 141 | checkSi.setLocation((pDerecha.getWidth() - checkSi.getWidth()) / 2 - 15, 345); 142 | pDerecha.add(checkSi); 143 | 144 | checkNo = new JCheckBox("No"); 145 | checkNo.setSize(45, 25); 146 | checkNo.setFocusable(false); 147 | checkNo.setBackground(Color.WHITE); 148 | checkNo.setLocation((pDerecha.getWidth() + checkNo.getWidth()) / 2 - 15, 345); 149 | pDerecha.add(checkNo); 150 | 151 | grupo = new ButtonGroup(); 152 | grupo.add(checkSi); 153 | grupo.add(checkNo); 154 | 155 | // rbOpcion1 = new JRadioButton("opcion1"); 156 | // rbOpcion1.setBounds(50, 400, 120, 30); 157 | // pIzquierda.add(rbOpcion1); 158 | 159 | // rbOpcion2 = new JRadioButton("opcion2"); 160 | // rbOpcion2.setBounds(200, 400, 120, 30); 161 | // pIzquierda.add(rbOpcion2); 162 | 163 | // taSugerencias = new JTextArea("Escribe algo..."); 164 | // taSugerencias.setBounds(185, 180, 230, 140); 165 | // pIzquierda.add(taSugerencias); 166 | 167 | setLayout(null); 168 | setDefaultCloseOperation(EXIT_ON_CLOSE); 169 | setSize(1000, 500); 170 | setLocationRelativeTo(this); 171 | setLayout(null); 172 | setVisible(true); 173 | } 174 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Interfaz Gráfica en Java 2 | 3 | Curso propuesto por el grupo de trabajo Semana de Ingenio y Diseño (**SID**) de la Universidad Distrital Francisco Jose de Caldas. 4 | 5 | ## Monitor 6 | 7 | **Cristian Felipe Patiño Cáceres** - Estudiante de Ingeniería de Sistemas de la Universidad Distrital Francisco Jose de Caldas 8 | 9 | # Clase 2 10 | 11 | ## Objetivos 12 | 13 | - Identificar las 4 etapas involucradas en la creación de objetos gráficos básicos para ser mostrados en pantalla en una vista. 14 | - Reconocer los métodos principales para configurar propiedades de los objetos gráficos y así ser mostrados en la pantalla. 15 | - Explorar el enfoque de posicionamiento por medio de pixeles sin el uso de manager de Layout. 16 | - Comprender la forma de adición de objetos gráficos en distintos objetos contenedores como pueden ser Frames (Ventanas) o Paneles. 17 | 18 | # Creación de objetos gráficos 19 | En esta sesión se verán conceptos relacionados con la creación de objetos gráficos y para esto se proporciona los siguientes items principales: 20 | * **Etapas de Creación de un Objeto Gráfico**. 21 | * **Creación de objetos gráficos básicos**. 22 | 23 | 24 | # Etapas de Creación de un Objeto Gráfico 25 | 26 | Las etapas de la creación de objetos gráficos son 3 principales, sin embargo la segunda se compone a su vez de dos etapas: 27 | 28 | * **Declaración** 29 | * **Construcción** 30 | * **Ejemplificación** 31 | * **Configuración** 32 | * **Adición / Agregación** 33 | 34 | ## **Declaración** 35 | 36 | La declaración de un objeto gráfico consiste en indicarle al sistema que la clase donde se esta trabajando tendrá un atributo de algún tipo de estos objetos. Esta declaración se suele ubicar al inicio de la clase y tiene 3 partes, estas son: 37 | 38 | - **Tipo Acceso:** El tipo de acceso a menudo será privado ya que son atributos de la clase y se debe respetar el principio de encapsulamiento como se discutió en la anterior clase. 39 | - **Tipo de Objeto Gráfico:** Se refiere a la clase del objeto que vamos a crear (JButton, JTextField, JLabel, JPanel son algunos ejemplos) y la generación de estas clases casi siempre van a necesitar la importación de la librería que soporte la creación del objeto, estas por lo general se importan automáticamente gracias al IDE o editor de código. 40 | - **Variable:** El nombre que el programador elija darle y sera esta el objeto por el cual se podrá acceder a sus métodos. 41 | 42 |
43 | 44 |

Declaración de dos objetos gráficos tipo JPanel con sus 3 partes

45 |
46 | 47 | ## **Ejemplificación** 48 | 49 | La ejemplificación del objeto Gráfico hace parte de la etapa de construcción y consiste en darle un valor inicial al objeto y para esto es necesario llamar al constructor de la clase, **este paso es importante y sin él no es posible realizar la configuración**. Para esta sesión las etapas de ejemplificación, configuración y adición se realizarán dentro del **constructor** de la clase. 50 | 51 |
52 | 53 |

Ejemplificación de dos objetos gráficos tipo JPanel

54 |
55 | 56 | ## **Configuración** 57 | 58 | La configuración también hace parte de la etapa de construcción y es la etapa donde se llaman a los métodos proporcionados por la clase del objeto gráfico para darle propiedades gráficas y estas puedan verse en la pantalla. Por ahora solo se mostrara un ejemplo, sin embargo, mas adelante en esta sesión se explicará la función de cada uno de los métodos de configuración usados. 59 | 60 |
61 | 62 |

Configuración de dos objetos gráficos justo después de haberse ejemplificado

63 |
64 | 65 | ## **Adición** 66 | 67 | Para este tramo el objeto gráfico esta listo para ser mostrado, sin embargo, aun no se ha creado la solicitud para que este sea agregado en la ventana, para esto es necesario adicionarlo a su objeto padre o también llamado objeto contenedor, un objeto contenedor puede ser una ventana, un panel, canvas etc. En este ejemplo el objeto padre es la ventana. Con el método **add()** se puede añadir el objeto gráfico. 68 | 69 |
70 | 71 |

Adición de dos objetos gráficos una vez se hayan declarado, ejemplificado y configurado.

72 |
73 | 74 | Puede verse en la anterior imagen que la forma de añadir elementos gráficos en la ventana consiste en llamar **this.add()** ya que la clase extiende de un JFrame. La palabra clave **this** hace referencia a que se esta llamando a la misma clase donde se esta codificando. Sin embargo pueden existir algunos objetos gráficos que no queremos añadir directamente en la ventana, se podrían añadir en un panel por ejemplo. A continuación se muestra como se podría hacer esto. 75 | 76 |
77 | 78 |

Adición de objetos gráficos dentro de Paneles

79 |
80 | 81 | # Creación de objetos gráficos básicos. 82 | 83 | En esta sección se verá la forma de crear objetos gráficos para ser mostrados en pantalla, basado en los 4 pasos que se acabaron de explicar. Los objetos explicados a continuación serán: 84 | 85 | - **JPanel** 86 | - **JLabel** 87 | - **JTextField** 88 | - **JPasswordField** 89 | - **JComboBox** 90 | - **JButton** 91 | - **JCheckBox** 92 | - **ButtonGroup** 93 | - **JRadioButton** (Se explicara brevemente su creación ya que es similar a la de checkBox) 94 | - **JTextArea** (Se explicara brevemente su creación ya que es similar a la de un TextField) 95 | 96 | ## Antes de comenzar 97 | 98 | Recordando la sesión 1, se crea una nueva clase llamada **LoginTemplate** y se configura la ventana. 99 | 100 |
101 | 102 |

Clase de login de usuario

103 |
104 | 105 | Por otro lado en la clase principal se va a llamar a esta clase dentro del hilo EDT: 106 | ```javascript 107 | public static void main(String[] args) { 108 | Runnable runApplication = new Runnable() { 109 | public void run(){ 110 | LoginTemplate login = new LoginTemplate(); 111 | login.getClass(); 112 | } 113 | }; 114 | SwingUtilities.invokeLater(runApplication); 115 | } 116 | ``` 117 | 118 | ## JPanel 119 | 120 | Los Paneles son la mejor forma de identificar partes de una ventana y modularizar diferentes secciones de esta y agrupando varios objetos gráficos que comparten un contexto. 121 | 122 | Para el ejemplo de esta sesión se van a crear 2 paneles (los mismos que se han creado para el ejemplo de las etapas de la creación de objetos gráficos). Un punto importante a resaltar y que se toma como un estándar del curso es que en la declaración de los paneles las variables (objetos) empiezan con una p minúscula seguido del nombre arbitrario de la variable, ahora se explicarán los métodos de configuración. 123 | 124 | ```javascript 125 | pIzquierda.setSize(600, 500); 126 | pIzquierda.setLocation(0, 0); 127 | pIzquierda.setBackground(Color.BLUE); 128 | ``` 129 | 130 | - **setSize:** Recibe por parámetros un par de enteros y definen el tamaño del panel, siendo el ancho el primer parámetro y el alto el segundo. 131 | - **setLocation:** Recibe por parámetros un par de enteros y definen la posición del panel, la posición en el eje x es el primer parámetro y la posición en el eje y el segundo. 132 | - **setBackground:** Recibe por parámetro un *objeto decorador* de tipo Color y define el color de fondo del panel. 133 | 134 | Los métodos **setSize** y **setLocation** pueden ser reemplazados por el método: 135 | 136 | - **setBounds:** Recibe por parámetros 4 números enteros de los cuales los dos primeros representan la posición y los dos últimos el tamaño **(x, y, ancho, alto)** 137 | 138 | Hasta el momento la ventana se ve así: 139 | 140 |
141 | 142 |

Interfaz login de usuario con 2 paneles

143 |
144 | 145 | Por ahora todo luce bien, sin embargo hay una propiedad crucial que no se explico a propósito, más adelante se va a recalcar. Los colores se configuraron para verificar la existencia de los paneles en la ventana, por ahora cambiará el color de fondo del panel **pDerecha** por un color blanco. 146 | 147 | ```javascript 148 | pDerecha.setBackground(Color.WHITE); 149 | ``` 150 | 151 | El código se ve asi: 152 | 153 |
154 | 155 |

Clase de login de usuario

156 |
157 | 158 | Cabe resaltar que la configuración de la ventana se suele colocar de ultimas, si se deja en otros lados probablemente el programa tendrá problemas en mostrar la interfaz. Sobretodo la ultima linea de código **setVisible** debe ser la ultima en llamarse, ya que primero se deben agregan todos los elementos en la ventana para luego ser mostrada. 159 | 160 | ## JLabel 161 | 162 | Los label en las interfaces gráficas representan textos o imágenes que se quieren mostrar en pantalla y que el usuario no podrá cambiar, normalmente son usados para dar indicaciones, títulos, subtítulos, iconos, logos etc. 163 | 164 | Se puede empezar colocando un título en la interfaz, para esto se crea un JLabel (Realizando los 4 pasos anteriores)Ñ 165 | 166 | * **Declaración** 167 | ```javascript 168 | // Al inicio de la clase 169 | private JLabel lTituloApp; 170 | ``` 171 | 172 | La variable (objeto) que se coloca para los label empezarán con l minúscula seguido del nombre de la variable. 173 | 174 | * **Ejemplificación** 175 | ```javascript 176 | // Dentro del constructor 177 | lTituloApp = new JLabel("Login de Usuario"); 178 | ``` 179 | 180 | Se puede notar que cuando se ejemplifica el objeto de tipo JLabel este puede recibir por parámetro en el constructor un String que representa el texto que se mostrará en pantalla, esto no es obligatorio, se puede crear con parámetros vacíos y mas adelante llamar al método **setText()** que también recibe un String y cumple la misma función, pero esta es una buena forma de ahorrar código. 181 | 182 | * **Configuración** 183 | ```javascript 184 | // Dentro del constructor 185 | lTituloApp.setBounds(100, 20, 220, 30); 186 | lTituloApp.setForeground(Color.WHITE); 187 | ``` 188 | 189 | Puede notarse que en esta ocasión se utiliza el método **setBounds** en lugar de **setSize y setLocation** por separado, en realidad las dos formas son correctas y habrán casos donde se necesita hacer de una forma u otra. A parte tenemos otro método: 190 | 191 | - **setForeground:** Recibe por parámetro un *objeto decorador* de tipo Color y representa el color de la fuente del JLabel. 192 | 193 | * **Adición** 194 | ```javascript 195 | // Dentro del constructor 196 | pIzquierda.add(lTituloApp); 197 | ``` 198 | 199 | Puede observarse que este objeto se añadirá al panel de la izquierda y no en la ventana directamente. Ahora bien si se ejecuta la aplicación para ver el label es posible notar que este no se posiciono exactamente donde se configuro, ¿no se ve muy claro? ahora se hará un pequeño cambio. Posicionando el objeto 100 pixeles más hacia abajo. 200 | 201 | ```javascript 202 | lTituloApp.setBounds(100, 120, 200, 30); 203 | ``` 204 | 205 | Una vez la aplicación se ejecuta de nuevo el Label esta en la misma posición que antes. 206 | 207 | **¿Por que esta pasando esto?** 208 | 209 | Esto se debe al manager de posicionamiento de Java que por defecto maneja un Layout predeterminado, el cual tratará de dejar los objetos en la parte superior central de la ventana, cuando esta tiene dos o mas objetos tratará de dividir el panel de forma equitativa para posicionar los objetos de forma centrada. En muchas ocasiones esto no es lo que se busca. Para esto se debe configurar la ventana y los paneles para que deje nula esa propiedad y **sea el desarrollador quien posicione los objetos mediante el enfoque de posicionamiento en pixeles.** 210 | 211 | ```javascript 212 | // Se coloca en su respectiva configuración 213 | pDerecha.setLayout(null); 214 | pIzquierda.setLayout(null); 215 | setLayout(null); // configuración de la ventana 216 | ``` 217 | 218 | Una vez corre la aplicación se observa como el Label esta en los pixeles indicados. Los 100 pixeles de mas en el eje Y se colocaron como prueba, se dejará la posición como se dejo originalmente. 219 | 220 | ```javascript 221 | lTituloApp.setBounds(100, 20, 200, 30); 222 | ``` 223 | 224 | También se va a añadir 3 label mas: 225 | 226 | * **Declaración:** 227 | ```javascript 228 | // Al inicio de la clase 229 | private JLabel lTituloApp, lEslogan, lTituloLogin, lNotificaciones; 230 | ``` 231 | 232 | * **Ejemplificación, configuración y adición** 233 | ```javascript 234 | // Dentro del constructor 235 | lEslogan = new JLabel("Te ayudamos en todo"); 236 | lEslogan.setSize(130, 20); 237 | lEslogan.setLocation((pDerecha.getWidth() - lEslogan.getWidth()) / 2, 40); 238 | lEslogan.setForeground(Color.DARK_GRAY); 239 | lEslogan.setHorizontalAlignment(SwingConstants.CENTER); 240 | pDerecha.add(lEslogan); 241 | 242 | lTituloLogin = new JLabel("Registra tus Datos"); 243 | lTituloLogin.setSize(150, 30); 244 | lTituloLogin.setLocation((pDerecha.getWidth() - lTituloLogin.getWidth()) / 2, 60); 245 | lTituloLogin.setForeground(Color.DARK_GRAY); 246 | lTituloLogin.setHorizontalAlignment(SwingConstants.CENTER); 247 | pDerecha.add(lTituloLogin); 248 | 249 | lNotificaciones = new JLabel("¿Recibir Notificaciones?"); 250 | lNotificaciones.setSize(140, 20); 251 | lNotificaciones.setLocation((pDerecha.getWidth() - lNotificaciones.getWidth()) / 2, 370); 252 | lNotificaciones.setForeground(Color.DARK_GRAY); 253 | lNotificaciones.setHorizontalAlignment(SwingConstants.CENTER); 254 | pDerecha.add(lNotificaciones); 255 | ``` 256 | 257 | En el anterior código se resalta la importancia de cuando usar el enfoque de tamaño y posicionamiento por separado. Por ejemplo cuando un elemento se quiere colocar en el centro con respecto ya sea a su panel padre o a la ventana. Para esto se debe hacer un calculo que es: 258 | 259 | - **(Ancho de panel - Ancho Objeto)/ 2** 260 | 261 | El ancho de un objeto gráfico puede conocerse grácias al método **getWidth**. Sin embargo, para conocer el ancho del objeto es necesario proporcionarle la propiedad de tamaño previamente usando **setSize**. Si se usa **setBounds** al pedir los 4 datos al tiempo este no tendrá aun un ancho definido aun y no podrá calcularse la anterior operación. 262 | 263 | Por otro lado los Label por defecto centran el texto en el eje vertical, pero en el eje horizontal el texto esta colocado por defecto en la parte izquierda o inicial del label, en este caso se quiere que el texto de forma interna este centrado con respecto al tamaño del label, para esto se usa el método: 264 | 265 | - **setHorizontalAlignment:** Recibe por parámetro un objeto tipo **SwingConstants** y le da la dirección de la posición horizontal del texto. Si no se llama por defecto el texto estará posicionado en la parte izquierda, sus otras opciones principales son **CENTER** y **RIGHT**. Aunque existen más opciones, estas configuran la posición con respecto al eje Y, y no son necesarias en este método. 266 | 267 | La ventana se esta viendo así: 268 | 269 |
270 | 271 |

Interfaz login de usuario con paneles y labels

272 |
273 | 274 | ## JTextField 275 | 276 | Los TextField son cajas de texto donde el usuario va poder ingresar información importante que la aplicación necesita de él. Muchas veces estará dentro de formularios donde se pide información, otras veces servirán como medio para realizar una consulta especifica, para modificar información etc. 277 | 278 | Para este caso se usará un JTextField para que el cliente pueda escribir el nombre de su usuario. 279 | 280 | * **Declaración** 281 | ```javascript 282 | // Al inicio de la clase 283 | private JTextField tNombreUsuario; 284 | ``` 285 | 286 | La variable (objeto) que se coloca para los textField empezará con t minúscula seguido del nombre de la variable. 287 | 288 | * **Ejemplificación** 289 | ```javascript 290 | // Dentro del constructor 291 | tNombreUsuario = new JTextField("Nombre Usuario"); 292 | ``` 293 | 294 | Al igual que con los Label estos pueden recibir un String por parámetro desde el constructor, este funciona como **placeholder** pero necesita de una configuración adicional que en esta clase no se verá. De nuevo no es obligatorio colocar el String inicial. 295 | 296 | * **Configuración** 297 | ```javascript 298 | // Dentro del constructor 299 | tNombreUsuario.setSize(260, 40); 300 | tNombreUsuario.setLocation((pDerecha.getWidth() - tNombreUsuario.getWidth()) / 2, 120); 301 | tNombreUsuario.setForeground(Color.DARK_GRAY); 302 | tNombreUsuario.setBackground(Color.WHITE); 303 | tNombreUsuario.setCaretColor(Color.BLUE); 304 | tNombreUsuario.setHorizontalAlignment(SwingConstants.CENTER); 305 | ``` 306 | 307 | Como los anteriores objetos gráficos, este tiene algunas configuraciones ya vistas, mas una nueva propiedad: 308 | 309 | - **setCaretColor:** recibe por parámetro un **objeto decorador** de tipo Color y representa el color del Caret (la linea que parpadea indicando la posición de texto para escribir). 310 | - **setHorizontalAlignment:** Por defecto los TextField van a ubicar el texto en la parte izquierda pero en caso de que se quiera colocar el texto a en el centro o a la derecha se puede utilizar este método. 311 | 312 | * **Adición** 313 | ```javascript 314 | // Dentro del constructor 315 | pDerecha.add(tNombreUsuario); 316 | ``` 317 | 318 | ## JPasswordField 319 | 320 | Los JPasswordField son campos de texto donde el usuario va a escribir información confidencial, esto implica que por cuestiones de seguridad, la información proporcionada por el cliente no debe ser mostrada en pantalla. Como su nombre lo indica este objeto gráfico muchas veces se utiliza para el ingreso de contraseñas. 321 | 322 | * **Declaración** 323 | ```javascript 324 | // Al inicio de la clase 325 | private JPasswordField tClaveUsuario; 326 | ``` 327 | 328 | La variable (objeto) que se coloca para los JPasswordField empezará con t minúscula seguido del nombre de la variable. 329 | 330 | * **Ejemplificación** 331 | ```javascript 332 | // Dentro del constructor 333 | tClaveUsuario = new JPasswordField("Clave Usuario"); 334 | ``` 335 | 336 | * **Configuración** 337 | ```javascript 338 | // Dentro del constructor 339 | tClaveUsuario.setSize(260, 40); 340 | tClaveUsuario.setLocation((pDerecha.getWidth() - tClaveUsuario.getWidth()) / 2, 240); 341 | tClaveUsuario.setForeground(Color.DARK_GRAY); 342 | tClaveUsuario.setCaretColor(Color.BLUE); 343 | tClaveUsuario.setHorizontalAlignment(SwingConstants.CENTER); 344 | ``` 345 | 346 | * **Adición** 347 | ```javascript 348 | // Dentro del constructor 349 | pDerecha.add(tClaveUsuario); 350 | ``` 351 | 352 | Se puede notar que una vez se ejecuta la aplicación en el campo de la clave del usuario este saldrá en forma de puntos escondiendo la información que el usuario coloque allí. 353 | 354 | ## JComboBox 355 | 356 | Muchas veces el usuario tendrá que escoger entre varias opciones fijas que la aplicación le da a seleccionar, normalmente vista en forma de listas. Para eso es posible usar un JComboBox donde el usuario puede elegir opciones predeterminadas. 357 | 358 | En este caso se usará un ComboBox para escoger el tipo de usuario: 359 | 360 | * **Declaración** 361 | ```javascript 362 | // Al inicio de la clase 363 | private JComboBox cbTipoUsuario; 364 | ``` 365 | 366 | La variable (objeto) que se coloca para los JComboBox empezará con cb minúscula seguido del nombre de la variable. 367 | 368 | * **Ejemplificación** 369 | ```javascript 370 | // Dentro del constructor 371 | cbTipoUsuario = new JComboBox(); 372 | ``` 373 | 374 | * **Configuración** 375 | ```javascript 376 | // Dentro del constructor 377 | cbTipoUsuario.addItem("Cliente"); 378 | cbTipoUsuario.addItem("Cajero"); 379 | cbTipoUsuario.addItem("Administrador"); 380 | cbTipoUsuario.setSize(220, 30); 381 | cbTipoUsuario.setLocation((pDerecha.getWidth() - cbTipoUsuario.getWidth()) / 2, 185); 382 | cbTipoUsuario.setForeground(Color.DARK_GRAY); 383 | cbTipoUsuario.setBackground(Color.WHITE); 384 | ((JLabel) cbTipoUsuario.getRenderer()).setHorizontalAlignment(SwingConstants.CENTER); 385 | ``` 386 | 387 | A parte de las configuraciones que ya se vieron antes, en este caso existen dos particularidades: 388 | 389 | - **addItem:** recibe por parámetro un String y lo admite como opción a seleccionar por el usuario. 390 | - **getRenderer, setHorizontalAlignment:** Si se quieren centrar los elementos dentro de un ComboBox, esto no se podrá de forma directa. Cada una de las opciones dentro del ComboBox son tratados como Labels y para obtener su valor es necesario pedirle al ComboBox los elementos con el método **getRenderer**. Una vez obtenemos los elementos (JLabels) es necesario hacer un **Cast** de objeto para asi obtener las configuraciones propias de un JLabel **((JLabel) cbTipoUsuario.getRenderer())** de lo contrario al poner . (punto) para escribir los métodos de configuración no se vera la opción **setHorizontalAlignment**. 391 | 392 | * **Adición** 393 | ```javascript 394 | // Dentro del constructor 395 | pDerecha.add(cbTipoUsuario); 396 | ``` 397 | 398 | ## JButton 399 | 400 | Los botones son la forma mas común en la que un usuario podrá interactuar con las interfaces gráficas. Estos botones generan acciones que el usuario puede activar al dar Click sobre estos, entre algunas opciones, puede estar: el envío de información, traer información, abrir otras secciones, cerrar la aplicación etc. 401 | 402 | * **Declaración** 403 | ```javascript 404 | // Al inicio de la clase 405 | private JButton bEntrar; 406 | ``` 407 | 408 | La variable (objeto) que se coloca para los JButton empezará con b minúscula seguido del nombre de la variable. 409 | 410 | * **Ejemplificación** 411 | ```javascript 412 | // Dentro del constructor 413 | bEntrar = new JButton("Entrar"); 414 | ``` 415 | 416 | Un Botón puede recibir por parámetro en el constructor un String que representa el texto, de nuevo se puede realizar también mediante el método **setText**. 417 | 418 | * **Configuración** 419 | ```javascript 420 | // Dentro del constructor 421 | bEntrar.setSize(250, 45); 422 | bEntrar.setLocation((pDerecha.getWidth() - bEntrar.getWidth()) / 2, 300); 423 | bEntrar.setBackground(Color.BLUE); 424 | bEntrar.setForeground(Color.WHITE); 425 | bEntrar.setFocusable(false); 426 | ``` 427 | 428 | A parte de las configuraciones que ya se vieron antes, en este caso existen dos particularidades: 429 | 430 | - **setHorizontalAlignment:** Por defecto los botones van a ubicar el texto centrado pero en caso de que se quiera colocar el texto a la izquierda o a la derecha se puede utilizar este método. 431 | - **setFocusable:** Recibe por parámetro un booleano que por defecto esta en true, si se cambia la configuración a false, se va a quitar el cuadro por defecto que rodea al texto del botón una vez se oprima click. 432 | 433 |
434 | 435 |

Botón con SetFocusable(True)

436 |
437 | 438 |
439 | 440 |

Botón con SetFocusable(False)

441 |
442 | 443 | * **Adición** 444 | ```javascript 445 | // Dentro del constructor 446 | pDerecha.add(bEntrar); 447 | ``` 448 | 449 | Hasta el momento la interfaz se ve asi: 450 | 451 |
452 | 453 |

Interfaz login de usuario con los nuevos objetos añadidos

454 |
455 | 456 | Se van añadir 5 botones más, utilizando lo aprendido hasta el momento: 457 | 458 | * **Declaración** 459 | ```javascript 460 | // Al inicio de la clase 461 | private JButton bEntrar, bCerrar, bRegistrarse, bOpcion1, bOpcion2, bOpcion3; 462 | ``` 463 | 464 | * **Ejemplificación, configuración y adición** 465 | ```javascript 466 | // Dentro del constructor 467 | bCerrar = new JButton("X"); 468 | bCerrar.setBounds(330, 10, 45, 30); 469 | bCerrar.setFocusable(false); 470 | bCerrar.setBackground(Color.BLUE); 471 | bCerrar.setForeground(Color.WHITE); 472 | pDerecha.add(bCerrar); 473 | 474 | bRegistrarse = new JButton("Registrarse"); 475 | bRegistrarse.setBounds(230, 420, 145, 35); 476 | bRegistrarse.setFocusable(false); 477 | bRegistrarse.setBackground(Color.BLUE); 478 | bRegistrarse.setForeground(Color.WHITE); 479 | pDerecha.add(bRegistrarse); 480 | 481 | bOpcion1 = new JButton(); 482 | bOpcion1.setBounds(10, 220, 30, 20); 483 | pIzquierda.add(bOpcion1); 484 | 485 | bOpcion2 = new JButton(); 486 | bOpcion2.setBounds(10, 250, 30, 20); 487 | pIzquierda.add(bOpcion2); 488 | 489 | bOpcion3 = new JButton(); 490 | bOpcion3.setBounds(10, 280, 30, 20); 491 | pIzquierda.add(bOpcion3); 492 | ``` 493 | 494 | y la interfaz se ve ahora así: 495 | 496 |
497 | 498 |

Interfaz login de usuario, con adición de mas botones

499 |
500 | 501 | ## JCheckButton 502 | 503 | Los CheckButton normalmente son usados para cubrir estados de varias opciones, puede utilizar varios enfoques: 504 | 505 | - Elección multiple de opciones 506 | - Elección de una sola opción. 507 | 508 | * **Declaración** 509 | ```javascript 510 | // Al inicio de la clase 511 | private JCheckBox checkSi, checkNo; 512 | ``` 513 | 514 | La variable (objeto) que se coloca para los JCheckButton empezará con check en minúscula seguido del nombre de la variable. 515 | 516 | * **Ejemplificación** 517 | ```javascript 518 | // Dentro del constructor 519 | checkSi = new JCheckBox("Si"); 520 | checkNo = new JCheckBox("No"); 521 | ``` 522 | 523 | * **Configuración** 524 | ```javascript 525 | // Dentro del constructor 526 | checkSi.setSize(45, 25); 527 | checkSi.setFocusable(false); 528 | checkSi.setBackground(Color.WHITE); 529 | checkSi.setLocation((pDerecha.getWidth() - checkSi.getWidth()) / 2 - 15, 345); 530 | 531 | checkNo.setSize(45, 25); 532 | checkNo.setFocusable(false); 533 | checkNo.setBackground(Color.WHITE); 534 | checkNo.setLocation((pDerecha.getWidth() + checkNo.getWidth()) / 2 - 15, 345); 535 | ``` 536 | 537 | * **Adición** 538 | ```javascript 539 | // Dentro del constructor 540 | pDerecha.add(checkSi); 541 | pDerecha.add(checkNo); 542 | ``` 543 | 544 | En la aplicación se quiere tomar el enfoque de única opción, sin embargo al correr el app, es posible notar que se pueden seleccionan las dos opciones al tiempo. 545 | 546 |
547 | 548 |

CheckBox con múltiple opción

549 |
550 | 551 | Para obtener el enfoque de única opción se debe utilizar el siguiente objeto. 552 | 553 | ## ButtonGroup 554 | 555 | Este es un objeto gráfico auxiliar que nos ayuda a agrupar objetos en un contexto y realizar acciones con esta agrupación. Es usado en la mayoría de casos para realizar un enfoque de única respuestas con los objetos de CheckButton o RadioButton. Este al ser un objeto Auxiliar (no tiene representación gráfica) no será necesario adicionarlo en ningún componente. 556 | 557 | * **Declaración** 558 | ```javascript 559 | // Al inicio de la clase 560 | private ButtonGroup grupo; 561 | ``` 562 | 563 | La variable (objeto) que se coloca para los ButtonGroup empezará con grupo en minúscula seguido del nombre de la variable. En este caso al haber solo un ButtonGroup solo pondremos la palabra clave. 564 | 565 | * **Ejemplificación** 566 | ```javascript 567 | // Dentro del constructor 568 | grupo = new ButtonGroup(); 569 | ``` 570 | 571 | * **Configuración** 572 | 573 | ```javascript 574 | // Dentro del constructor 575 | grupo.add(checkSi); 576 | grupo.add(checkNo); 577 | ``` 578 | 579 | En la configuración es donde se van añadir los botones que pertenecen a un mismo contexto para que se pueda seleccionar una única opción. Al correr la aplicación se puede comprobar lo anterior dicho. 580 | 581 | ## JRadioButton 582 | 583 | Los RadioButton cumplen la misma función que los checkButton, es cuestión del desarrollador cual de los dos quiera usar. De nuevo, tienen los enfoques de múltiples opciones o única opción utilizando un buttonGroup. 584 | 585 | En este caso la interfaz no tendrá RadioButtons pero a continuación se muestra un ejemplo para su creación. 586 | 587 | * **Declaración** 588 | ```javascript 589 | // Al inicio de la clase 590 | private JRadioButton rbOpcion1, rbOpcion2; 591 | ``` 592 | 593 | La variable (objeto) que se coloca para los JRadioButton empezará con rb en minúscula seguido del nombre de la variable. 594 | 595 | * **Ejemplificación** 596 | ```javascript 597 | // Dentro del constructor 598 | rbOpcion1 = new JRadioButton("opcion1"); 599 | rbOpcion2 = new JRadioButton("opcion2"); 600 | ``` 601 | 602 | * **Configuración** 603 | ```javascript 604 | // Dentro del constructor 605 | rbOpcion1.setBounds(50, 400, 120, 30); 606 | rbOpcion2.setBounds(200, 400, 120, 30); 607 | ``` 608 | 609 | * **Adición** 610 | ```javascript 611 | // Dentro del constructor 612 | pIzquierda.add(rbOpcion1); 613 | pIzquierda.add(rbOpcion2); 614 | ``` 615 | 616 | ## JTextArea 617 | 618 | Un objeto gráfico textArea expande un poco el concepto de los textField ya que soporta una mayor cantidad de texto y esta diseñado para recibir grandes cantidades de texto. A continuación se muestra una breve explicación de su creación ya que esta tampoco hará parte de esta interfaz: 619 | 620 | * **Declaración** 621 | ```javascript 622 | // Al inicio de la clase 623 | private JTextArea taSugerencias; 624 | ``` 625 | 626 | La variable (objeto) que se coloca para los JTextArea empezará con ta en minúscula seguido del nombre de la variable. 627 | 628 | * **Ejemplificación** 629 | ```javascript 630 | // Dentro del constructor 631 | taSugerencias = new JTextArea("Escribe algo..."); 632 | ``` 633 | 634 | * **Configuración** 635 | ```javascript 636 | // Dentro del constructor 637 | taSugerencias.setBounds(185, 180, 230, 140); 638 | ``` 639 | 640 | * **Adición** 641 | ```javascript 642 | // Dentro del constructor 643 | pIzquierda.add(taSugerencias); 644 | ``` 645 | 646 | Si se añaden estos componentes la interfaz se vería algo así: 647 | 648 |
649 | 650 |

Interfaz login de usuario con adición de JTextArea y JRadioButton

651 |
652 | 653 | Sin embargo como se dijo anteriormente estos dos objetos gráficos no harán parte de esta interfaz asi que por ahora se comentarán estas partes en el código. 654 | 655 | # Resultado 656 | 657 |
658 | 659 |

Interfaz login de usuario, resultado Final

660 |
661 | 662 | Este es el resultado del Login de usuario, hasta el momento se aprendió la configuración de objetos básicos y como mostrarlos en pantalla. En la siguiente sesión se verá la creación de objetos decoradores para hacer que la interfaz se vea mucho mas agradable a la vista del usuario. 663 | 664 | # Actividades 665 | 666 | Realizar un Login diferente al propuesto en clase, el login de usuario que se vaya a realizar sera parte del proyecto final asi que puede ser buena idea pensar como sería el login de acuerdo a la aplicación escogida como proyecto. 667 | --------------------------------------------------------------------------------