[{"data":1,"prerenderedAt":1265},["ShallowReactive",2],{"navigation_docs":3,"-archivos-ui-rpg-ui-5":412,"-archivos-ui-rpg-ui-5-surround":1260},[4,18,43,118,160,200,231,320,346],{"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,"icon":20,"path":21,"stem":22,"children":23,"page":42},"Entorno de desarrollo","i-codicon-edit-code","\u002Fide","2.ide",[24,28,33,37],{"title":25,"path":26,"stem":27,"icon":20},"¿Qué es un IDE?","\u002Fide\u002Fentorno","2.ide\u002F1.entorno",{"title":29,"path":30,"stem":31,"icon":32},"Estructura de un Proyecto","\u002Fide\u002Festructura","2.ide\u002F2.estructura","i-clarity-tree-view-line",{"title":34,"path":35,"stem":36,"icon":20},"La compilación en un IDE","\u002Fide\u002Fcompilacion","2.ide\u002F3.compilacion",{"title":38,"path":39,"stem":40,"icon":41},"Depuración de Código","\u002Fide\u002Fdepurar","2.ide\u002F4.depurar","i-lucide-bug",false,{"title":44,"icon":45,"path":46,"stem":47,"children":48,"page":42},"Clases y Objetos","i-catppuccin-java-class","\u002Fclases-objetos","3.clases-objetos",[49,53,57,62,66,70,74,78,83,88,92,96,101,106,110,114],{"title":50,"path":51,"stem":52},"Repaso previo a Clases y Objetos","\u002Fclases-objetos\u002Fpreview","3.clases-objetos\u002F00.preview",{"title":54,"path":55,"stem":56,"icon":45},"¿Qué es la Programación Orientada a Objetos (POO)?","\u002Fclases-objetos\u002Fpoo","3.clases-objetos\u002F01.poo",{"title":58,"path":59,"stem":60,"icon":61},"Diagramas de Clases y Objetos","\u002Fclases-objetos\u002Fdiagramas","3.clases-objetos\u002F02.diagramas","i-devicon-uml",{"title":63,"path":64,"stem":65,"icon":45},"Las Clases","\u002Fclases-objetos\u002Fclases","3.clases-objetos\u002F03.clases",{"title":67,"path":68,"stem":69,"icon":45},"Ámbito y Visibilidad","\u002Fclases-objetos\u002Fambito","3.clases-objetos\u002F04.ambito",{"title":71,"path":72,"stem":73,"icon":45},"Declaración e Instanciación de Objetos","\u002Fclases-objetos\u002Fobjetos","3.clases-objetos\u002F05.objetos",{"title":75,"path":76,"stem":77,"icon":45},"Clases Predefinidas en Java","\u002Fclases-objetos\u002Fpredefinidas","3.clases-objetos\u002F06.predefinidas",{"title":79,"path":80,"stem":81,"icon":82},"Paquetes en Java","\u002Fclases-objetos\u002Fpaquetes","3.clases-objetos\u002F07.paquetes","i-material-icon-theme-folder-java-open",{"title":84,"path":85,"stem":86,"icon":87},"Las Excepciones","\u002Fclases-objetos\u002Fexcepciones","3.clases-objetos\u002F08.excepciones","i-catppuccin-java-exception",{"title":89,"path":90,"stem":91,"icon":45},"La clase JOptionPane","\u002Fclases-objetos\u002Fjoptionpane","3.clases-objetos\u002F09.joptionpane",{"title":93,"path":94,"stem":95,"icon":45},"Constructores y Accesores","\u002Fclases-objetos\u002Fconstructores","3.clases-objetos\u002F10.constructores",{"title":97,"path":98,"stem":99,"icon":100},"Tipos Enumerados (Enums)","\u002Fclases-objetos\u002Fenumerados","3.clases-objetos\u002F11.enumerados","i-catppuccin-java-enum",{"title":102,"path":103,"stem":104,"icon":105},"Modificadores de acceso static y final","\u002Fclases-objetos\u002Fmodificadores","3.clases-objetos\u002F12.modificadores","i-mdi-chart-box",{"title":107,"path":108,"stem":109,"icon":105},"El casting en Java","\u002Fclases-objetos\u002Fcasting","3.clases-objetos\u002F13.casting",{"title":111,"path":112,"stem":113},"Las Expresiones Regulares","\u002Fclases-objetos\u002Fexpresiones-regulares","3.clases-objetos\u002F14.expresiones-regulares",{"title":115,"path":116,"stem":117,"icon":105},"Clases Genéricas en Java","\u002Fclases-objetos\u002Fclases-genericas","3.clases-objetos\u002F15.clases-genericas",{"title":119,"icon":120,"path":121,"stem":122,"children":123,"page":42},"Funciones (Métodos)","i-material-symbols-function","\u002Fmetodos","4.metodos",[124,128,132,136,140,144,148,152,156],{"title":125,"path":126,"stem":127},"Funciones Genéricas","\u002Fmetodos\u002Ffuncion-generica","4.metodos\u002F01.funcion-generica",{"title":129,"path":130,"stem":131},"Métodos de Instancia y de Clase","\u002Fmetodos\u002Finstancia-clase","4.metodos\u002F02.instancia-clase",{"title":133,"path":134,"stem":135},"Sobrecarga de Funciones","\u002Fmetodos\u002Fsobrecarga","4.metodos\u002F03.sobrecarga",{"title":137,"path":138,"stem":139},"Alcance de Variables y Métodos","\u002Fmetodos\u002Falcance","4.metodos\u002F04.alcance",{"title":141,"path":142,"stem":143},"Recursividad","\u002Fmetodos\u002Frecursividad","4.metodos\u002F05.recursividad",{"title":145,"path":146,"stem":147},"Puntero this","\u002Fmetodos\u002Fthis","4.metodos\u002F06.this",{"title":149,"path":150,"stem":151},"Los argumentos variables (varargs)","\u002Fmetodos\u002Fvarargs","4.metodos\u002F07.varargs",{"title":153,"path":154,"stem":155},"La clase Arrays","\u002Fmetodos\u002Farrays","4.metodos\u002F08.arrays",{"title":157,"path":158,"stem":159},"Predicados Simples y Compuestos en Java","\u002Fmetodos\u002Fpredicados","4.metodos\u002F09.predicados",{"title":161,"path":162,"stem":163,"children":164,"icon":199},"Herencia","\u002Fherencia","5.herencia\u002F01.index",[165,167,171,175,179,183,187,191,195],{"title":166,"path":162,"stem":163},"¿Qué es la herencia?",{"title":168,"path":169,"stem":170},"Sobreescritura de métodos y uso de `super`","\u002Fherencia\u002Fsobeescritura","5.herencia\u002F02.sobeescritura",{"title":172,"path":173,"stem":174},"Tipos de herencia","\u002Fherencia\u002Ftipos-herencia","5.herencia\u002F03.tipos-herencia",{"title":176,"path":177,"stem":178},"La clase Object en Java","\u002Fherencia\u002Fobject","5.herencia\u002F04.object",{"title":180,"path":181,"stem":182},"Polimorfismo","\u002Fherencia\u002Fpolimorfismo","5.herencia\u002F05.polimorfismo",{"title":184,"path":185,"stem":186},"Clases y Funciones Abstractas","\u002Fherencia\u002Fabstract","5.herencia\u002F06.abstract",{"title":188,"path":189,"stem":190},"Interfaces","\u002Fherencia\u002Finterfaces","5.herencia\u002F07.interfaces",{"title":192,"path":193,"stem":194},"Funciones e Interfaces","\u002Fherencia\u002Ffunciones-interfaces","5.herencia\u002F08.funciones-interfaces",{"title":196,"path":197,"stem":198},"Interfaces y Funciones Lambda","\u002Fherencia\u002Flambda-interface","5.herencia\u002F09.lambda-interface","i-material-symbols-heritage",{"title":201,"path":202,"stem":203,"children":204,"icon":199},"Arreglos","\u002Farreglos","6.arreglos\u002F01.index",[205,207,211,215,219,223,227],{"title":206,"path":202,"stem":203},"Los arreglos en Java",{"title":208,"path":209,"stem":210},"Los arreglos","\u002Farreglos\u002Farray","6.arreglos\u002F02.array",{"title":212,"path":213,"stem":214},"Matrices","\u002Farreglos\u002Fmatrices","6.arreglos\u002F03.matrices",{"title":216,"path":217,"stem":218},"Comparadores","\u002Farreglos\u002Fcomparator","6.arreglos\u002F04.comparator",{"title":220,"path":221,"stem":222},"Arreglos dinámicos: ArrayList","\u002Farreglos\u002Farraylist","6.arreglos\u002F05.arraylist",{"title":224,"path":225,"stem":226},"Arreglos Relacionales: HashMap","\u002Farreglos\u002Fhashmap","6.arreglos\u002F06.hashmap",{"title":228,"path":229,"stem":230},"La clase Stream en Java","\u002Farreglos\u002Fstream","6.arreglos\u002F07.stream",{"title":232,"icon":199,"path":233,"stem":234,"children":235,"page":42},"Archivos e Interfaz de Usuario","\u002Farchivos-ui","7.archivos-ui",[236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316],{"title":237,"path":238,"stem":239},"El paquete Swing","\u002Farchivos-ui\u002Fswing","7.archivos-ui\u002F01.swing",{"title":241,"path":242,"stem":243},"La clase JFrame y el JPanel","\u002Farchivos-ui\u002Fjpanel","7.archivos-ui\u002F02.jpanel",{"title":245,"path":246,"stem":247},"Los Layouts en Swing","\u002Farchivos-ui\u002Flayout","7.archivos-ui\u002F03.layout",{"title":249,"path":250,"stem":251},"Iniciando con Swing","\u002Farchivos-ui\u002Finiciando","7.archivos-ui\u002F04.iniciando",{"title":253,"path":254,"stem":255},"Las clases Color y Font en Swing","\u002Farchivos-ui\u002Fcolor-font","7.archivos-ui\u002F05.color-font",{"title":257,"path":258,"stem":259},"Etiquetas en Swing","\u002Farchivos-ui\u002Fetiquetas","7.archivos-ui\u002F06.etiquetas",{"title":261,"path":262,"stem":263},"Personalizando la apariencia de los componentes en Swing","\u002Farchivos-ui\u002Fpersonalizando","7.archivos-ui\u002F07.personalizando",{"title":265,"path":266,"stem":267},"Sobrescribiendo el método drawComponent() en Swing","\u002Farchivos-ui\u002Fdraw","7.archivos-ui\u002F08.draw",{"title":269,"path":270,"stem":271},"Manejando eventos en Swing","\u002Farchivos-ui\u002Feventos","7.archivos-ui\u002F09.eventos",{"title":273,"path":274,"stem":275},"Personalización de Componentes mediante la Extensión de Clases en Swing","\u002Farchivos-ui\u002Fextends-component","7.archivos-ui\u002F10.extends-component",{"title":277,"path":278,"stem":279},"Gradientes","\u002Farchivos-ui\u002Fgradientes","7.archivos-ui\u002F11.gradientes",{"title":281,"path":282,"stem":283},"Botones en Swing","\u002Farchivos-ui\u002Fbotones","7.archivos-ui\u002F12.botones",{"title":285,"path":286,"stem":287},"Los delegadores en Swing","\u002Farchivos-ui\u002Fdelegadores","7.archivos-ui\u002F13.delegadores",{"title":289,"path":290,"stem":291},"UI para nuestro RPG: Parte 1","\u002Farchivos-ui\u002Frpg-ui-1","7.archivos-ui\u002F14.rpg-ui-1",{"title":293,"path":294,"stem":295},"UI para nuestro RPG: Parte 2","\u002Farchivos-ui\u002Frpg-ui-2","7.archivos-ui\u002F15.rpg-ui-2",{"title":297,"path":298,"stem":299},"Los Streams Entrada y Salida","\u002Farchivos-ui\u002Fstreams","7.archivos-ui\u002F16.streams",{"title":301,"path":302,"stem":303},"Archivo tipo Objeto","\u002Farchivos-ui\u002Farchivo-objeto","7.archivos-ui\u002F17.archivo-objeto",{"title":305,"path":306,"stem":307},"UI para nuestro RPG: Parte 3","\u002Farchivos-ui\u002Frpg-ui-3","7.archivos-ui\u002F18.rpg-ui-3",{"title":309,"path":310,"stem":311},"UI para nuestro RPG: Parte 4","\u002Farchivos-ui\u002Frpg-ui-4","7.archivos-ui\u002F19.rpg-ui-4",{"title":313,"path":314,"stem":315},"UI para nuestro RPG: Parte 5","\u002Farchivos-ui\u002Frpg-ui-5","7.archivos-ui\u002F20.rpg-ui-5",{"title":317,"path":318,"stem":319},"UI para nuestro RPG: Parte 6","\u002Farchivos-ui\u002Frpg-ui-6","7.archivos-ui\u002F21.rpg-ui-6",{"title":321,"icon":322,"path":323,"stem":324,"children":325,"page":42},"Ejemplos","i-check-circle","\u002Fejemplos","8.ejemplos",[326,330,334,338,342],{"title":327,"path":328,"stem":329,"icon":105},"Ejemplo 1: Validando entradas con JOptionPane","\u002Fejemplos\u002Fejemplo-01","8.ejemplos\u002F01.ejemplo-01",{"title":331,"path":332,"stem":333},"Ejemplo 02: Uso de clases genéricas en Java","\u002Fejemplos\u002Fejemplo-02","8.ejemplos\u002F02.ejemplo-02",{"title":335,"path":336,"stem":337},"Ejemplo 03: Uso de Enum, Excepciones en Java","\u002Fejemplos\u002Fejemplo-03","8.ejemplos\u002F03.ejemplo-03",{"title":339,"path":340,"stem":341},"Ejemplo 4: Clase con funciones genéricas de validación","\u002Fejemplos\u002Fejemplo-04","8.ejemplos\u002F04.ejemplo-04",{"title":343,"path":344,"stem":345},"Ejemplo 5: Sistema de Gestión de Empleados","\u002Fejemplos\u002Fejemplo-05","8.ejemplos\u002F05.ejemplo-05",{"title":347,"icon":322,"path":348,"stem":349,"children":350,"page":42},"Actividades","\u002Factividades","9.actividades",[351,355,360,364,368,372,376,380,384,388,392,396,400,404,408],{"title":352,"path":353,"stem":354,"icon":105},"Actividad 1: Infografía sobre el proceso de compilación","\u002Factividades\u002Fact-01","9.actividades\u002F01.act-01",{"title":356,"path":357,"stem":358,"icon":359},"Actividad 2: Modelando Diagramas de Clases UML","\u002Factividades\u002Fact-02","9.actividades\u002F02.act-02","i-material-icon-theme-uml",{"title":361,"path":362,"stem":363,"icon":45},"Actividad 3: Creando Clases y Objetos en Java","\u002Factividades\u002Fact-03","9.actividades\u002F03.act-03",{"title":365,"path":366,"stem":367},"Actividad 4: Validando entradas de datos","\u002Factividades\u002Fact-04","9.actividades\u002F04.act-04",{"title":369,"path":370,"stem":371,"icon":105},"Actividad 5: Implementando una clase genérica","\u002Factividades\u002Fact-05","9.actividades\u002F05.act-05",{"title":373,"path":374,"stem":375,"icon":105},"Actividad 6: Expandiendo InputValidator con Predicados y Function","\u002Factividades\u002Fact-06","9.actividades\u002F06.act-06",{"title":377,"path":378,"stem":379,"icon":105},"Actividad 7: Gestor de Biblioteca con InputValidator","\u002Factividades\u002Fact-07","9.actividades\u002F07.act-07",{"title":381,"path":382,"stem":383,"icon":105},"Actividad 8: Calculadora de Figuras Geométricas","\u002Factividades\u002Fact-08","9.actividades\u002F08.act-08",{"title":385,"path":386,"stem":387,"icon":105},"Actividad 9: gestión de una empresa agroalimentaria","\u002Factividades\u002Fact-09","9.actividades\u002F09.act-09",{"title":389,"path":390,"stem":391,"icon":105},"Actividad 10: Sistema de gestión de clínicas veterinarias","\u002Factividades\u002Fact-10","9.actividades\u002F10.act-10",{"title":393,"path":394,"stem":395},"Definición de Proyecto Evolutivo","\u002Factividades\u002Frpg","9.actividades\u002F11.rpg",{"title":397,"path":398,"stem":399},"Actividad 11: Creación de Personajes","\u002Factividades\u002Fact-11","9.actividades\u002F12.act-11",{"title":401,"path":402,"stem":403},"Actividad 12: El Inventario y los Objetos","\u002Factividades\u002Fact-12","9.actividades\u002F13.act-12",{"title":405,"path":406,"stem":407},"Actividad 13: El combate por turnos","\u002Factividades\u002Fact-13","9.actividades\u002F14.act-13",{"title":409,"path":410,"stem":411},"Actividad 14: Guardando y Cargando","\u002Factividades\u002Fact-14","9.actividades\u002F15.act-14",{"id":413,"title":313,"body":414,"description":1254,"extension":1255,"links":1256,"meta":1257,"navigation":464,"path":314,"seo":1258,"stem":315,"__hash__":1259},"docs\u002F7.archivos-ui\u002F20.rpg-ui-5.md",{"type":415,"value":416,"toc":1245},"minimark",[417,422,426,430,433,436,827,837,846,856,866,872,881,886,895,904,910,922,926,933,936,1048,1061,1221,1234,1238,1241],[418,419,421],"h2",{"id":420},"qué-es-una-caché","¿Qué es una caché?",[423,424,425],"p",{},"La caché es un mecanismo que almacena datos en memoria para su acceso rápido. En el contexto de la programación, la\ncaché se utiliza para mejorar el rendimiento al almacenar datos que se acceden con frecuencia, evitando así el acceso\nconstante a la base de datos o el disco duro.",[418,427,429],{"id":428},"cómo-implementar-una-caché","¿Cómo implementar una caché?",[423,431,432],{},"Para efectos de nuestro curso, usaremos una tabla hash para implementar la caché, ya que es un mecanismo eficiente y\nrápido para acceder a datos.",[423,434,435],{},"Veamos entonces una implementación básica de una caché.",[437,438,443],"pre",{"className":439,"code":440,"language":441,"meta":442,"style":442},"language-java shiki shiki-themes github-dark","package app.game.rpg.utils;\n\nimport javax.imageio.ImageIO;\nimport java.awt.image.BufferedImage;\nimport java.util.HashMap;\nimport java.util.Objects;\n\npublic class ImageCache {\n\n    public static final HashMap\u003CString, BufferedImage> IMAGES = new HashMap\u003C>();\n\n    public static void addImage(String name, String path) {\n\n        if (!IMAGES.containsKey(name))\n            IMAGES.putIfAbsent(name, load(path));\n    }\n\n    public static BufferedImage getImage(String name) {\n        return IMAGES.get(name);\n    }\n\n    private static BufferedImage load(String path) {\n        try {\n            return ImageIO.read(\n                    Objects.requireNonNull(ImageCache.class.getResource(\"\u002Fimg\u002F\" + path))\n            );\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n}\n","java","",[444,445,446,459,466,475,483,491,499,504,520,525,561,566,595,600,621,639,645,650,669,684,689,694,712,720,735,763,769,786,798,810,816,821],"code",{"__ignoreMap":442},[447,448,451,455],"span",{"class":449,"line":450},"line",1,[447,452,454],{"class":453},"snl16","package",[447,456,458],{"class":457},"s95oV"," app.game.rpg.utils;\n",[447,460,462],{"class":449,"line":461},2,[447,463,465],{"emptyLinePlaceholder":464},true,"\n",[447,467,469,472],{"class":449,"line":468},3,[447,470,471],{"class":453},"import",[447,473,474],{"class":457}," javax.imageio.ImageIO;\n",[447,476,478,480],{"class":449,"line":477},4,[447,479,471],{"class":453},[447,481,482],{"class":457}," java.awt.image.BufferedImage;\n",[447,484,486,488],{"class":449,"line":485},5,[447,487,471],{"class":453},[447,489,490],{"class":457}," java.util.HashMap;\n",[447,492,494,496],{"class":449,"line":493},6,[447,495,471],{"class":453},[447,497,498],{"class":457}," java.util.Objects;\n",[447,500,502],{"class":449,"line":501},7,[447,503,465],{"emptyLinePlaceholder":464},[447,505,507,510,513,517],{"class":449,"line":506},8,[447,508,509],{"class":453},"public",[447,511,512],{"class":453}," class",[447,514,516],{"class":515},"svObZ"," ImageCache",[447,518,519],{"class":457}," {\n",[447,521,523],{"class":449,"line":522},9,[447,524,465],{"emptyLinePlaceholder":464},[447,526,528,531,534,537,540,543,546,549,552,555,558],{"class":449,"line":527},10,[447,529,530],{"class":453},"    public",[447,532,533],{"class":453}," static",[447,535,536],{"class":453}," final",[447,538,539],{"class":457}," HashMap\u003C",[447,541,542],{"class":453},"String",[447,544,545],{"class":457},", ",[447,547,548],{"class":453},"BufferedImage",[447,550,551],{"class":457},"> IMAGES ",[447,553,554],{"class":453},"=",[447,556,557],{"class":453}," new",[447,559,560],{"class":457}," HashMap\u003C>();\n",[447,562,564],{"class":449,"line":563},11,[447,565,465],{"emptyLinePlaceholder":464},[447,567,569,571,573,576,579,582,586,589,592],{"class":449,"line":568},12,[447,570,530],{"class":453},[447,572,533],{"class":453},[447,574,575],{"class":453}," void",[447,577,578],{"class":515}," addImage",[447,580,581],{"class":457},"(String ",[447,583,585],{"class":584},"s9osk","name",[447,587,588],{"class":457},", String ",[447,590,591],{"class":584},"path",[447,593,594],{"class":457},") {\n",[447,596,598],{"class":449,"line":597},13,[447,599,465],{"emptyLinePlaceholder":464},[447,601,603,606,609,612,615,618],{"class":449,"line":602},14,[447,604,605],{"class":453},"        if",[447,607,608],{"class":457}," (",[447,610,611],{"class":453},"!",[447,613,614],{"class":457},"IMAGES.",[447,616,617],{"class":515},"containsKey",[447,619,620],{"class":457},"(name))\n",[447,622,624,627,630,633,636],{"class":449,"line":623},15,[447,625,626],{"class":457},"            IMAGES.",[447,628,629],{"class":515},"putIfAbsent",[447,631,632],{"class":457},"(name, ",[447,634,635],{"class":515},"load",[447,637,638],{"class":457},"(path));\n",[447,640,642],{"class":449,"line":641},16,[447,643,644],{"class":457},"    }\n",[447,646,648],{"class":449,"line":647},17,[447,649,465],{"emptyLinePlaceholder":464},[447,651,653,655,657,660,663,665,667],{"class":449,"line":652},18,[447,654,530],{"class":453},[447,656,533],{"class":453},[447,658,659],{"class":457}," BufferedImage ",[447,661,662],{"class":515},"getImage",[447,664,581],{"class":457},[447,666,585],{"class":584},[447,668,594],{"class":457},[447,670,672,675,678,681],{"class":449,"line":671},19,[447,673,674],{"class":453},"        return",[447,676,677],{"class":457}," IMAGES.",[447,679,680],{"class":515},"get",[447,682,683],{"class":457},"(name);\n",[447,685,687],{"class":449,"line":686},20,[447,688,644],{"class":457},[447,690,692],{"class":449,"line":691},21,[447,693,465],{"emptyLinePlaceholder":464},[447,695,697,700,702,704,706,708,710],{"class":449,"line":696},22,[447,698,699],{"class":453},"    private",[447,701,533],{"class":453},[447,703,659],{"class":457},[447,705,635],{"class":515},[447,707,581],{"class":457},[447,709,591],{"class":584},[447,711,594],{"class":457},[447,713,715,718],{"class":449,"line":714},23,[447,716,717],{"class":453},"        try",[447,719,519],{"class":457},[447,721,723,726,729,732],{"class":449,"line":722},24,[447,724,725],{"class":453},"            return",[447,727,728],{"class":457}," ImageIO.",[447,730,731],{"class":515},"read",[447,733,734],{"class":457},"(\n",[447,736,738,741,744,747,750,753,757,760],{"class":449,"line":737},25,[447,739,740],{"class":457},"                    Objects.",[447,742,743],{"class":515},"requireNonNull",[447,745,746],{"class":457},"(ImageCache.class.",[447,748,749],{"class":515},"getResource",[447,751,752],{"class":457},"(",[447,754,756],{"class":755},"sU2Wk","\"\u002Fimg\u002F\"",[447,758,759],{"class":453}," +",[447,761,762],{"class":457}," path))\n",[447,764,766],{"class":449,"line":765},26,[447,767,768],{"class":457},"            );\n",[447,770,772,775,778,781,784],{"class":449,"line":771},27,[447,773,774],{"class":457},"        } ",[447,776,777],{"class":453},"catch",[447,779,780],{"class":457}," (Exception ",[447,782,783],{"class":584},"e",[447,785,594],{"class":457},[447,787,789,792,795],{"class":449,"line":788},28,[447,790,791],{"class":457},"            e.",[447,793,794],{"class":515},"printStackTrace",[447,796,797],{"class":457},"();\n",[447,799,801,803,807],{"class":449,"line":800},29,[447,802,725],{"class":453},[447,804,806],{"class":805},"sDLfK"," null",[447,808,809],{"class":457},";\n",[447,811,813],{"class":449,"line":812},30,[447,814,815],{"class":457},"        }\n",[447,817,819],{"class":449,"line":818},31,[447,820,644],{"class":457},[447,822,824],{"class":449,"line":823},32,[447,825,826],{"class":457},"}\n",[423,828,829,830,833,834,836],{},"Como puedes ver, la caché es una clase simple que contiene un HashMap para almacenar las imágenes. Dicha clase cuenta\ncon dos métodos principales: ",[444,831,832],{},"addImage"," y ",[444,835,662],{},".",[423,838,839,840,842,843,845],{},"Por un ladó ",[444,841,832],{}," se encarga de agregar una imagen a la caché, y por otro ",[444,844,662],{}," se encarga de obtener una\nimagen de la caché.",[423,847,848,849,851,852,855],{},"Por otro lado, el método ",[444,850,635],{}," se encarga de cargar las imágenes desde el disco, esto mediante el uso de ",[444,853,854],{},"ImageIO.read","\ny el bloque try-with-resources.",[423,857,858,859,833,862,865],{},"Así mismo quizás te preguntes sobre ",[444,860,861],{},"Objects.requireNonNull",[444,863,864],{},"class.getResource",", así que aclaremos estos puntos.",[867,868,870],"h3",{"id":869},"objectsrequirenonnull",[444,871,861],{},[423,873,874,876,877,880],{},[444,875,861],{}," es un método que se encarga de verificar que un objeto no sea nulo, si es nulo, lanza una\nexcepción ",[444,878,879],{},"NullPointerException",". Esto es de vital importancia para el manejo de archivos, ya que permite controlar\ncuando un archivo está corrupto o no se encuentra.",[867,882,884],{"id":883},"classgetresource",[444,885,864],{},[423,887,888,889,891,892,836],{},"Por su parte, ",[444,890,864],{}," es un método que se encarga de obtener el URL de un archivo en el classpath. En este\ncaso, estamos obteniendo el URL de la propia clase estática ",[444,893,894],{},"ImageCache",[423,896,897,898,900,901,836],{},"Y aquí se presenta un punto importante, el uso de ",[444,899,749],{}," es posible siempre que nuestro proyecto esté configurado\ncorrectamente, es decir, que dentro del classpath del proyecto se agrega y define un directorio ",[444,902,903],{},"resources",[423,905,906,907,909],{},"Para lograr esto podemos usar varios caminos de acuerdo a nuestro editor. Por ejemplo en IntelliJ basta con crear una\ncarpeta en raíz del proyecto y seleccionarla como ",[444,908,903],{}," al dar clic derecho sobre ella.",[423,911,912,913,915,916,918,919,921],{},"Una vez hecho esto, el directorio ",[444,914,903],{}," se encuentra disponible para el uso de ",[444,917,749],{}," y por consiguiente\npodremos crear subcarpetas y archivos dentro de él, los cuales podremos cargar con ",[444,920,854],{}," o el stream necesario,\nsegún la naturaleza de tus archivos.",[418,923,925],{"id":924},"cómo-dibujo-algo","¿Cómo dibujo algo?",[423,927,928,929,932],{},"Para Swing, el proceso de dibujo es parte de la clase ",[444,930,931],{},"Graphics2D",". Por lo que si queremos dibujar algo, deberemos de\ncrear un objeto de esta clase y usar sus métodos para dibujar.",[423,934,935],{},"Tomemos el siguiente fragmento como ejemplo:",[437,937,939],{"className":439,"code":938,"language":441,"meta":442,"style":442},"\n@Override\npublic ImageIcon getImage() {\n\n    if (image == null) {\n        ImageCache.addImage(\"Slime\", \"characters\u002FSlime.png\");\n        image = new ImageIcon(ImageCache.getImage(\"Slime\"));\n    }\n    return image;\n\n}\n",[444,940,941,945,953,965,969,984,1004,1028,1032,1040,1044],{"__ignoreMap":442},[447,942,943],{"class":449,"line":450},[447,944,465],{"emptyLinePlaceholder":464},[447,946,947,950],{"class":449,"line":461},[447,948,949],{"class":457},"@",[447,951,952],{"class":453},"Override\n",[447,954,955,957,960,962],{"class":449,"line":468},[447,956,509],{"class":453},[447,958,959],{"class":457}," ImageIcon ",[447,961,662],{"class":515},[447,963,964],{"class":457},"() {\n",[447,966,967],{"class":449,"line":477},[447,968,465],{"emptyLinePlaceholder":464},[447,970,971,974,977,980,982],{"class":449,"line":485},[447,972,973],{"class":453},"    if",[447,975,976],{"class":457}," (image ",[447,978,979],{"class":453},"==",[447,981,806],{"class":805},[447,983,594],{"class":457},[447,985,986,989,991,993,996,998,1001],{"class":449,"line":493},[447,987,988],{"class":457},"        ImageCache.",[447,990,832],{"class":515},[447,992,752],{"class":457},[447,994,995],{"class":755},"\"Slime\"",[447,997,545],{"class":457},[447,999,1000],{"class":755},"\"characters\u002FSlime.png\"",[447,1002,1003],{"class":457},");\n",[447,1005,1006,1009,1011,1013,1016,1019,1021,1023,1025],{"class":449,"line":501},[447,1007,1008],{"class":457},"        image ",[447,1010,554],{"class":453},[447,1012,557],{"class":453},[447,1014,1015],{"class":515}," ImageIcon",[447,1017,1018],{"class":457},"(ImageCache.",[447,1020,662],{"class":515},[447,1022,752],{"class":457},[447,1024,995],{"class":755},[447,1026,1027],{"class":457},"));\n",[447,1029,1030],{"class":449,"line":506},[447,1031,644],{"class":457},[447,1033,1034,1037],{"class":449,"line":522},[447,1035,1036],{"class":453},"    return",[447,1038,1039],{"class":457}," image;\n",[447,1041,1042],{"class":449,"line":527},[447,1043,465],{"emptyLinePlaceholder":464},[447,1045,1046],{"class":449,"line":563},[447,1047,826],{"class":457},[423,1049,1050,1051,1053,1054,1057,1058,1060],{},"En esta función, puedes ver que usamos ",[444,1052,894],{}," para cargar la imagen, y ",[444,1055,1056],{},"ImageIcon"," para dibujarla. Esto se dbe a\nque ",[444,1059,1056],{}," es un componente de Swing que se encarga de dibujar la imagen en la interfaz y requiere de un archivo\nvalido para poder dibujarlo.",[437,1062,1064],{"className":439,"code":1063,"language":441,"meta":442,"style":442},"\n@Override\npublic void paint(Graphics g, JComponent c) {\n    Graphics2D g2d = (Graphics2D) g.create();\n    Icon icon = ((JLabel) c).getIcon();\n    if (icon != null) {\n        icon.paintIcon(c, g2d, ((c.getWidth() - icon.getIconWidth()) \u002F 2) - 2,\n                c.getHeight() - icon.getIconHeight() - 5);\n    }\n    g2d.dispose();\n}\n",[444,1065,1066,1070,1076,1088,1103,1118,1132,1177,1203,1207,1217],{"__ignoreMap":442},[447,1067,1068],{"class":449,"line":450},[447,1069,465],{"emptyLinePlaceholder":464},[447,1071,1072,1074],{"class":449,"line":461},[447,1073,949],{"class":457},[447,1075,952],{"class":453},[447,1077,1078,1080,1082,1085],{"class":449,"line":468},[447,1079,509],{"class":453},[447,1081,575],{"class":453},[447,1083,1084],{"class":515}," paint",[447,1086,1087],{"class":457},"(Graphics g, JComponent c) {\n",[447,1089,1090,1093,1095,1098,1101],{"class":449,"line":477},[447,1091,1092],{"class":457},"    Graphics2D g2d ",[447,1094,554],{"class":453},[447,1096,1097],{"class":457}," (Graphics2D) g.",[447,1099,1100],{"class":515},"create",[447,1102,797],{"class":457},[447,1104,1105,1108,1110,1113,1116],{"class":449,"line":485},[447,1106,1107],{"class":457},"    Icon icon ",[447,1109,554],{"class":453},[447,1111,1112],{"class":457}," ((JLabel) c).",[447,1114,1115],{"class":515},"getIcon",[447,1117,797],{"class":457},[447,1119,1120,1122,1125,1128,1130],{"class":449,"line":493},[447,1121,973],{"class":453},[447,1123,1124],{"class":457}," (icon ",[447,1126,1127],{"class":453},"!=",[447,1129,806],{"class":805},[447,1131,594],{"class":457},[447,1133,1134,1137,1140,1143,1146,1149,1152,1155,1158,1161,1164,1167,1170,1172,1174],{"class":449,"line":501},[447,1135,1136],{"class":457},"        icon.",[447,1138,1139],{"class":515},"paintIcon",[447,1141,1142],{"class":457},"(c, g2d, ((c.",[447,1144,1145],{"class":515},"getWidth",[447,1147,1148],{"class":457},"() ",[447,1150,1151],{"class":453},"-",[447,1153,1154],{"class":457}," icon.",[447,1156,1157],{"class":515},"getIconWidth",[447,1159,1160],{"class":457},"()) ",[447,1162,1163],{"class":453},"\u002F",[447,1165,1166],{"class":805}," 2",[447,1168,1169],{"class":457},") ",[447,1171,1151],{"class":453},[447,1173,1166],{"class":805},[447,1175,1176],{"class":457},",\n",[447,1178,1179,1182,1185,1187,1189,1191,1194,1196,1198,1201],{"class":449,"line":506},[447,1180,1181],{"class":457},"                c.",[447,1183,1184],{"class":515},"getHeight",[447,1186,1148],{"class":457},[447,1188,1151],{"class":453},[447,1190,1154],{"class":457},[447,1192,1193],{"class":515},"getIconHeight",[447,1195,1148],{"class":457},[447,1197,1151],{"class":453},[447,1199,1200],{"class":805}," 5",[447,1202,1003],{"class":457},[447,1204,1205],{"class":449,"line":522},[447,1206,644],{"class":457},[447,1208,1209,1212,1215],{"class":449,"line":527},[447,1210,1211],{"class":457},"    g2d.",[447,1213,1214],{"class":515},"dispose",[447,1216,797],{"class":457},[447,1218,1219],{"class":449,"line":563},[447,1220,826],{"class":457},[423,1222,1223,1224,1227,1228,1230,1231,1233],{},"Por su parte ya en la función ",[444,1225,1226],{},"paint"," lo que debemos hacer es cargar él ",[444,1229,1056],{}," y dibujarlo en la interfaz. Aunque\nde igual manera puedes crear un ",[444,1232,1056],{}," y dibujarlo en la interfaz.",[418,1235,1237],{"id":1236},"conclusión","Conclusión",[423,1239,1240],{},"Como puedes ver, Swing es un framework poderoso para crear interfaces de usuario, y con él puedes crear interfaces\natractivas y funcionales. Y mediante el uso de las Cachés y de las funciones adecuadas, puedes hacer uso de imágenes de\nmanera eficiente y rápida.",[1242,1243,1244],"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 .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 .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}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":442,"searchDepth":461,"depth":461,"links":1246},[1247,1248,1252,1253],{"id":420,"depth":461,"text":421},{"id":428,"depth":461,"text":429,"children":1249},[1250,1251],{"id":869,"depth":468,"text":861},{"id":883,"depth":468,"text":864},{"id":924,"depth":461,"text":925},{"id":1236,"depth":461,"text":1237},"En esta quinta entrega hablaremos de las caches y el uso de imágenes","md",null,{"editButton":42},{"title":313,"description":1254},"IGQn_tEtZ2nnTttrWUM6Kn4LMVVYVRb2BCX-0dcwJyk",[1261,1263],{"title":309,"path":310,"stem":311,"description":1262,"children":-1},"En esta cuarta parte de la serie sobre la creación de una interfaz de usuario para nuestro RPG, se profundiza en la implementación de características avanzadas y mejoras en la experiencia del usuario.",{"title":317,"path":318,"stem":319,"description":1264,"children":-1},"En esta quinta entrega hablaremos del uso de imágenes en Swing",1779479576304]