[{"data":1,"prerenderedAt":1332},["ShallowReactive",2],{"navigation_docs":3,"-ejemplos-ejemplo-03":298,"-ejemplos-ejemplo-03-surround":1327},[4,18,70,105,149,178,212,257],{"title":5,"path":6,"stem":7,"children":8,"icon":17},"Evaluación","\u002Fintroduction","1.introduction\u002F1.index",[9,12],{"title":10,"path":6,"stem":7,"icon":11},"Método de Evaluación","i-iconamoon-cheque-bold",{"title":13,"path":14,"stem":15,"icon":16},"Plataforma de Aprendizaje","\u002Fintroduction\u002Fplataforma","1.introduction\u002F2.plataforma","i-lucide-book-marked","i-lucide-house",{"title":19,"path":20,"stem":21,"children":22,"icon":25},"Interfaz Gráfica de Usuario","\u002Fgui","2.gui\u002F01.index",[23,26,30,34,38,42,46,50,54,58,62,66],{"title":24,"path":20,"stem":21,"icon":25},"¿Qué es una Interfaz Gráfica de Usuario (GUI)?","i-carbon-gui-management",{"title":27,"path":28,"stem":29,"icon":25},"Creación de Interfaces Gráficas de Usuario (GUI)","\u002Fgui\u002Fbuild-gui","2.gui\u002F02.build-gui",{"title":31,"path":32,"stem":33,"icon":25},"Componentes Básicos de Swing","\u002Fgui\u002Fcomponentes-basicos","2.gui\u002F03.componentes-basicos",{"title":35,"path":36,"stem":37},"El componente JFrame","\u002Fgui\u002Fjframe","2.gui\u002F04.jframe",{"title":39,"path":40,"stem":41},"El componente JPanel","\u002Fgui\u002Fjpanel","2.gui\u002F05.jpanel",{"title":43,"path":44,"stem":45},"El componente JButton","\u002Fgui\u002Fjbutton","2.gui\u002F06.jbutton",{"title":47,"path":48,"stem":49,"icon":25},"Elementos de texto en interfaces gráficas con Swing","\u002Fgui\u002Ftext","2.gui\u002F07.text",{"title":51,"path":52,"stem":53},"Elementos Visuales","\u002Fgui\u002Felementos-visuales","2.gui\u002F08.elementos-visuales",{"title":55,"path":56,"stem":57,"icon":25},"Eventos en Swing","\u002Fgui\u002Feventos","2.gui\u002F09.eventos",{"title":59,"path":60,"stem":61,"icon":25},"Controles en Swing","\u002Fgui\u002Fcontroles","2.gui\u002F10.controles",{"title":63,"path":64,"stem":65,"icon":25},"Atributos Comunes de los Componentes de Diseño","\u002Fgui\u002Fatributos-comunes","2.gui\u002F11.atributos-comunes",{"title":67,"path":68,"stem":69,"icon":25},"Layouts","\u002Fgui\u002Flayout","2.gui\u002F12.layout",{"title":71,"icon":25,"path":72,"stem":73,"children":74,"page":104},"Personalización","\u002Fpersonalizacion","3.personalizacion",[75,79,84,88,92,96,100],{"title":76,"path":77,"stem":78},"Jerarquía de clases en Swing","\u002Fpersonalizacion\u002Fjerarquia","3.personalizacion\u002F01.jerarquia",{"title":80,"path":81,"stem":82,"icon":83},"Personalización Inicial de Componentes Swing","\u002Fpersonalizacion\u002Fpersonalizacion-inicial","3.personalizacion\u002F02.personalizacion-inicial","i-carbon-palette",{"title":85,"path":86,"stem":87,"icon":83},"Tema y Personalización Avanzada en Swing","\u002Fpersonalizacion\u002Ftheme","3.personalizacion\u002F03.theme",{"title":89,"path":90,"stem":91,"icon":83},"Pintando en Swing","\u002Fpersonalizacion\u002Fpaint","3.personalizacion\u002F04.paint",{"title":93,"path":94,"stem":95,"icon":83},"Mi Tema 1: Comenzando con la Personalización","\u002Fpersonalizacion\u002Ftheme-start","3.personalizacion\u002F05.theme-start",{"title":97,"path":98,"stem":99,"icon":83},"UI Delegates: Personalizando la Apariencia de los Componentes","\u002Fpersonalizacion\u002Fui-delegates","3.personalizacion\u002F06.ui-delegates",{"title":101,"path":102,"stem":103,"icon":83},"Empleado delegadores de UI para personalizar la apariencia de los componentes","\u002Fpersonalizacion\u002Ftheme-02","3.personalizacion\u002F07.theme-02",false,{"title":106,"path":107,"stem":108,"children":109,"icon":148},"Programación concurrente","\u002Fconcurrencia","4.concurrencia\u002F01.index",[110,112,116,120,124,128,132,136,140,144],{"title":111,"path":107,"stem":108,"icon":83},"¿Qué es la concurrencia?",{"title":113,"path":114,"stem":115,"icon":83},"Unidades de Ejecución","\u002Fconcurrencia\u002Funidades-ejecucion","4.concurrencia\u002F02.unidades-ejecucion",{"title":117,"path":118,"stem":119,"icon":83},"Programa de flujo único y de flujo múltiple","\u002Fconcurrencia\u002Fflujos","4.concurrencia\u002F03.flujos",{"title":121,"path":122,"stem":123,"icon":83},"Hilos con Thread y Runnable","\u002Fconcurrencia\u002Fthread-runnable","4.concurrencia\u002F04.thread-runnable",{"title":125,"path":126,"stem":127},"Paralelismo V.S. Concurrencia","\u002Fconcurrencia\u002Fparalelismo","4.concurrencia\u002F05.paralelismo",{"title":129,"path":130,"stem":131,"icon":83},"Problemas clásicos de concurrencia","\u002Fconcurrencia\u002Fproblemas","4.concurrencia\u002F06.problemas",{"title":133,"path":134,"stem":135,"icon":83},"Emulando condiciones de carrera en Java","\u002Fconcurrencia\u002Fcondiciones-carrera","4.concurrencia\u002F07.condiciones-carrera",{"title":137,"path":138,"stem":139,"icon":83},"Semáforos en Java","\u002Fconcurrencia\u002Fsemaforos","4.concurrencia\u002F08.semaforos",{"title":141,"path":142,"stem":143,"icon":83},"La clase Timer en Java Swing","\u002Fconcurrencia\u002Ftimer","4.concurrencia\u002F09.timer",{"title":145,"path":146,"stem":147,"icon":83},"Algoritmos de ordenamiento de procesos","\u002Fconcurrencia\u002Falgoritmos-procesos","4.concurrencia\u002F10.algoritmos-procesos","i-carbon-parallel-groups",{"title":150,"path":151,"stem":152,"children":153,"icon":177},"Acceso a datos","\u002Fdatos","5.datos\u002F01.index",[154,157,161,165,169,173],{"title":155,"path":151,"stem":152,"icon":156},"Java y las bases de datos","i-carbon-database",{"title":158,"path":159,"stem":160},"Cliente Servidor","\u002Fdatos\u002Fcliente-servidor","5.datos\u002F02.cliente-servidor",{"title":162,"path":163,"stem":164},"CRUD","\u002Fdatos\u002Fcrud","5.datos\u002F03.crud",{"title":166,"path":167,"stem":168},"Sentencias Preparadas con JDBC","\u002Fdatos\u002Fsentencia-preparada","5.datos\u002F04.sentencia-preparada",{"title":170,"path":171,"stem":172},"DAO (Data Access Object)","\u002Fdatos\u002Fdao","5.datos\u002F05.dao",{"title":174,"path":175,"stem":176},"Usando Hibernate ORM","\u002Fdatos\u002Form","5.datos\u002F06.orm","i-gravity-ui-database-fill",{"title":179,"path":180,"stem":181,"children":182,"icon":211},"Programación móvil","\u002Fmovil","6.movil\u002F01.index",[183,186,191,195,199,203,207],{"title":184,"path":180,"stem":181,"icon":185},"¿Qué es Android y Kotlin?","i-carbon-mobile",{"title":187,"path":188,"stem":189,"icon":190},"¿Qué es Android Studio?","\u002Fmovil\u002Fandroid-studio","6.movil\u002F02.android-studio","i-carbon-application",{"title":192,"path":193,"stem":194,"icon":190},"¿Qué es Jetpack Compose?","\u002Fmovil\u002Fjetpack-compose","6.movil\u002F03.jetpack-compose",{"title":196,"path":197,"stem":198},"Filas y Columnas con Jetpack Compose","\u002Fmovil\u002Ffilas-columnas","6.movil\u002F04.filas-columnas",{"title":200,"path":201,"stem":202,"icon":190},"Componentes Básicos en Jetpack Compose","\u002Fmovil\u002Fcomponentes-basicos","6.movil\u002F05.componentes-basicos",{"title":204,"path":205,"stem":206,"icon":190},"Las Intenciones en Android con Jetpack Compose","\u002Fmovil\u002Fintentions","6.movil\u002F06.intentions",{"title":208,"path":209,"stem":210,"icon":190},"Navegación en Android con Jetpack Compose","\u002Fmovil\u002Fnavegacion","6.movil\u002F07.navegacion","phone_android",{"title":213,"icon":25,"path":214,"stem":215,"children":216,"page":104},"Ejemplos","\u002Fejemplos","7.ejemplos",[217,221,225,229,233,237,241,245,249,253],{"title":218,"path":219,"stem":220},"Ejemplo 01: Creando un validador abstracto de expresiones","\u002Fejemplos\u002Fejemplo-01","7.ejemplos\u002F01.ejemplo-01",{"title":222,"path":223,"stem":224},"Ejemplo 02: Diferencias de validar un JTextField y un JFormattedTextField","\u002Fejemplos\u002Fejemplo-02","7.ejemplos\u002F02.ejemplo-02",{"title":226,"path":227,"stem":228},"Ejemplo 03: Creando una Aplicación con GUI en Java Swing","\u002Fejemplos\u002Fejemplo-03","7.ejemplos\u002F03.ejemplo-03",{"title":230,"path":231,"stem":232},"Ejemplo 4: Estilizando componentes Swing con Delegadores","\u002Fejemplos\u002Fejemplo-04","7.ejemplos\u002F04.ejemplo-04",{"title":234,"path":235,"stem":236,"icon":83},"Ejemplo 5: Uso de Hilos con Thread y Runnable","\u002Fejemplos\u002Fejemplo-05","7.ejemplos\u002F05.ejemplo-05",{"title":238,"path":239,"stem":240,"icon":83},"Ejemplo 06: Manejando Hilos de formas Diferentes en Java","\u002Fejemplos\u002Fejemplo-06","7.ejemplos\u002F06.ejemplo-06",{"title":242,"path":243,"stem":244,"icon":83},"Ejemplo 7: Condiciones de carrera en Java","\u002Fejemplos\u002Fejemplo-07","7.ejemplos\u002F07.ejemplo-07",{"title":246,"path":247,"stem":248,"icon":83},"Ejemplo 8: Control de acceso a recursos compartidos con semáforos","\u002Fejemplos\u002Fejemplo-08","7.ejemplos\u002F08.ejemplo-08",{"title":250,"path":251,"stem":252,"icon":83},"Ejemplo 9: El restaurante y los pedidos","\u002Fejemplos\u002Fejemplo-09","7.ejemplos\u002F09.ejemplo-09",{"title":254,"path":255,"stem":256},"Ejemplo 10: Proceso FIFO (First In, First Out) con Semáforos y Swing","\u002Fejemplos\u002Fejemplo-10","7.ejemplos\u002F10.ejemplo-10",{"title":258,"icon":25,"path":259,"stem":260,"children":261,"page":104},"Actividades","\u002Factividades","8.actividades",[262,266,270,274,278,282,286,290,294],{"title":263,"path":264,"stem":265,"icon":25},"Actividad 1: Introducción al diseño de interfaces","\u002Factividades\u002Fact-01","8.actividades\u002F01.act-01",{"title":267,"path":268,"stem":269,"icon":25},"Actividad 2: Diseño de wireframes y prototipos","\u002Factividades\u002Fact-02","8.actividades\u002F02.act-02",{"title":271,"path":272,"stem":273,"icon":25},"Actividad 3: Propuesta de Proyecto y Wireframe inicial","\u002Factividades\u002Fact-03","8.actividades\u002F03.act-03",{"title":275,"path":276,"stem":277,"icon":83},"Actividad 4: Temas y Componentes Personalizados en Swing","\u002Factividades\u002Fact-04","8.actividades\u002F04.act-04",{"title":279,"path":280,"stem":281,"icon":83},"Actividad 5: Explicando la Concurrencia a un Niño de 5 Años","\u002Factividades\u002Fact-05","8.actividades\u002F05.act-05",{"title":283,"path":284,"stem":285,"icon":83},"Actividad 6: Simulación de una cocina con múltiples chefs (hilos)","\u002Factividades\u002Fact-06","8.actividades\u002F06.act-06",{"title":287,"path":288,"stem":289,"icon":83},"Actividad 7: Sistema de retiro bancario","\u002Factividades\u002Fact-07","8.actividades\u002F07.act-07",{"title":291,"path":292,"stem":293,"icon":83},"Actividad 8: Simulación de Round Robin con hilos e Interfaz Gráfica","\u002Factividades\u002Fact-08","8.actividades\u002F08.act-08",{"title":295,"path":296,"stem":297,"icon":83},"Actividad 9: CRUD con Hibernate y Swing","\u002Factividades\u002Fact-09","8.actividades\u002F09.act-09",{"id":299,"title":226,"body":300,"description":1321,"extension":1322,"links":1323,"meta":1324,"navigation":416,"path":227,"seo":1325,"stem":228,"__hash__":1326},"docs\u002F7.ejemplos\u002F03.ejemplo-03.md",{"type":301,"value":302,"toc":1315},"minimark",[303,307,323,326,330,335,354,581,590,594,600,632,639,830,838,847,851,860,1223,1233,1239,1243,1253,1302,1308,1311],[304,305,306],"p",{},"Imaginemos una cafetería universitaria donde el personal debe registrar pedidos de manera rápida durante los recesos entre clases.\nNo necesitan un sistema complejo; solo algo sencillo para:",[308,309,310,314,317,320],"ul",{},[311,312,313],"li",{},"Capturar el nombre del cliente",[311,315,316],{},"Elegir el tipo de bebida",[311,318,319],{},"Indicar si desea azúcar",[311,321,322],{},"Registrar el pedido con un botón",[304,324,325],{},"En el mundo real, esto sería equivalente a una hoja de pedidos en papel, con espacios en blanco, casillas y opciones predefinidas. En el mundo digital, esa hoja se convierte en una ventana Swing.",[327,328,329],"note",{},"💡 Metáfora: Swing es como diseñar un formulario físico, pero en lugar de pluma y papel, usamos componentes gráficos y propiedades visuales.",[331,332,334],"h2",{"id":333},"paso-1-definir-el-frame-principal","Paso 1: Definir el frame principal",[304,336,337,338,342,343,346,347,349,350,353],{},"Para comenzar, crearemos la clase principal que contendrá al ",[339,340,341],"code",{},"JFrame"," y al ",[339,344,345],{},"JPanel"," donde ubicaremos los componentes. Para este ejemplo asumiremos que ya hemos creado un formulario con el plugin \"Swing UI Designer\" en IntelliJ IDEA y hemos nombrado el ",[339,348,345],{}," como ",[339,351,352],{},"mainPanel",".",[355,356,361],"pre",{"className":357,"code":358,"language":359,"meta":360,"style":360},"language-java shiki shiki-themes github-dark","import javax.swing.*;\nimport java.awt.*;\nimport java.awt.event.ActionEvent;\nimport java.awt.event.ActionListener;\n\npublic class CoffeeOrderApp extends JFrame{\n    \n    private JPanel mainPanel;\n    \n    public CoffeeOrderApp() {\n        \u002F\u002F Configuraciones de la ventana\n        setTitle(\"Cafetería Universitaria\");\n        setSize(400, 350);\n        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        setLocationRelativeTo(null);\n        \u002F\u002F Agregar el panel principal\n        setContentPane(mainPanel);\n        \u002F\u002F Hacer Visible\n        setVisible(true);\n    }\n}\n","java","",[339,362,363,383,395,403,411,418,440,446,455,460,471,478,494,513,522,535,541,550,556,569,575],{"__ignoreMap":360},[364,365,368,372,376,380],"span",{"class":366,"line":367},"line",1,[364,369,371],{"class":370},"snl16","import",[364,373,375],{"class":374},"s95oV"," javax.swing.",[364,377,379],{"class":378},"sDLfK","*",[364,381,382],{"class":374},";\n",[364,384,386,388,391,393],{"class":366,"line":385},2,[364,387,371],{"class":370},[364,389,390],{"class":374}," java.awt.",[364,392,379],{"class":378},[364,394,382],{"class":374},[364,396,398,400],{"class":366,"line":397},3,[364,399,371],{"class":370},[364,401,402],{"class":374}," java.awt.event.ActionEvent;\n",[364,404,406,408],{"class":366,"line":405},4,[364,407,371],{"class":370},[364,409,410],{"class":374}," java.awt.event.ActionListener;\n",[364,412,414],{"class":366,"line":413},5,[364,415,417],{"emptyLinePlaceholder":416},true,"\n",[364,419,421,424,427,431,434,437],{"class":366,"line":420},6,[364,422,423],{"class":370},"public",[364,425,426],{"class":370}," class",[364,428,430],{"class":429},"svObZ"," CoffeeOrderApp",[364,432,433],{"class":370}," extends",[364,435,436],{"class":429}," JFrame",[364,438,439],{"class":374},"{\n",[364,441,443],{"class":366,"line":442},7,[364,444,445],{"class":374},"    \n",[364,447,449,452],{"class":366,"line":448},8,[364,450,451],{"class":370},"    private",[364,453,454],{"class":374}," JPanel mainPanel;\n",[364,456,458],{"class":366,"line":457},9,[364,459,445],{"class":374},[364,461,463,466,468],{"class":366,"line":462},10,[364,464,465],{"class":370},"    public",[364,467,430],{"class":429},[364,469,470],{"class":374},"() {\n",[364,472,474],{"class":366,"line":473},11,[364,475,477],{"class":476},"sAwPA","        \u002F\u002F Configuraciones de la ventana\n",[364,479,481,484,487,491],{"class":366,"line":480},12,[364,482,483],{"class":429},"        setTitle",[364,485,486],{"class":374},"(",[364,488,490],{"class":489},"sU2Wk","\"Cafetería Universitaria\"",[364,492,493],{"class":374},");\n",[364,495,497,500,502,505,508,511],{"class":366,"line":496},13,[364,498,499],{"class":429},"        setSize",[364,501,486],{"class":374},[364,503,504],{"class":378},"400",[364,506,507],{"class":374},", ",[364,509,510],{"class":378},"350",[364,512,493],{"class":374},[364,514,516,519],{"class":366,"line":515},14,[364,517,518],{"class":429},"        setDefaultCloseOperation",[364,520,521],{"class":374},"(JFrame.EXIT_ON_CLOSE);\n",[364,523,525,528,530,533],{"class":366,"line":524},15,[364,526,527],{"class":429},"        setLocationRelativeTo",[364,529,486],{"class":374},[364,531,532],{"class":378},"null",[364,534,493],{"class":374},[364,536,538],{"class":366,"line":537},16,[364,539,540],{"class":476},"        \u002F\u002F Agregar el panel principal\n",[364,542,544,547],{"class":366,"line":543},17,[364,545,546],{"class":429},"        setContentPane",[364,548,549],{"class":374},"(mainPanel);\n",[364,551,553],{"class":366,"line":552},18,[364,554,555],{"class":476},"        \u002F\u002F Hacer Visible\n",[364,557,559,562,564,567],{"class":366,"line":558},19,[364,560,561],{"class":429},"        setVisible",[364,563,486],{"class":374},[364,565,566],{"class":378},"true",[364,568,493],{"class":374},[364,570,572],{"class":366,"line":571},20,[364,573,574],{"class":374},"    }\n",[364,576,578],{"class":366,"line":577},21,[364,579,580],{"class":374},"}\n",[327,582,583,584,586,587,589],{},"💡 Consejo: Extender ",[339,585,341],{}," permite que nuestra clase principal actúe como la ventana de la aplicación, facilitando la gestión de sus propiedades y componentes. Además, configurar el ",[339,588,345],{}," como el contenido principal del frame nos permite organizar los elementos de la interfaz de manera estructurada.",[331,591,593],{"id":592},"paso-2-agregar-componentes-al-formulario","Paso 2: Agregar componentes al formulario",[304,595,596,597,599],{},"Utilizando el plugin \"Swing UI Designer\" en IntelliJ IDEA, podemos arrastrar y soltar los siguientes componentes en el ",[339,598,352],{},":",[308,601,602,608,614,620,626],{},[311,603,604,607],{},[339,605,606],{},"JLabel"," para el título \"Registro de Pedidos\"",[311,609,610,613],{},[339,611,612],{},"JTextField"," para ingresar el nombre del cliente",[311,615,616,619],{},[339,617,618],{},"JComboBox"," para seleccionar el tipo de bebida (Café, Té, Jugo)",[311,621,622,625],{},[339,623,624],{},"JCheckBox"," para indicar si desea azúcar",[311,627,628,631],{},[339,629,630],{},"JButton"," para registrar el pedido",[304,633,634,635,638],{},"Después de agregar estos componentes, el código generado automáticamente en la clase ",[339,636,637],{},"CoffeeOrderApp"," se verá similar a esto:",[355,640,642],{"className":357,"code":641,"language":359,"meta":360,"style":360},"import javax.swing.*;\nimport java.awt.*;\nimport java.awt.event.ActionEvent;\nimport java.awt.event.ActionListener;\n\npublic class CoffeeOrderApp extends JFrame{\n    \n    private JPanel mainPanel;\n    private JTextField nameField;\n    private JComboBox\u003CString> drinkComboBox;\n    private JCheckBox sugarCheckBox;\n    private JButton orderButton;\n    \n    public CoffeeOrderApp() {\n        \u002F\u002F Configuraciones de la ventana\n        setTitle(\"Cafetería Universitaria\");\n        setSize(400, 350);\n        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        setLocationRelativeTo(null);\n        \u002F\u002F Agregar el panel principal\n        setContentPane(mainPanel);\n        \u002F\u002F Hacer Visible\n        setVisible(true);\n    }\n}\n",[339,643,644,654,664,670,676,680,694,698,704,711,724,731,738,742,750,754,764,778,784,794,798,804,809,820,825],{"__ignoreMap":360},[364,645,646,648,650,652],{"class":366,"line":367},[364,647,371],{"class":370},[364,649,375],{"class":374},[364,651,379],{"class":378},[364,653,382],{"class":374},[364,655,656,658,660,662],{"class":366,"line":385},[364,657,371],{"class":370},[364,659,390],{"class":374},[364,661,379],{"class":378},[364,663,382],{"class":374},[364,665,666,668],{"class":366,"line":397},[364,667,371],{"class":370},[364,669,402],{"class":374},[364,671,672,674],{"class":366,"line":405},[364,673,371],{"class":370},[364,675,410],{"class":374},[364,677,678],{"class":366,"line":413},[364,679,417],{"emptyLinePlaceholder":416},[364,681,682,684,686,688,690,692],{"class":366,"line":420},[364,683,423],{"class":370},[364,685,426],{"class":370},[364,687,430],{"class":429},[364,689,433],{"class":370},[364,691,436],{"class":429},[364,693,439],{"class":374},[364,695,696],{"class":366,"line":442},[364,697,445],{"class":374},[364,699,700,702],{"class":366,"line":448},[364,701,451],{"class":370},[364,703,454],{"class":374},[364,705,706,708],{"class":366,"line":457},[364,707,451],{"class":370},[364,709,710],{"class":374}," JTextField nameField;\n",[364,712,713,715,718,721],{"class":366,"line":462},[364,714,451],{"class":370},[364,716,717],{"class":374}," JComboBox\u003C",[364,719,720],{"class":370},"String",[364,722,723],{"class":374},"> drinkComboBox;\n",[364,725,726,728],{"class":366,"line":473},[364,727,451],{"class":370},[364,729,730],{"class":374}," JCheckBox sugarCheckBox;\n",[364,732,733,735],{"class":366,"line":480},[364,734,451],{"class":370},[364,736,737],{"class":374}," JButton orderButton;\n",[364,739,740],{"class":366,"line":496},[364,741,445],{"class":374},[364,743,744,746,748],{"class":366,"line":515},[364,745,465],{"class":370},[364,747,430],{"class":429},[364,749,470],{"class":374},[364,751,752],{"class":366,"line":524},[364,753,477],{"class":476},[364,755,756,758,760,762],{"class":366,"line":537},[364,757,483],{"class":429},[364,759,486],{"class":374},[364,761,490],{"class":489},[364,763,493],{"class":374},[364,765,766,768,770,772,774,776],{"class":366,"line":543},[364,767,499],{"class":429},[364,769,486],{"class":374},[364,771,504],{"class":378},[364,773,507],{"class":374},[364,775,510],{"class":378},[364,777,493],{"class":374},[364,779,780,782],{"class":366,"line":552},[364,781,518],{"class":429},[364,783,521],{"class":374},[364,785,786,788,790,792],{"class":366,"line":558},[364,787,527],{"class":429},[364,789,486],{"class":374},[364,791,532],{"class":378},[364,793,493],{"class":374},[364,795,796],{"class":366,"line":571},[364,797,540],{"class":476},[364,799,800,802],{"class":366,"line":577},[364,801,546],{"class":429},[364,803,549],{"class":374},[364,805,807],{"class":366,"line":806},22,[364,808,555],{"class":476},[364,810,812,814,816,818],{"class":366,"line":811},23,[364,813,561],{"class":429},[364,815,486],{"class":374},[364,817,566],{"class":378},[364,819,493],{"class":374},[364,821,823],{"class":366,"line":822},24,[364,824,574],{"class":374},[364,826,828],{"class":366,"line":827},25,[364,829,580],{"class":374},[304,831,832,833,342,835,837],{},"Como puedes ver, los componentes que agregamos en el diseñador visual ahora están representados como variables de instancia en nuestra clase. En particular presta atención al ",[339,834,618],{},[339,836,624],{},", ya que estos componentes nos permitirán capturar las opciones seleccionadas por el usuario.",[327,839,840,841,843,844,846],{},"💡 Consejo: El componente ",[339,842,618],{}," es ideal para ofrecer una lista desplegable de opciones, sin embargo, no solo se limita a texto, también puede contener objetos más complejos si es necesario, como por ejemplo tipos enumerados. Por otro lado, el ",[339,845,624],{}," es perfecto para opciones binarias, como \"Sí\" o \"No\", permitiendo al usuario seleccionar o deseleccionar una opción fácilmente.",[331,848,850],{"id":849},"paso-3-manejar-el-evento-del-botón","Paso 3: Manejar el evento del botón",[304,852,853,854,857,858,599],{},"Ahora, necesitamos agregar funcionalidad al botón \"Registrar Pedido\". Queremos que, al hacer clic en este botón, se capture la información ingresada por el usuario y se muestre un mensaje en la consola con los detalles del pedido. Para ello, agregaremos un ",[339,855,856],{},"ActionListener"," al botón dentro del constructor de la clase ",[339,859,637],{},[355,861,863],{"className":357,"code":862,"language":359,"meta":360,"style":360},"import javax.swing.*;\nimport java.awt.*;\nimport java.awt.event.ActionEvent;\nimport java.awt.event.ActionListener;\n\npublic class CoffeeOrderApp extends JFrame{\n    \n    private JPanel mainPanel;\n    private JTextField nameField;\n    private JComboBox\u003CString> drinkComboBox;\n    private JCheckBox sugarCheckBox;\n    private JButton orderButton;\n    \n    public CoffeeOrderApp() {\n        \u002F\u002F Configuraciones de la ventana\n        setTitle(\"Cafetería Universitaria\");\n        setSize(400, 350);\n        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        setLocationRelativeTo(null);\n        \u002F\u002F Agregar el panel principal\n        setContentPane(mainPanel);\n        \n        \u002F\u002F Agregar ActionListener al botón\n        orderButton.addActionListener(e -> {\n            String name = nameField.getText();\n            String drink = (String) drinkComboBox.getSelectedItem();\n            boolean wantsSugar = sugarCheckBox.isSelected();\n\n            IO.println(\"Pedido Registrado:\");\n            IO.println(\"Cliente: \" + name);\n            IO.println(\"Bebida: \" + drink);\n            IO.println(\"Azúcar: \" + (wantsSugar ? \"Sí\" : \"No\"));\n        });\n        \n        \u002F\u002F Hacer Visible\n        setVisible(true);\n    }\n}\n",[339,864,865,875,885,891,897,901,915,919,925,931,941,947,953,957,965,969,979,993,999,1009,1013,1019,1024,1029,1046,1063,1079,1098,1103,1119,1137,1154,1186,1192,1197,1202,1213,1218],{"__ignoreMap":360},[364,866,867,869,871,873],{"class":366,"line":367},[364,868,371],{"class":370},[364,870,375],{"class":374},[364,872,379],{"class":378},[364,874,382],{"class":374},[364,876,877,879,881,883],{"class":366,"line":385},[364,878,371],{"class":370},[364,880,390],{"class":374},[364,882,379],{"class":378},[364,884,382],{"class":374},[364,886,887,889],{"class":366,"line":397},[364,888,371],{"class":370},[364,890,402],{"class":374},[364,892,893,895],{"class":366,"line":405},[364,894,371],{"class":370},[364,896,410],{"class":374},[364,898,899],{"class":366,"line":413},[364,900,417],{"emptyLinePlaceholder":416},[364,902,903,905,907,909,911,913],{"class":366,"line":420},[364,904,423],{"class":370},[364,906,426],{"class":370},[364,908,430],{"class":429},[364,910,433],{"class":370},[364,912,436],{"class":429},[364,914,439],{"class":374},[364,916,917],{"class":366,"line":442},[364,918,445],{"class":374},[364,920,921,923],{"class":366,"line":448},[364,922,451],{"class":370},[364,924,454],{"class":374},[364,926,927,929],{"class":366,"line":457},[364,928,451],{"class":370},[364,930,710],{"class":374},[364,932,933,935,937,939],{"class":366,"line":462},[364,934,451],{"class":370},[364,936,717],{"class":374},[364,938,720],{"class":370},[364,940,723],{"class":374},[364,942,943,945],{"class":366,"line":473},[364,944,451],{"class":370},[364,946,730],{"class":374},[364,948,949,951],{"class":366,"line":480},[364,950,451],{"class":370},[364,952,737],{"class":374},[364,954,955],{"class":366,"line":496},[364,956,445],{"class":374},[364,958,959,961,963],{"class":366,"line":515},[364,960,465],{"class":370},[364,962,430],{"class":429},[364,964,470],{"class":374},[364,966,967],{"class":366,"line":524},[364,968,477],{"class":476},[364,970,971,973,975,977],{"class":366,"line":537},[364,972,483],{"class":429},[364,974,486],{"class":374},[364,976,490],{"class":489},[364,978,493],{"class":374},[364,980,981,983,985,987,989,991],{"class":366,"line":543},[364,982,499],{"class":429},[364,984,486],{"class":374},[364,986,504],{"class":378},[364,988,507],{"class":374},[364,990,510],{"class":378},[364,992,493],{"class":374},[364,994,995,997],{"class":366,"line":552},[364,996,518],{"class":429},[364,998,521],{"class":374},[364,1000,1001,1003,1005,1007],{"class":366,"line":558},[364,1002,527],{"class":429},[364,1004,486],{"class":374},[364,1006,532],{"class":378},[364,1008,493],{"class":374},[364,1010,1011],{"class":366,"line":571},[364,1012,540],{"class":476},[364,1014,1015,1017],{"class":366,"line":577},[364,1016,546],{"class":429},[364,1018,549],{"class":374},[364,1020,1021],{"class":366,"line":806},[364,1022,1023],{"class":374},"        \n",[364,1025,1026],{"class":366,"line":811},[364,1027,1028],{"class":476},"        \u002F\u002F Agregar ActionListener al botón\n",[364,1030,1031,1034,1037,1040,1043],{"class":366,"line":822},[364,1032,1033],{"class":374},"        orderButton.",[364,1035,1036],{"class":429},"addActionListener",[364,1038,1039],{"class":374},"(e ",[364,1041,1042],{"class":370},"->",[364,1044,1045],{"class":374}," {\n",[364,1047,1048,1051,1054,1057,1060],{"class":366,"line":827},[364,1049,1050],{"class":374},"            String name ",[364,1052,1053],{"class":370},"=",[364,1055,1056],{"class":374}," nameField.",[364,1058,1059],{"class":429},"getText",[364,1061,1062],{"class":374},"();\n",[364,1064,1066,1069,1071,1074,1077],{"class":366,"line":1065},26,[364,1067,1068],{"class":374},"            String drink ",[364,1070,1053],{"class":370},[364,1072,1073],{"class":374}," (String) drinkComboBox.",[364,1075,1076],{"class":429},"getSelectedItem",[364,1078,1062],{"class":374},[364,1080,1082,1085,1088,1090,1093,1096],{"class":366,"line":1081},27,[364,1083,1084],{"class":370},"            boolean",[364,1086,1087],{"class":374}," wantsSugar ",[364,1089,1053],{"class":370},[364,1091,1092],{"class":374}," sugarCheckBox.",[364,1094,1095],{"class":429},"isSelected",[364,1097,1062],{"class":374},[364,1099,1101],{"class":366,"line":1100},28,[364,1102,417],{"emptyLinePlaceholder":416},[364,1104,1106,1109,1112,1114,1117],{"class":366,"line":1105},29,[364,1107,1108],{"class":374},"            IO.",[364,1110,1111],{"class":429},"println",[364,1113,486],{"class":374},[364,1115,1116],{"class":489},"\"Pedido Registrado:\"",[364,1118,493],{"class":374},[364,1120,1122,1124,1126,1128,1131,1134],{"class":366,"line":1121},30,[364,1123,1108],{"class":374},[364,1125,1111],{"class":429},[364,1127,486],{"class":374},[364,1129,1130],{"class":489},"\"Cliente: \"",[364,1132,1133],{"class":370}," +",[364,1135,1136],{"class":374}," name);\n",[364,1138,1140,1142,1144,1146,1149,1151],{"class":366,"line":1139},31,[364,1141,1108],{"class":374},[364,1143,1111],{"class":429},[364,1145,486],{"class":374},[364,1147,1148],{"class":489},"\"Bebida: \"",[364,1150,1133],{"class":370},[364,1152,1153],{"class":374}," drink);\n",[364,1155,1157,1159,1161,1163,1166,1168,1171,1174,1177,1180,1183],{"class":366,"line":1156},32,[364,1158,1108],{"class":374},[364,1160,1111],{"class":429},[364,1162,486],{"class":374},[364,1164,1165],{"class":489},"\"Azúcar: \"",[364,1167,1133],{"class":370},[364,1169,1170],{"class":374}," (wantsSugar ",[364,1172,1173],{"class":370},"?",[364,1175,1176],{"class":489}," \"Sí\"",[364,1178,1179],{"class":370}," :",[364,1181,1182],{"class":489}," \"No\"",[364,1184,1185],{"class":374},"));\n",[364,1187,1189],{"class":366,"line":1188},33,[364,1190,1191],{"class":374},"        });\n",[364,1193,1195],{"class":366,"line":1194},34,[364,1196,1023],{"class":374},[364,1198,1200],{"class":366,"line":1199},35,[364,1201,555],{"class":476},[364,1203,1205,1207,1209,1211],{"class":366,"line":1204},36,[364,1206,561],{"class":429},[364,1208,486],{"class":374},[364,1210,566],{"class":378},[364,1212,493],{"class":374},[364,1214,1216],{"class":366,"line":1215},37,[364,1217,574],{"class":374},[364,1219,1221],{"class":366,"line":1220},38,[364,1222,580],{"class":374},[304,1224,1225,1226,1228,1229,1232],{},"En este código, hemos agregado un ",[339,1227,856],{}," al botón ",[339,1230,1231],{},"orderButton",". Cuando el usuario hace clic en el botón, se ejecuta el código dentro del lambda, que captura el nombre del cliente, la bebida seleccionada y si desea azúcar. Luego, imprime estos detalles en la consola.",[327,1234,1235,1236,1238],{},"💡 Consejo: Utilizar un lambda para el ",[339,1237,856],{}," simplifica el código y mejora la legibilidad. Además, al capturar los valores de los componentes directamente dentro del listener, aseguramos que siempre obtenemos la información más actualizada ingresada por el usuario.",[331,1240,1242],{"id":1241},"paso-4-ejecutar-la-aplicación","Paso 4: Ejecutar la aplicación",[304,1244,1245,1246,1249,1250,599],{},"Finalmente, necesitamos un método ",[339,1247,1248],{},"main"," para ejecutar nuestra aplicación. Agregaremos este método en otra clase llamada ",[339,1251,1252],{},"Main",[355,1254,1256],{"className":357,"code":1255,"language":359,"meta":360,"style":360},"void main(){\n    SwingUtilities.invokeLater(() -> {\n        new CoffeeOrderApp();\n    });\n}\n",[339,1257,1258,1269,1284,1293,1298],{"__ignoreMap":360},[364,1259,1260,1263,1266],{"class":366,"line":367},[364,1261,1262],{"class":370},"void",[364,1264,1265],{"class":429}," main",[364,1267,1268],{"class":374},"(){\n",[364,1270,1271,1274,1277,1280,1282],{"class":366,"line":385},[364,1272,1273],{"class":374},"    SwingUtilities.",[364,1275,1276],{"class":429},"invokeLater",[364,1278,1279],{"class":374},"(() ",[364,1281,1042],{"class":370},[364,1283,1045],{"class":374},[364,1285,1286,1289,1291],{"class":366,"line":397},[364,1287,1288],{"class":370},"        new",[364,1290,430],{"class":429},[364,1292,1062],{"class":374},[364,1294,1295],{"class":366,"line":405},[364,1296,1297],{"class":374},"    });\n",[364,1299,1300],{"class":366,"line":413},[364,1301,580],{"class":374},[304,1303,1304,1305,1307],{},"Con esto, hemos completado nuestra aplicación de registro de pedidos para la cafetería universitaria utilizando Java Swing. Al ejecutar el método ",[339,1306,1248],{},", se abrirá una ventana donde los usuarios podrán ingresar sus pedidos y ver los detalles en la consola al hacer clic en el botón \"Registrar Pedido\".",[327,1309,1310],{},"💡 Metáfora Final: Nuestra aplicación Swing es como una hoja de pedidos digital, donde los usuarios pueden llenar sus opciones y enviarlas con un simple clic, facilitando el proceso de registro en la cafetería universitaria.",[1312,1313,1314],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":360,"searchDepth":385,"depth":385,"links":1316},[1317,1318,1319,1320],{"id":333,"depth":385,"text":334},{"id":592,"depth":385,"text":593},{"id":849,"depth":385,"text":850},{"id":1241,"depth":385,"text":1242},"En este ejemplo, crearemos una aplicación simple con una interfaz gráfica utilizando Java Swing. La aplicación consistirá en una ventana con un botón que, al hacer clic, mostrará un mensaje en la consola.","md",null,{"editButton":104},{"title":226,"description":1321},"Oy_-r8Fo_c2KfEGuwgXI1AaN63ySNBPxopE2NjKtv_4",[1328,1330],{"title":222,"path":223,"stem":224,"description":1329,"children":-1},"En este ejemplo, compararemos la validación de un `JTextField` con la validación de un `JFormattedTextField` utilizando una máscara de formato.",{"title":230,"path":231,"stem":232,"description":1331,"children":-1},"En este ejemplo, se muestra cómo estilizar componentes Swing utilizando delegadores para personalizar su apariencia.",1775101375551]