[{"data":1,"prerenderedAt":1030},["ShallowReactive",2],{"navigation_docs":3,"-archivos-ui-extends-component":412,"-archivos-ui-extends-component-surround":1025},[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":273,"body":414,"description":1019,"extension":1020,"links":1021,"meta":1022,"navigation":531,"path":274,"seo":1023,"stem":275,"__hash__":1024},"docs\u002F7.archivos-ui\u002F10.extends-component.md",{"type":415,"value":416,"toc":1012},"minimark",[417,422,426,430,433,481,485,963,976,979,983,1001,1005,1008],[418,419,421],"h2",{"id":420},"qué-es-la-extensión-de-clases-en-swing","¿Qué es la extensión de clases en Swing?",[423,424,425],"p",{},"La extensión de clases en Swing es una técnica que nos permite crear componentes personalizados al extender las clases existentes de Swing. Al extender una clase, podemos heredar sus propiedades y métodos, y luego agregar o modificar funcionalidades para adaptarlas a nuestras necesidades específicas. Esta técnica es especialmente útil cuando queremos crear componentes con comportamientos o apariencias únicas que no están disponibles en los componentes estándar de Swing.",[418,427,429],{"id":428},"cómo-extender-una-clase-en-swing","Cómo extender una clase en Swing",[423,431,432],{},"Para extender una clase en Swing, debemos seguir estos pasos:",[434,435,436,449,459,469,475],"ol",{},[437,438,439,443,444,448],"li",{},[440,441,442],"strong",{},"Seleccionar la clase base",": Primero, debemos seleccionar la clase de Swing que queremos extender. Por ejemplo, si queremos crear un botón personalizado, podríamos extender la clase ",[445,446,447],"code",{},"JButton",".",[437,450,451,454,455,458],{},[440,452,453],{},"Crear una nueva clase",": Luego, creamos una nueva clase que extienda de la clase base seleccionada. Esto se hace utilizando la palabra clave ",[445,456,457],{},"extends"," en la declaración de la clase.",[437,460,461,464,465,468],{},[440,462,463],{},"Sobrescribir métodos",": A continuación, podemos sobrescribir los métodos de la clase base para personalizar su comportamiento. Por ejemplo, podríamos sobrescribir el método ",[445,466,467],{},"paintComponent()"," para cambiar la apariencia del componente.",[437,470,471,474],{},[440,472,473],{},"Agregar nuevas funcionalidades",": Además de sobrescribir métodos, también podemos agregar nuevos métodos y propiedades a nuestra clase personalizada para proporcionar funcionalidades adicionales.",[437,476,477,480],{},[440,478,479],{},"Utilizar el componente personalizado",": Finalmente, podemos utilizar nuestra clase personalizada en lugar de la clase base en nuestra aplicación para aprovechar las funcionalidades y apariencias personalizadas que hemos creado.",[418,482,484],{"id":483},"ejemplo-de-extensión-de-clase-en-swing","Ejemplo de extensión de clase en Swing",[486,487,492],"pre",{"className":488,"code":489,"language":490,"meta":491,"style":491},"language-java shiki shiki-themes github-dark","import javax.swing.*;\nimport java.awt.*;\n\npublic class CustomButton extends JButton {\n    public CustomButton(String text) {\n        super(text);\n        \u002F\u002F Aquí puedes agregar cualquier inicialización adicional para tu botón personalizado\n        setForeground(Color.BLUE); \u002F\u002F Cambia el color del texto a azul\n        setBorder(BorderFactory.createLineBorder(Color.RED, 2)); \u002F\u002F Agrega un borde rojo alrededor del botón\n    }\n\n    @Override\n    protected void paintComponent(Graphics g) {\n        Graphics2D g2d = (Graphics2D) g;\n        \u002F\u002F Establecer antialiasing para mejorar la calidad del dibujo y del texto\n        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\n        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);\n        \u002F\u002F Dibujamos un borde redondeado para el botón\n        g2d.setColor(getBorder().getLineColor());\n        g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20);\n        \u002F\u002F Dibujamos el texto del botón centrado\n        FontMetrics fm = g2d.getFontMetrics();\n        int textWidth = fm.stringWidth(getText());\n        int textHeight = fm.getAscent();\n        int x = (getWidth() - textWidth) \u002F 2;\n        int y = (getHeight() + textHeight) \u002F 2 - fm.getDescent();\n        g2d.setColor(getForeground());\n        g2d.drawString(getText(), x, y);\n        \u002F\u002F Terminamos de dibujar el botón personalizado\n        g2d.dispose();\n    }\n}\n","java","",[445,493,494,514,526,533,555,573,582,589,601,625,631,636,645,665,677,683,695,705,711,734,775,781,798,822,839,871,907,921,936,942,952,957],{"__ignoreMap":491},[495,496,499,503,507,511],"span",{"class":497,"line":498},"line",1,[495,500,502],{"class":501},"snl16","import",[495,504,506],{"class":505},"s95oV"," javax.swing.",[495,508,510],{"class":509},"sDLfK","*",[495,512,513],{"class":505},";\n",[495,515,517,519,522,524],{"class":497,"line":516},2,[495,518,502],{"class":501},[495,520,521],{"class":505}," java.awt.",[495,523,510],{"class":509},[495,525,513],{"class":505},[495,527,529],{"class":497,"line":528},3,[495,530,532],{"emptyLinePlaceholder":531},true,"\n",[495,534,536,539,542,546,549,552],{"class":497,"line":535},4,[495,537,538],{"class":501},"public",[495,540,541],{"class":501}," class",[495,543,545],{"class":544},"svObZ"," CustomButton",[495,547,548],{"class":501}," extends",[495,550,551],{"class":544}," JButton",[495,553,554],{"class":505}," {\n",[495,556,558,561,563,566,570],{"class":497,"line":557},5,[495,559,560],{"class":501},"    public",[495,562,545],{"class":544},[495,564,565],{"class":505},"(String ",[495,567,569],{"class":568},"s9osk","text",[495,571,572],{"class":505},") {\n",[495,574,576,579],{"class":497,"line":575},6,[495,577,578],{"class":509},"        super",[495,580,581],{"class":505},"(text);\n",[495,583,585],{"class":497,"line":584},7,[495,586,588],{"class":587},"sAwPA","        \u002F\u002F Aquí puedes agregar cualquier inicialización adicional para tu botón personalizado\n",[495,590,592,595,598],{"class":497,"line":591},8,[495,593,594],{"class":544},"        setForeground",[495,596,597],{"class":505},"(Color.BLUE); ",[495,599,600],{"class":587},"\u002F\u002F Cambia el color del texto a azul\n",[495,602,604,607,610,613,616,619,622],{"class":497,"line":603},9,[495,605,606],{"class":544},"        setBorder",[495,608,609],{"class":505},"(BorderFactory.",[495,611,612],{"class":544},"createLineBorder",[495,614,615],{"class":505},"(Color.RED, ",[495,617,618],{"class":509},"2",[495,620,621],{"class":505},")); ",[495,623,624],{"class":587},"\u002F\u002F Agrega un borde rojo alrededor del botón\n",[495,626,628],{"class":497,"line":627},10,[495,629,630],{"class":505},"    }\n",[495,632,634],{"class":497,"line":633},11,[495,635,532],{"emptyLinePlaceholder":531},[495,637,639,642],{"class":497,"line":638},12,[495,640,641],{"class":505},"    @",[495,643,644],{"class":501},"Override\n",[495,646,648,651,654,657,660,663],{"class":497,"line":647},13,[495,649,650],{"class":501},"    protected",[495,652,653],{"class":501}," void",[495,655,656],{"class":544}," paintComponent",[495,658,659],{"class":505},"(Graphics ",[495,661,662],{"class":568},"g",[495,664,572],{"class":505},[495,666,668,671,674],{"class":497,"line":667},14,[495,669,670],{"class":505},"        Graphics2D g2d ",[495,672,673],{"class":501},"=",[495,675,676],{"class":505}," (Graphics2D) g;\n",[495,678,680],{"class":497,"line":679},15,[495,681,682],{"class":587},"        \u002F\u002F Establecer antialiasing para mejorar la calidad del dibujo y del texto\n",[495,684,686,689,692],{"class":497,"line":685},16,[495,687,688],{"class":505},"        g2d.",[495,690,691],{"class":544},"setRenderingHint",[495,693,694],{"class":505},"(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\n",[495,696,698,700,702],{"class":497,"line":697},17,[495,699,688],{"class":505},[495,701,691],{"class":544},[495,703,704],{"class":505},"(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);\n",[495,706,708],{"class":497,"line":707},18,[495,709,710],{"class":587},"        \u002F\u002F Dibujamos un borde redondeado para el botón\n",[495,712,714,716,719,722,725,728,731],{"class":497,"line":713},19,[495,715,688],{"class":505},[495,717,718],{"class":544},"setColor",[495,720,721],{"class":505},"(",[495,723,724],{"class":544},"getBorder",[495,726,727],{"class":505},"().",[495,729,730],{"class":544},"getLineColor",[495,732,733],{"class":505},"());\n",[495,735,737,739,742,744,747,750,752,754,757,760,763,765,768,770,772],{"class":497,"line":736},20,[495,738,688],{"class":505},[495,740,741],{"class":544},"fillRoundRect",[495,743,721],{"class":505},[495,745,746],{"class":509},"0",[495,748,749],{"class":505},", ",[495,751,746],{"class":509},[495,753,749],{"class":505},[495,755,756],{"class":544},"getWidth",[495,758,759],{"class":505},"(), ",[495,761,762],{"class":544},"getHeight",[495,764,759],{"class":505},[495,766,767],{"class":509},"20",[495,769,749],{"class":505},[495,771,767],{"class":509},[495,773,774],{"class":505},");\n",[495,776,778],{"class":497,"line":777},21,[495,779,780],{"class":587},"        \u002F\u002F Dibujamos el texto del botón centrado\n",[495,782,784,787,789,792,795],{"class":497,"line":783},22,[495,785,786],{"class":505},"        FontMetrics fm ",[495,788,673],{"class":501},[495,790,791],{"class":505}," g2d.",[495,793,794],{"class":544},"getFontMetrics",[495,796,797],{"class":505},"();\n",[495,799,801,804,807,809,812,815,817,820],{"class":497,"line":800},23,[495,802,803],{"class":501},"        int",[495,805,806],{"class":505}," textWidth ",[495,808,673],{"class":501},[495,810,811],{"class":505}," fm.",[495,813,814],{"class":544},"stringWidth",[495,816,721],{"class":505},[495,818,819],{"class":544},"getText",[495,821,733],{"class":505},[495,823,825,827,830,832,834,837],{"class":497,"line":824},24,[495,826,803],{"class":501},[495,828,829],{"class":505}," textHeight ",[495,831,673],{"class":501},[495,833,811],{"class":505},[495,835,836],{"class":544},"getAscent",[495,838,797],{"class":505},[495,840,842,844,847,849,852,854,857,860,863,866,869],{"class":497,"line":841},25,[495,843,803],{"class":501},[495,845,846],{"class":505}," x ",[495,848,673],{"class":501},[495,850,851],{"class":505}," (",[495,853,756],{"class":544},[495,855,856],{"class":505},"() ",[495,858,859],{"class":501},"-",[495,861,862],{"class":505}," textWidth) ",[495,864,865],{"class":501},"\u002F",[495,867,868],{"class":509}," 2",[495,870,513],{"class":505},[495,872,874,876,879,881,883,885,887,890,893,895,897,900,902,905],{"class":497,"line":873},26,[495,875,803],{"class":501},[495,877,878],{"class":505}," y ",[495,880,673],{"class":501},[495,882,851],{"class":505},[495,884,762],{"class":544},[495,886,856],{"class":505},[495,888,889],{"class":501},"+",[495,891,892],{"class":505}," textHeight) ",[495,894,865],{"class":501},[495,896,868],{"class":509},[495,898,899],{"class":501}," -",[495,901,811],{"class":505},[495,903,904],{"class":544},"getDescent",[495,906,797],{"class":505},[495,908,910,912,914,916,919],{"class":497,"line":909},27,[495,911,688],{"class":505},[495,913,718],{"class":544},[495,915,721],{"class":505},[495,917,918],{"class":544},"getForeground",[495,920,733],{"class":505},[495,922,924,926,929,931,933],{"class":497,"line":923},28,[495,925,688],{"class":505},[495,927,928],{"class":544},"drawString",[495,930,721],{"class":505},[495,932,819],{"class":544},[495,934,935],{"class":505},"(), x, y);\n",[495,937,939],{"class":497,"line":938},29,[495,940,941],{"class":587},"        \u002F\u002F Terminamos de dibujar el botón personalizado\n",[495,943,945,947,950],{"class":497,"line":944},30,[495,946,688],{"class":505},[495,948,949],{"class":544},"dispose",[495,951,797],{"class":505},[495,953,955],{"class":497,"line":954},31,[495,956,630],{"class":505},[495,958,960],{"class":497,"line":959},32,[495,961,962],{"class":505},"}\n",[423,964,965,966,969,970,972,973,975],{},"En este ejemplo, hemos creado una clase ",[445,967,968],{},"CustomButton"," que extiende de ",[445,971,447],{},". En el constructor, hemos personalizado el color del texto y el borde del botón. Además, hemos sobrescrito el método ",[445,974,467],{}," para dibujar un botón con bordes redondeados y texto centrado. Al utilizar esta clase en nuestra aplicación, podremos tener un botón con una apariencia personalizada que se adapte a nuestras necesidades específicas y que ofrezca una experiencia de usuario única.",[423,977,978],{},"La extensión de clases es una poderosa técnica en Swing que nos permite crear componentes personalizados con funcionalidades y apariencias únicas, lo que puede mejorar significativamente la calidad y la usabilidad de nuestras aplicaciones gráficas.",[418,980,982],{"id":981},"para-analizar","Para analizar",[984,985,986,989,992,995,998],"ul",{},[437,987,988],{},"La extensión de clases en Swing es una técnica que nos permite crear componentes personalizados al extender las clases existentes de Swing.",[437,990,991],{},"Al extender una clase, podemos heredar sus propiedades y métodos, y luego agregar o modificar funcionalidades para adaptarlas a nuestras necesidades específicas.",[437,993,994],{},"Para extender una clase en Swing, debemos seleccionar la clase base, crear una nueva clase que extienda de la clase base, sobrescribir métodos para personalizar el comportamiento, agregar nuevas funcionalidades y utilizar el componente personalizado en nuestra aplicación.",[437,996,997],{},"La extensión de clases es especialmente útil cuando queremos crear componentes con comportamientos o apariencias únicas que no están disponibles en los componentes estándar de Swing.",[437,999,1000],{},"Recuerda consultar la documentación oficial de Swing para obtener más información sobre las clases y métodos disponibles, así como para explorar ejemplos adicionales de cómo extender clases en Swing para crear componentes personalizados.",[418,1002,1004],{"id":1003},"conclusión","Conclusión",[423,1006,1007],{},"En este apartado hemos aprendido sobre la extensión de clases en Swing y cómo utilizar esta técnica para crear componentes personalizados con funcionalidades y apariencias únicas. Al extender una clase de Swing, podemos heredar sus propiedades y métodos, y luego personalizar su comportamiento y apariencia para adaptarlos a nuestras necesidades específicas. La extensión de clases es una herramienta poderosa que nos permite crear interfaces gráficas más atractivas y funcionales, mejorando así la experiencia del usuario en nuestras aplicaciones. En los siguientes apartados, exploraremos más técnicas y componentes para seguir mejorando nuestras interfaces gráficas en Java con Swing.",[1009,1010,1011],"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 .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":491,"searchDepth":516,"depth":516,"links":1013},[1014,1015,1016,1017,1018],{"id":420,"depth":516,"text":421},{"id":428,"depth":516,"text":429},{"id":483,"depth":516,"text":484},{"id":981,"depth":516,"text":982},{"id":1003,"depth":516,"text":1004},"En este apartado aprenderemos a personalizar componentes en Swing mediante la extensión de clases, lo que nos permitirá crear componentes personalizados con funcionalidades y apariencias únicas.","md",null,{"editButton":42},{"title":273,"description":1019},"nWPijd589jntNbThZ-MnRU1pgKuJFoL6pl0EebAVE8k",[1026,1028],{"title":269,"path":270,"stem":271,"description":1027,"children":-1},"En este apartado aprenderemos a manejar eventos en Swing, lo que nos permitirá responder a las acciones del usuario, como clics de botones, movimientos del mouse, teclas presionadas, entre otros.",{"title":277,"path":278,"stem":279,"description":1029,"children":-1},"Cómo usar gradientes en Swing para mejorar la apariencia de tus interfaces.",1779479574980]