[{"data":1,"prerenderedAt":1303},["ShallowReactive",2],{"navigation_docs":3,"-ejemplos-ejemplo-02":298,"-ejemplos-ejemplo-02-surround":1298},[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":222,"body":300,"description":1292,"extension":1293,"links":1294,"meta":1295,"navigation":405,"path":223,"seo":1296,"stem":224,"__hash__":1297},"docs\u002F7.ejemplos\u002F02.ejemplo-02.md",{"type":301,"value":302,"toc":1288},"minimark",[303,316,325,330,343,899,909,915,919,924,1284],[304,305,306,307,311,312,315],"p",{},"En este ejemplo, compararemos la validación de un ",[308,309,310],"code",{},"JTextField"," con la validación de un ",[308,313,314],{},"JFormattedTextField",".",[304,317,318,319,321,322,324],{},"En primera instancia debemos comprender que un ",[308,320,310],{}," es un componente de texto simple que no tiene una validación incorporada, mientras que un ",[308,323,314],{}," es un componente de texto que permite aplicar una máscara de formato para validar la entrada del usuario u otro formateador personalizado.",[326,327,329],"h2",{"id":328},"validación-con-jtextfield","Validación con JTextField",[304,331,332,333,335,336,339,340,342],{},"Para validar un ",[308,334,310],{},", podemos usar la función ",[308,337,338],{},"setInputVerifier"," para establecer un verificador de entrada personalizado. Aquí hay un ejemplo de cómo validar que el texto ingresado en un ",[308,341,310],{}," sea un número entero:",[344,345,350],"pre",{"className":346,"code":347,"language":348,"meta":349,"style":349},"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 JTextFieldValidationExample {\n    public static void main(String[] args) {\n        JFrame frame = new JFrame(\"Validación con JTextField\");\n        JTextField textField = new JTextField(20);\n        JButton validateButton = new JButton(\"Validar\");\n\n        \u002F\u002F Establecer un InputVerifier para validar la entrada\n        textField.setInputVerifier(new InputVerifier() {\n            @Override\n            public boolean verify(JComponent input) {\n                String text = ((JTextField) input).getText();\n                try {\n                    Integer.parseInt(text); \u002F\u002F Intentar convertir a entero\n                    return true; \u002F\u002F Validación exitosa\n                } catch (NumberFormatException e) {\n                    JOptionPane.showMessageDialog(frame, \"Por favor, ingresa un número entero.\");\n                    return false; \u002F\u002F Validación fallida\n                }\n            }\n        });\n\n        validateButton.addActionListener(new ActionListener() {\n            @Override\n            public void actionPerformed(ActionEvent e) {\n                if (textField.getInputVerifier().verify(textField)) {\n                    JOptionPane.showMessageDialog(frame, \"¡Entrada válida!\");\n                }\n            }\n        });\n\n        frame.setLayout(new FlowLayout());\n        frame.add(textField);\n        frame.add(validateButton);\n        frame.setSize(300, 100);\n        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        frame.setVisible(true);\n    }\n}\n","java","",[308,351,352,372,384,392,400,407,423,454,478,498,518,523,530,549,558,578,595,603,618,633,650,667,680,686,692,698,703,721,728,745,766,780,785,790,795,800,819,830,840,861,872,887,893],{"__ignoreMap":349},[353,354,357,361,365,369],"span",{"class":355,"line":356},"line",1,[353,358,360],{"class":359},"snl16","import",[353,362,364],{"class":363},"s95oV"," javax.swing.",[353,366,368],{"class":367},"sDLfK","*",[353,370,371],{"class":363},";\n",[353,373,375,377,380,382],{"class":355,"line":374},2,[353,376,360],{"class":359},[353,378,379],{"class":363}," java.awt.",[353,381,368],{"class":367},[353,383,371],{"class":363},[353,385,387,389],{"class":355,"line":386},3,[353,388,360],{"class":359},[353,390,391],{"class":363}," java.awt.event.ActionEvent;\n",[353,393,395,397],{"class":355,"line":394},4,[353,396,360],{"class":359},[353,398,399],{"class":363}," java.awt.event.ActionListener;\n",[353,401,403],{"class":355,"line":402},5,[353,404,406],{"emptyLinePlaceholder":405},true,"\n",[353,408,410,413,416,420],{"class":355,"line":409},6,[353,411,412],{"class":359},"public",[353,414,415],{"class":359}," class",[353,417,419],{"class":418},"svObZ"," JTextFieldValidationExample",[353,421,422],{"class":363}," {\n",[353,424,426,429,432,435,438,441,444,447,451],{"class":355,"line":425},7,[353,427,428],{"class":359},"    public",[353,430,431],{"class":359}," static",[353,433,434],{"class":359}," void",[353,436,437],{"class":418}," main",[353,439,440],{"class":363},"(",[353,442,443],{"class":359},"String",[353,445,446],{"class":363},"[] ",[353,448,450],{"class":449},"s9osk","args",[353,452,453],{"class":363},") {\n",[353,455,457,460,463,466,469,471,475],{"class":355,"line":456},8,[353,458,459],{"class":363},"        JFrame frame ",[353,461,462],{"class":359},"=",[353,464,465],{"class":359}," new",[353,467,468],{"class":418}," JFrame",[353,470,440],{"class":363},[353,472,474],{"class":473},"sU2Wk","\"Validación con JTextField\"",[353,476,477],{"class":363},");\n",[353,479,481,484,486,488,491,493,496],{"class":355,"line":480},9,[353,482,483],{"class":363},"        JTextField textField ",[353,485,462],{"class":359},[353,487,465],{"class":359},[353,489,490],{"class":418}," JTextField",[353,492,440],{"class":363},[353,494,495],{"class":367},"20",[353,497,477],{"class":363},[353,499,501,504,506,508,511,513,516],{"class":355,"line":500},10,[353,502,503],{"class":363},"        JButton validateButton ",[353,505,462],{"class":359},[353,507,465],{"class":359},[353,509,510],{"class":418}," JButton",[353,512,440],{"class":363},[353,514,515],{"class":473},"\"Validar\"",[353,517,477],{"class":363},[353,519,521],{"class":355,"line":520},11,[353,522,406],{"emptyLinePlaceholder":405},[353,524,526],{"class":355,"line":525},12,[353,527,529],{"class":528},"sAwPA","        \u002F\u002F Establecer un InputVerifier para validar la entrada\n",[353,531,533,536,538,540,543,546],{"class":355,"line":532},13,[353,534,535],{"class":363},"        textField.",[353,537,338],{"class":418},[353,539,440],{"class":363},[353,541,542],{"class":359},"new",[353,544,545],{"class":418}," InputVerifier",[353,547,548],{"class":363},"() {\n",[353,550,552,555],{"class":355,"line":551},14,[353,553,554],{"class":363},"            @",[353,556,557],{"class":359},"Override\n",[353,559,561,564,567,570,573,576],{"class":355,"line":560},15,[353,562,563],{"class":359},"            public",[353,565,566],{"class":359}," boolean",[353,568,569],{"class":418}," verify",[353,571,572],{"class":363},"(JComponent ",[353,574,575],{"class":449},"input",[353,577,453],{"class":363},[353,579,581,584,586,589,592],{"class":355,"line":580},16,[353,582,583],{"class":363},"                String text ",[353,585,462],{"class":359},[353,587,588],{"class":363}," ((JTextField) input).",[353,590,591],{"class":418},"getText",[353,593,594],{"class":363},"();\n",[353,596,598,601],{"class":355,"line":597},17,[353,599,600],{"class":359},"                try",[353,602,422],{"class":363},[353,604,606,609,612,615],{"class":355,"line":605},18,[353,607,608],{"class":363},"                    Integer.",[353,610,611],{"class":418},"parseInt",[353,613,614],{"class":363},"(text); ",[353,616,617],{"class":528},"\u002F\u002F Intentar convertir a entero\n",[353,619,621,624,627,630],{"class":355,"line":620},19,[353,622,623],{"class":359},"                    return",[353,625,626],{"class":367}," true",[353,628,629],{"class":363},"; ",[353,631,632],{"class":528},"\u002F\u002F Validación exitosa\n",[353,634,636,639,642,645,648],{"class":355,"line":635},20,[353,637,638],{"class":363},"                } ",[353,640,641],{"class":359},"catch",[353,643,644],{"class":363}," (NumberFormatException ",[353,646,647],{"class":449},"e",[353,649,453],{"class":363},[353,651,653,656,659,662,665],{"class":355,"line":652},21,[353,654,655],{"class":363},"                    JOptionPane.",[353,657,658],{"class":418},"showMessageDialog",[353,660,661],{"class":363},"(frame, ",[353,663,664],{"class":473},"\"Por favor, ingresa un número entero.\"",[353,666,477],{"class":363},[353,668,670,672,675,677],{"class":355,"line":669},22,[353,671,623],{"class":359},[353,673,674],{"class":367}," false",[353,676,629],{"class":363},[353,678,679],{"class":528},"\u002F\u002F Validación fallida\n",[353,681,683],{"class":355,"line":682},23,[353,684,685],{"class":363},"                }\n",[353,687,689],{"class":355,"line":688},24,[353,690,691],{"class":363},"            }\n",[353,693,695],{"class":355,"line":694},25,[353,696,697],{"class":363},"        });\n",[353,699,701],{"class":355,"line":700},26,[353,702,406],{"emptyLinePlaceholder":405},[353,704,706,709,712,714,716,719],{"class":355,"line":705},27,[353,707,708],{"class":363},"        validateButton.",[353,710,711],{"class":418},"addActionListener",[353,713,440],{"class":363},[353,715,542],{"class":359},[353,717,718],{"class":418}," ActionListener",[353,720,548],{"class":363},[353,722,724,726],{"class":355,"line":723},28,[353,725,554],{"class":363},[353,727,557],{"class":359},[353,729,731,733,735,738,741,743],{"class":355,"line":730},29,[353,732,563],{"class":359},[353,734,434],{"class":359},[353,736,737],{"class":418}," actionPerformed",[353,739,740],{"class":363},"(ActionEvent ",[353,742,647],{"class":449},[353,744,453],{"class":363},[353,746,748,751,754,757,760,763],{"class":355,"line":747},30,[353,749,750],{"class":359},"                if",[353,752,753],{"class":363}," (textField.",[353,755,756],{"class":418},"getInputVerifier",[353,758,759],{"class":363},"().",[353,761,762],{"class":418},"verify",[353,764,765],{"class":363},"(textField)) {\n",[353,767,769,771,773,775,778],{"class":355,"line":768},31,[353,770,655],{"class":363},[353,772,658],{"class":418},[353,774,661],{"class":363},[353,776,777],{"class":473},"\"¡Entrada válida!\"",[353,779,477],{"class":363},[353,781,783],{"class":355,"line":782},32,[353,784,685],{"class":363},[353,786,788],{"class":355,"line":787},33,[353,789,691],{"class":363},[353,791,793],{"class":355,"line":792},34,[353,794,697],{"class":363},[353,796,798],{"class":355,"line":797},35,[353,799,406],{"emptyLinePlaceholder":405},[353,801,803,806,809,811,813,816],{"class":355,"line":802},36,[353,804,805],{"class":363},"        frame.",[353,807,808],{"class":418},"setLayout",[353,810,440],{"class":363},[353,812,542],{"class":359},[353,814,815],{"class":418}," FlowLayout",[353,817,818],{"class":363},"());\n",[353,820,822,824,827],{"class":355,"line":821},37,[353,823,805],{"class":363},[353,825,826],{"class":418},"add",[353,828,829],{"class":363},"(textField);\n",[353,831,833,835,837],{"class":355,"line":832},38,[353,834,805],{"class":363},[353,836,826],{"class":418},[353,838,839],{"class":363},"(validateButton);\n",[353,841,843,845,848,850,853,856,859],{"class":355,"line":842},39,[353,844,805],{"class":363},[353,846,847],{"class":418},"setSize",[353,849,440],{"class":363},[353,851,852],{"class":367},"300",[353,854,855],{"class":363},", ",[353,857,858],{"class":367},"100",[353,860,477],{"class":363},[353,862,864,866,869],{"class":355,"line":863},40,[353,865,805],{"class":363},[353,867,868],{"class":418},"setDefaultCloseOperation",[353,870,871],{"class":363},"(JFrame.EXIT_ON_CLOSE);\n",[353,873,875,877,880,882,885],{"class":355,"line":874},41,[353,876,805],{"class":363},[353,878,879],{"class":418},"setVisible",[353,881,440],{"class":363},[353,883,884],{"class":367},"true",[353,886,477],{"class":363},[353,888,890],{"class":355,"line":889},42,[353,891,892],{"class":363},"    }\n",[353,894,896],{"class":355,"line":895},43,[353,897,898],{"class":363},"}\n",[304,900,901,902,905,906,908],{},"En este caso podemos notar que creamos una clase anónima que extiende de ",[308,903,904],{},"InputVerifier"," para validar la entrada del ",[308,907,310],{},". Si el texto ingresado no es un número entero, se muestra un mensaje de error. Si la validación es exitosa, se muestra un mensaje de confirmación.",[304,910,911,912,914],{},"Aunque, debemos tener en cuenta que esta validación se realiza cada vez que el campo pierde el foco, lo que puede no ser ideal para todos los casos de uso. Además, el componente ",[308,913,904],{}," no proporciona una forma de formatear la entrada, lo que puede ser una limitación en algunos casos.",[326,916,918],{"id":917},"validación-con-jformattedtextfield","Validación con JFormattedTextField",[304,920,332,921,923],{},[308,922,314],{},", podemos usar una máscara de formato para restringir la entrada del usuario. Por ejemplo, si queremos que el usuario ingrese una fecha en el formato \"dd\u002FMM\u002Fyyyy\", podemos hacer lo siguiente:",[344,925,927],{"className":346,"code":926,"language":348,"meta":349,"style":349},"import javax.swing.*;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.awt.*;\nimport java.awt.event.ActionEvent;\nimport java.awt.event.ActionListener;\n\npublic class JFormattedTextFieldValidationExample {\n    public static void main(String[] args) {\n        JFrame frame = new JFrame(\"Validación con JFormattedTextField\");\n        SimpleDateFormat dateFormat = new SimpleDateFormat(\"dd\u002FMM\u002Fyyyy\");\n        JFormattedTextField formattedTextField = new JFormattedTextField(dateFormat);\n        formattedTextField.setColumns(20);\n        JButton validateButton = new JButton(\"Validar\");\n\n        validateButton.addActionListener(new ActionListener() {\n            @Override\n            public void actionPerformed(ActionEvent e) {\n                try {\n                    dateFormat.parse(formattedTextField.getText()); \u002F\u002F Intentar parsear la fecha\n                    JOptionPane.showMessageDialog(frame, \"¡Entrada válida!\");\n                } catch (ParseException ex) {\n                    JOptionPane.showMessageDialog(frame, \"Por favor, ingresa una fecha en el formato dd\u002FMM\u002Fyyyy.\");\n                }\n            }\n        });\n\n        frame.setLayout(new FlowLayout());\n        frame.add(formattedTextField);\n        frame.add(validateButton);\n        frame.setSize(300, 100);\n        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n        frame.setVisible(true);\n    }\n}\n",[308,928,929,939,946,953,963,969,975,979,990,1010,1027,1046,1061,1075,1091,1095,1109,1115,1129,1135,1154,1166,1180,1193,1197,1201,1205,1209,1223,1232,1240,1256,1264,1276,1280],{"__ignoreMap":349},[353,930,931,933,935,937],{"class":355,"line":356},[353,932,360],{"class":359},[353,934,364],{"class":363},[353,936,368],{"class":367},[353,938,371],{"class":363},[353,940,941,943],{"class":355,"line":374},[353,942,360],{"class":359},[353,944,945],{"class":363}," java.text.ParseException;\n",[353,947,948,950],{"class":355,"line":386},[353,949,360],{"class":359},[353,951,952],{"class":363}," java.text.SimpleDateFormat;\n",[353,954,955,957,959,961],{"class":355,"line":394},[353,956,360],{"class":359},[353,958,379],{"class":363},[353,960,368],{"class":367},[353,962,371],{"class":363},[353,964,965,967],{"class":355,"line":402},[353,966,360],{"class":359},[353,968,391],{"class":363},[353,970,971,973],{"class":355,"line":409},[353,972,360],{"class":359},[353,974,399],{"class":363},[353,976,977],{"class":355,"line":425},[353,978,406],{"emptyLinePlaceholder":405},[353,980,981,983,985,988],{"class":355,"line":456},[353,982,412],{"class":359},[353,984,415],{"class":359},[353,986,987],{"class":418}," JFormattedTextFieldValidationExample",[353,989,422],{"class":363},[353,991,992,994,996,998,1000,1002,1004,1006,1008],{"class":355,"line":480},[353,993,428],{"class":359},[353,995,431],{"class":359},[353,997,434],{"class":359},[353,999,437],{"class":418},[353,1001,440],{"class":363},[353,1003,443],{"class":359},[353,1005,446],{"class":363},[353,1007,450],{"class":449},[353,1009,453],{"class":363},[353,1011,1012,1014,1016,1018,1020,1022,1025],{"class":355,"line":500},[353,1013,459],{"class":363},[353,1015,462],{"class":359},[353,1017,465],{"class":359},[353,1019,468],{"class":418},[353,1021,440],{"class":363},[353,1023,1024],{"class":473},"\"Validación con JFormattedTextField\"",[353,1026,477],{"class":363},[353,1028,1029,1032,1034,1036,1039,1041,1044],{"class":355,"line":520},[353,1030,1031],{"class":363},"        SimpleDateFormat dateFormat ",[353,1033,462],{"class":359},[353,1035,465],{"class":359},[353,1037,1038],{"class":418}," SimpleDateFormat",[353,1040,440],{"class":363},[353,1042,1043],{"class":473},"\"dd\u002FMM\u002Fyyyy\"",[353,1045,477],{"class":363},[353,1047,1048,1051,1053,1055,1058],{"class":355,"line":525},[353,1049,1050],{"class":363},"        JFormattedTextField formattedTextField ",[353,1052,462],{"class":359},[353,1054,465],{"class":359},[353,1056,1057],{"class":418}," JFormattedTextField",[353,1059,1060],{"class":363},"(dateFormat);\n",[353,1062,1063,1066,1069,1071,1073],{"class":355,"line":532},[353,1064,1065],{"class":363},"        formattedTextField.",[353,1067,1068],{"class":418},"setColumns",[353,1070,440],{"class":363},[353,1072,495],{"class":367},[353,1074,477],{"class":363},[353,1076,1077,1079,1081,1083,1085,1087,1089],{"class":355,"line":551},[353,1078,503],{"class":363},[353,1080,462],{"class":359},[353,1082,465],{"class":359},[353,1084,510],{"class":418},[353,1086,440],{"class":363},[353,1088,515],{"class":473},[353,1090,477],{"class":363},[353,1092,1093],{"class":355,"line":560},[353,1094,406],{"emptyLinePlaceholder":405},[353,1096,1097,1099,1101,1103,1105,1107],{"class":355,"line":580},[353,1098,708],{"class":363},[353,1100,711],{"class":418},[353,1102,440],{"class":363},[353,1104,542],{"class":359},[353,1106,718],{"class":418},[353,1108,548],{"class":363},[353,1110,1111,1113],{"class":355,"line":597},[353,1112,554],{"class":363},[353,1114,557],{"class":359},[353,1116,1117,1119,1121,1123,1125,1127],{"class":355,"line":605},[353,1118,563],{"class":359},[353,1120,434],{"class":359},[353,1122,737],{"class":418},[353,1124,740],{"class":363},[353,1126,647],{"class":449},[353,1128,453],{"class":363},[353,1130,1131,1133],{"class":355,"line":620},[353,1132,600],{"class":359},[353,1134,422],{"class":363},[353,1136,1137,1140,1143,1146,1148,1151],{"class":355,"line":635},[353,1138,1139],{"class":363},"                    dateFormat.",[353,1141,1142],{"class":418},"parse",[353,1144,1145],{"class":363},"(formattedTextField.",[353,1147,591],{"class":418},[353,1149,1150],{"class":363},"()); ",[353,1152,1153],{"class":528},"\u002F\u002F Intentar parsear la fecha\n",[353,1155,1156,1158,1160,1162,1164],{"class":355,"line":652},[353,1157,655],{"class":363},[353,1159,658],{"class":418},[353,1161,661],{"class":363},[353,1163,777],{"class":473},[353,1165,477],{"class":363},[353,1167,1168,1170,1172,1175,1178],{"class":355,"line":669},[353,1169,638],{"class":363},[353,1171,641],{"class":359},[353,1173,1174],{"class":363}," (ParseException ",[353,1176,1177],{"class":449},"ex",[353,1179,453],{"class":363},[353,1181,1182,1184,1186,1188,1191],{"class":355,"line":682},[353,1183,655],{"class":363},[353,1185,658],{"class":418},[353,1187,661],{"class":363},[353,1189,1190],{"class":473},"\"Por favor, ingresa una fecha en el formato dd\u002FMM\u002Fyyyy.\"",[353,1192,477],{"class":363},[353,1194,1195],{"class":355,"line":688},[353,1196,685],{"class":363},[353,1198,1199],{"class":355,"line":694},[353,1200,691],{"class":363},[353,1202,1203],{"class":355,"line":700},[353,1204,697],{"class":363},[353,1206,1207],{"class":355,"line":705},[353,1208,406],{"emptyLinePlaceholder":405},[353,1210,1211,1213,1215,1217,1219,1221],{"class":355,"line":723},[353,1212,805],{"class":363},[353,1214,808],{"class":418},[353,1216,440],{"class":363},[353,1218,542],{"class":359},[353,1220,815],{"class":418},[353,1222,818],{"class":363},[353,1224,1225,1227,1229],{"class":355,"line":730},[353,1226,805],{"class":363},[353,1228,826],{"class":418},[353,1230,1231],{"class":363},"(formattedTextField);\n",[353,1233,1234,1236,1238],{"class":355,"line":747},[353,1235,805],{"class":363},[353,1237,826],{"class":418},[353,1239,839],{"class":363},[353,1241,1242,1244,1246,1248,1250,1252,1254],{"class":355,"line":768},[353,1243,805],{"class":363},[353,1245,847],{"class":418},[353,1247,440],{"class":363},[353,1249,852],{"class":367},[353,1251,855],{"class":363},[353,1253,858],{"class":367},[353,1255,477],{"class":363},[353,1257,1258,1260,1262],{"class":355,"line":782},[353,1259,805],{"class":363},[353,1261,868],{"class":418},[353,1263,871],{"class":363},[353,1265,1266,1268,1270,1272,1274],{"class":355,"line":787},[353,1267,805],{"class":363},[353,1269,879],{"class":418},[353,1271,440],{"class":363},[353,1273,884],{"class":367},[353,1275,477],{"class":363},[353,1277,1278],{"class":355,"line":792},[353,1279,892],{"class":363},[353,1281,1282],{"class":355,"line":797},[353,1283,898],{"class":363},[1285,1286,1287],"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 .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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":349,"searchDepth":374,"depth":374,"links":1289},[1290,1291],{"id":328,"depth":374,"text":329},{"id":917,"depth":374,"text":918},"En este ejemplo, compararemos la validación de un `JTextField` con la validación de un `JFormattedTextField` utilizando una máscara de formato.","md",null,{"editButton":104},{"title":222,"description":1292},"bGxWtCySu4TC2A69Lp8zbBV5mUOArpyhIg2a2F2vLRw",[1299,1301],{"title":218,"path":219,"stem":220,"description":1300,"children":-1},"En este ejemplo, crearemos una clase abstracta para validar expresiones regulares y luego implementaremos una subclase concreta que valide direcciones de correo electrónico.",{"title":226,"path":227,"stem":228,"description":1302,"children":-1},"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.",1775101375372]