[{"data":1,"prerenderedAt":3595},["ShallowReactive",2],{"navigation_docs":3,"-ejemplos-ejemplo-04":298,"-ejemplos-ejemplo-04-surround":3590},[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":230,"body":300,"description":3584,"extension":3585,"links":3586,"meta":3587,"navigation":617,"path":231,"seo":3588,"stem":232,"__hash__":3589},"docs\u002F7.ejemplos\u002F04.ejemplo-04.md",{"type":301,"value":302,"toc":3580},"minimark",[303,307,310,555,562,1295,1298,1339,1350,1355,1362,2290,2293,2327,2331,2348,2353,2871,2877,2916,2922,3529,3534,3573,3576],[304,305,306],"p",{},"En este ejemplo, se muestra cómo estilizar componentes Swing utilizando delegadores para personalizar su apariencia. Los delegadores permiten separar la lógica de presentación de la lógica de negocio, lo que facilita la personalización de los componentes sin afectar su funcionalidad.",[304,308,309],{},"Asumiremos la siguiente paleta de colores para nuestro tema:",[311,312,317],"pre",{"className":313,"code":314,"language":315,"meta":316,"style":316},"language-java shiki shiki-themes github-dark","public class MyPalette {\n    public static final Color PRIMARY_COLOR = new Color(0x2B97ED);\n    public static final Color PRIMARY_HOVER_COLOR = new Color(0x2581C9);\n    public static final Color PRIMARY_ACTIVE_COLOR = new Color(0x1665A5);\n    public static final Color PRIMARY_DISABLED_COLOR = new Color(0xCCCCCC);\n    public static final Color BACKGROUND_COLOR = new Color(0xF3F4F6);\n    public static final Color ERROR_COLOR = new Color(0xE74C3C);\n    public static final Color SUCCESS_COLOR = new Color(0x27AE60);\n    public static final Color WARNING_COLOR = new Color(0xF39C12);\n}\n","java","",[318,319,320,340,374,399,424,449,474,499,524,549],"code",{"__ignoreMap":316},[321,322,325,329,332,336],"span",{"class":323,"line":324},"line",1,[321,326,328],{"class":327},"snl16","public",[321,330,331],{"class":327}," class",[321,333,335],{"class":334},"svObZ"," MyPalette",[321,337,339],{"class":338},"s95oV"," {\n",[321,341,343,346,349,352,355,358,361,364,367,371],{"class":323,"line":342},2,[321,344,345],{"class":327},"    public",[321,347,348],{"class":327}," static",[321,350,351],{"class":327}," final",[321,353,354],{"class":338}," Color PRIMARY_COLOR ",[321,356,357],{"class":327},"=",[321,359,360],{"class":327}," new",[321,362,363],{"class":334}," Color",[321,365,366],{"class":338},"(",[321,368,370],{"class":369},"sDLfK","0x2B97ED",[321,372,373],{"class":338},");\n",[321,375,377,379,381,383,386,388,390,392,394,397],{"class":323,"line":376},3,[321,378,345],{"class":327},[321,380,348],{"class":327},[321,382,351],{"class":327},[321,384,385],{"class":338}," Color PRIMARY_HOVER_COLOR ",[321,387,357],{"class":327},[321,389,360],{"class":327},[321,391,363],{"class":334},[321,393,366],{"class":338},[321,395,396],{"class":369},"0x2581C9",[321,398,373],{"class":338},[321,400,402,404,406,408,411,413,415,417,419,422],{"class":323,"line":401},4,[321,403,345],{"class":327},[321,405,348],{"class":327},[321,407,351],{"class":327},[321,409,410],{"class":338}," Color PRIMARY_ACTIVE_COLOR ",[321,412,357],{"class":327},[321,414,360],{"class":327},[321,416,363],{"class":334},[321,418,366],{"class":338},[321,420,421],{"class":369},"0x1665A5",[321,423,373],{"class":338},[321,425,427,429,431,433,436,438,440,442,444,447],{"class":323,"line":426},5,[321,428,345],{"class":327},[321,430,348],{"class":327},[321,432,351],{"class":327},[321,434,435],{"class":338}," Color PRIMARY_DISABLED_COLOR ",[321,437,357],{"class":327},[321,439,360],{"class":327},[321,441,363],{"class":334},[321,443,366],{"class":338},[321,445,446],{"class":369},"0xCCCCCC",[321,448,373],{"class":338},[321,450,452,454,456,458,461,463,465,467,469,472],{"class":323,"line":451},6,[321,453,345],{"class":327},[321,455,348],{"class":327},[321,457,351],{"class":327},[321,459,460],{"class":338}," Color BACKGROUND_COLOR ",[321,462,357],{"class":327},[321,464,360],{"class":327},[321,466,363],{"class":334},[321,468,366],{"class":338},[321,470,471],{"class":369},"0xF3F4F6",[321,473,373],{"class":338},[321,475,477,479,481,483,486,488,490,492,494,497],{"class":323,"line":476},7,[321,478,345],{"class":327},[321,480,348],{"class":327},[321,482,351],{"class":327},[321,484,485],{"class":338}," Color ERROR_COLOR ",[321,487,357],{"class":327},[321,489,360],{"class":327},[321,491,363],{"class":334},[321,493,366],{"class":338},[321,495,496],{"class":369},"0xE74C3C",[321,498,373],{"class":338},[321,500,502,504,506,508,511,513,515,517,519,522],{"class":323,"line":501},8,[321,503,345],{"class":327},[321,505,348],{"class":327},[321,507,351],{"class":327},[321,509,510],{"class":338}," Color SUCCESS_COLOR ",[321,512,357],{"class":327},[321,514,360],{"class":327},[321,516,363],{"class":334},[321,518,366],{"class":338},[321,520,521],{"class":369},"0x27AE60",[321,523,373],{"class":338},[321,525,527,529,531,533,536,538,540,542,544,547],{"class":323,"line":526},9,[321,528,345],{"class":327},[321,530,348],{"class":327},[321,532,351],{"class":327},[321,534,535],{"class":338}," Color WARNING_COLOR ",[321,537,357],{"class":327},[321,539,360],{"class":327},[321,541,363],{"class":334},[321,543,366],{"class":338},[321,545,546],{"class":369},"0xF39C12",[321,548,373],{"class":338},[321,550,552],{"class":323,"line":551},10,[321,553,554],{"class":338},"}\n",[304,556,557,558,561],{},"A continuación, se muestra cómo crear un delegador para estilizar un botón personalizado derivado de ",[318,559,560],{},"BasicButtonUI",":",[311,563,565],{"className":313,"code":564,"language":315,"meta":316,"style":316},"import javax.swing.*;\nimport javax.swing.plaf.basic.BasicButtonUI;\nimport java.awt.*;\nimport java.awt.event.MouseAdapter;\nimport java.awt.event.MouseEvent;\n\npublic class MyButtonUI extends BasicButtonUI {\n    private Color backgroundColor = MyPalette.PRIMARY_COLOR;\n    private Color hoverColor = MyPalette.PRIMARY_HOVER_COLOR;\n    private Color activeColor = MyPalette.PRIMARY_ACTIVE_COLOR;\n    private Color disabledColor = MyPalette.PRIMARY_DISABLED_COLOR;\n\n    @Override\n    public void installUI(JComponent c) {\n        super.installUI(c);\n        c.setOpaque(false);\n        c.setBackground(backgroundColor);\n        c.setForeground(Color.WHITE);\n        c.setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 20));\n        c.addMouseListener(new MouseAdapter() {\n            @Override\n            public void mouseEntered(MouseEvent e) {\n                if (c.isEnabled()) {\n                    c.setBackground(hoverColor);\n                }\n            }\n\n            @Override\n            public void mouseExited(MouseEvent e) {\n                if (c.isEnabled()) {\n                    c.setBackground(backgroundColor);\n                }\n            }\n\n            @Override\n            public void mousePressed(MouseEvent e) {\n                if (c.isEnabled()) {\n                    c.setBackground(activeColor);\n                }\n            }\n\n            @Override\n            public void mouseReleased(MouseEvent e) {\n                if (c.isEnabled()) {\n                    c.setBackground(hoverColor);\n                }\n            }\n        });\n    }\n\n    @Override\n    public void uninstallUI(JComponent c) {\n        super.uninstallUI(c);\n        c.removeMouseListener(c.getMouseListeners()[0]);\n    }\n\n    @Override\n    public void paint(Graphics g, JComponent c) {\n        Graphics2D g2d = (Graphics2D) g;\n        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\n        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);\n        g2d.setColor(c.getBackground());\n        g2d.fillRoundRect(0, 0, c.getWidth(), c.getHeight(), 20, 20);\n        super.paint(g, c);\n    }\n}\n",[318,566,567,581,588,599,606,613,619,636,649,661,673,686,691,700,721,736,752,763,774,810,829,837,856,871,882,888,894,899,906,922,933,942,947,952,957,964,980,991,1001,1006,1011,1016,1023,1039,1050,1059,1064,1069,1075,1081,1086,1093,1109,1121,1144,1149,1154,1161,1184,1195,1207,1217,1233,1272,1285,1290],{"__ignoreMap":316},[321,568,569,572,575,578],{"class":323,"line":324},[321,570,571],{"class":327},"import",[321,573,574],{"class":338}," javax.swing.",[321,576,577],{"class":369},"*",[321,579,580],{"class":338},";\n",[321,582,583,585],{"class":323,"line":342},[321,584,571],{"class":327},[321,586,587],{"class":338}," javax.swing.plaf.basic.BasicButtonUI;\n",[321,589,590,592,595,597],{"class":323,"line":376},[321,591,571],{"class":327},[321,593,594],{"class":338}," java.awt.",[321,596,577],{"class":369},[321,598,580],{"class":338},[321,600,601,603],{"class":323,"line":401},[321,602,571],{"class":327},[321,604,605],{"class":338}," java.awt.event.MouseAdapter;\n",[321,607,608,610],{"class":323,"line":426},[321,609,571],{"class":327},[321,611,612],{"class":338}," java.awt.event.MouseEvent;\n",[321,614,615],{"class":323,"line":451},[321,616,618],{"emptyLinePlaceholder":617},true,"\n",[321,620,621,623,625,628,631,634],{"class":323,"line":476},[321,622,328],{"class":327},[321,624,331],{"class":327},[321,626,627],{"class":334}," MyButtonUI",[321,629,630],{"class":327}," extends",[321,632,633],{"class":334}," BasicButtonUI",[321,635,339],{"class":338},[321,637,638,641,644,646],{"class":323,"line":501},[321,639,640],{"class":327},"    private",[321,642,643],{"class":338}," Color backgroundColor ",[321,645,357],{"class":327},[321,647,648],{"class":338}," MyPalette.PRIMARY_COLOR;\n",[321,650,651,653,656,658],{"class":323,"line":526},[321,652,640],{"class":327},[321,654,655],{"class":338}," Color hoverColor ",[321,657,357],{"class":327},[321,659,660],{"class":338}," MyPalette.PRIMARY_HOVER_COLOR;\n",[321,662,663,665,668,670],{"class":323,"line":551},[321,664,640],{"class":327},[321,666,667],{"class":338}," Color activeColor ",[321,669,357],{"class":327},[321,671,672],{"class":338}," MyPalette.PRIMARY_ACTIVE_COLOR;\n",[321,674,676,678,681,683],{"class":323,"line":675},11,[321,677,640],{"class":327},[321,679,680],{"class":338}," Color disabledColor ",[321,682,357],{"class":327},[321,684,685],{"class":338}," MyPalette.PRIMARY_DISABLED_COLOR;\n",[321,687,689],{"class":323,"line":688},12,[321,690,618],{"emptyLinePlaceholder":617},[321,692,694,697],{"class":323,"line":693},13,[321,695,696],{"class":338},"    @",[321,698,699],{"class":327},"Override\n",[321,701,703,705,708,711,714,718],{"class":323,"line":702},14,[321,704,345],{"class":327},[321,706,707],{"class":327}," void",[321,709,710],{"class":334}," installUI",[321,712,713],{"class":338},"(JComponent ",[321,715,717],{"class":716},"s9osk","c",[321,719,720],{"class":338},") {\n",[321,722,724,727,730,733],{"class":323,"line":723},15,[321,725,726],{"class":369},"        super",[321,728,729],{"class":338},".",[321,731,732],{"class":334},"installUI",[321,734,735],{"class":338},"(c);\n",[321,737,739,742,745,747,750],{"class":323,"line":738},16,[321,740,741],{"class":338},"        c.",[321,743,744],{"class":334},"setOpaque",[321,746,366],{"class":338},[321,748,749],{"class":369},"false",[321,751,373],{"class":338},[321,753,755,757,760],{"class":323,"line":754},17,[321,756,741],{"class":338},[321,758,759],{"class":334},"setBackground",[321,761,762],{"class":338},"(backgroundColor);\n",[321,764,766,768,771],{"class":323,"line":765},18,[321,767,741],{"class":338},[321,769,770],{"class":334},"setForeground",[321,772,773],{"class":338},"(Color.WHITE);\n",[321,775,777,779,782,785,788,790,793,796,799,801,803,805,807],{"class":323,"line":776},19,[321,778,741],{"class":338},[321,780,781],{"class":334},"setBorder",[321,783,784],{"class":338},"(BorderFactory.",[321,786,787],{"class":334},"createEmptyBorder",[321,789,366],{"class":338},[321,791,792],{"class":369},"10",[321,794,795],{"class":338},", ",[321,797,798],{"class":369},"20",[321,800,795],{"class":338},[321,802,792],{"class":369},[321,804,795],{"class":338},[321,806,798],{"class":369},[321,808,809],{"class":338},"));\n",[321,811,813,815,818,820,823,826],{"class":323,"line":812},20,[321,814,741],{"class":338},[321,816,817],{"class":334},"addMouseListener",[321,819,366],{"class":338},[321,821,822],{"class":327},"new",[321,824,825],{"class":334}," MouseAdapter",[321,827,828],{"class":338},"() {\n",[321,830,832,835],{"class":323,"line":831},21,[321,833,834],{"class":338},"            @",[321,836,699],{"class":327},[321,838,840,843,845,848,851,854],{"class":323,"line":839},22,[321,841,842],{"class":327},"            public",[321,844,707],{"class":327},[321,846,847],{"class":334}," mouseEntered",[321,849,850],{"class":338},"(MouseEvent ",[321,852,853],{"class":716},"e",[321,855,720],{"class":338},[321,857,859,862,865,868],{"class":323,"line":858},23,[321,860,861],{"class":327},"                if",[321,863,864],{"class":338}," (c.",[321,866,867],{"class":334},"isEnabled",[321,869,870],{"class":338},"()) {\n",[321,872,874,877,879],{"class":323,"line":873},24,[321,875,876],{"class":338},"                    c.",[321,878,759],{"class":334},[321,880,881],{"class":338},"(hoverColor);\n",[321,883,885],{"class":323,"line":884},25,[321,886,887],{"class":338},"                }\n",[321,889,891],{"class":323,"line":890},26,[321,892,893],{"class":338},"            }\n",[321,895,897],{"class":323,"line":896},27,[321,898,618],{"emptyLinePlaceholder":617},[321,900,902,904],{"class":323,"line":901},28,[321,903,834],{"class":338},[321,905,699],{"class":327},[321,907,909,911,913,916,918,920],{"class":323,"line":908},29,[321,910,842],{"class":327},[321,912,707],{"class":327},[321,914,915],{"class":334}," mouseExited",[321,917,850],{"class":338},[321,919,853],{"class":716},[321,921,720],{"class":338},[321,923,925,927,929,931],{"class":323,"line":924},30,[321,926,861],{"class":327},[321,928,864],{"class":338},[321,930,867],{"class":334},[321,932,870],{"class":338},[321,934,936,938,940],{"class":323,"line":935},31,[321,937,876],{"class":338},[321,939,759],{"class":334},[321,941,762],{"class":338},[321,943,945],{"class":323,"line":944},32,[321,946,887],{"class":338},[321,948,950],{"class":323,"line":949},33,[321,951,893],{"class":338},[321,953,955],{"class":323,"line":954},34,[321,956,618],{"emptyLinePlaceholder":617},[321,958,960,962],{"class":323,"line":959},35,[321,961,834],{"class":338},[321,963,699],{"class":327},[321,965,967,969,971,974,976,978],{"class":323,"line":966},36,[321,968,842],{"class":327},[321,970,707],{"class":327},[321,972,973],{"class":334}," mousePressed",[321,975,850],{"class":338},[321,977,853],{"class":716},[321,979,720],{"class":338},[321,981,983,985,987,989],{"class":323,"line":982},37,[321,984,861],{"class":327},[321,986,864],{"class":338},[321,988,867],{"class":334},[321,990,870],{"class":338},[321,992,994,996,998],{"class":323,"line":993},38,[321,995,876],{"class":338},[321,997,759],{"class":334},[321,999,1000],{"class":338},"(activeColor);\n",[321,1002,1004],{"class":323,"line":1003},39,[321,1005,887],{"class":338},[321,1007,1009],{"class":323,"line":1008},40,[321,1010,893],{"class":338},[321,1012,1014],{"class":323,"line":1013},41,[321,1015,618],{"emptyLinePlaceholder":617},[321,1017,1019,1021],{"class":323,"line":1018},42,[321,1020,834],{"class":338},[321,1022,699],{"class":327},[321,1024,1026,1028,1030,1033,1035,1037],{"class":323,"line":1025},43,[321,1027,842],{"class":327},[321,1029,707],{"class":327},[321,1031,1032],{"class":334}," mouseReleased",[321,1034,850],{"class":338},[321,1036,853],{"class":716},[321,1038,720],{"class":338},[321,1040,1042,1044,1046,1048],{"class":323,"line":1041},44,[321,1043,861],{"class":327},[321,1045,864],{"class":338},[321,1047,867],{"class":334},[321,1049,870],{"class":338},[321,1051,1053,1055,1057],{"class":323,"line":1052},45,[321,1054,876],{"class":338},[321,1056,759],{"class":334},[321,1058,881],{"class":338},[321,1060,1062],{"class":323,"line":1061},46,[321,1063,887],{"class":338},[321,1065,1067],{"class":323,"line":1066},47,[321,1068,893],{"class":338},[321,1070,1072],{"class":323,"line":1071},48,[321,1073,1074],{"class":338},"        });\n",[321,1076,1078],{"class":323,"line":1077},49,[321,1079,1080],{"class":338},"    }\n",[321,1082,1084],{"class":323,"line":1083},50,[321,1085,618],{"emptyLinePlaceholder":617},[321,1087,1089,1091],{"class":323,"line":1088},51,[321,1090,696],{"class":338},[321,1092,699],{"class":327},[321,1094,1096,1098,1100,1103,1105,1107],{"class":323,"line":1095},52,[321,1097,345],{"class":327},[321,1099,707],{"class":327},[321,1101,1102],{"class":334}," uninstallUI",[321,1104,713],{"class":338},[321,1106,717],{"class":716},[321,1108,720],{"class":338},[321,1110,1112,1114,1116,1119],{"class":323,"line":1111},53,[321,1113,726],{"class":369},[321,1115,729],{"class":338},[321,1117,1118],{"class":334},"uninstallUI",[321,1120,735],{"class":338},[321,1122,1124,1126,1129,1132,1135,1138,1141],{"class":323,"line":1123},54,[321,1125,741],{"class":338},[321,1127,1128],{"class":334},"removeMouseListener",[321,1130,1131],{"class":338},"(c.",[321,1133,1134],{"class":334},"getMouseListeners",[321,1136,1137],{"class":338},"()[",[321,1139,1140],{"class":369},"0",[321,1142,1143],{"class":338},"]);\n",[321,1145,1147],{"class":323,"line":1146},55,[321,1148,1080],{"class":338},[321,1150,1152],{"class":323,"line":1151},56,[321,1153,618],{"emptyLinePlaceholder":617},[321,1155,1157,1159],{"class":323,"line":1156},57,[321,1158,696],{"class":338},[321,1160,699],{"class":327},[321,1162,1164,1166,1168,1171,1174,1177,1180,1182],{"class":323,"line":1163},58,[321,1165,345],{"class":327},[321,1167,707],{"class":327},[321,1169,1170],{"class":334}," paint",[321,1172,1173],{"class":338},"(Graphics ",[321,1175,1176],{"class":716},"g",[321,1178,1179],{"class":338},", JComponent ",[321,1181,717],{"class":716},[321,1183,720],{"class":338},[321,1185,1187,1190,1192],{"class":323,"line":1186},59,[321,1188,1189],{"class":338},"        Graphics2D g2d ",[321,1191,357],{"class":327},[321,1193,1194],{"class":338}," (Graphics2D) g;\n",[321,1196,1198,1201,1204],{"class":323,"line":1197},60,[321,1199,1200],{"class":338},"        g2d.",[321,1202,1203],{"class":334},"setRenderingHint",[321,1205,1206],{"class":338},"(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\n",[321,1208,1210,1212,1214],{"class":323,"line":1209},61,[321,1211,1200],{"class":338},[321,1213,1203],{"class":334},[321,1215,1216],{"class":338},"(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);\n",[321,1218,1220,1222,1225,1227,1230],{"class":323,"line":1219},62,[321,1221,1200],{"class":338},[321,1223,1224],{"class":334},"setColor",[321,1226,1131],{"class":338},[321,1228,1229],{"class":334},"getBackground",[321,1231,1232],{"class":338},"());\n",[321,1234,1236,1238,1241,1243,1245,1247,1249,1252,1255,1258,1261,1264,1266,1268,1270],{"class":323,"line":1235},63,[321,1237,1200],{"class":338},[321,1239,1240],{"class":334},"fillRoundRect",[321,1242,366],{"class":338},[321,1244,1140],{"class":369},[321,1246,795],{"class":338},[321,1248,1140],{"class":369},[321,1250,1251],{"class":338},", c.",[321,1253,1254],{"class":334},"getWidth",[321,1256,1257],{"class":338},"(), c.",[321,1259,1260],{"class":334},"getHeight",[321,1262,1263],{"class":338},"(), ",[321,1265,798],{"class":369},[321,1267,795],{"class":338},[321,1269,798],{"class":369},[321,1271,373],{"class":338},[321,1273,1275,1277,1279,1282],{"class":323,"line":1274},64,[321,1276,726],{"class":369},[321,1278,729],{"class":338},[321,1280,1281],{"class":334},"paint",[321,1283,1284],{"class":338},"(g, c);\n",[321,1286,1288],{"class":323,"line":1287},65,[321,1289,1080],{"class":338},[321,1291,1293],{"class":323,"line":1292},66,[321,1294,554],{"class":338},[304,1296,1297],{},"Con este delegador, hemos personalizado la apariencia de un botón para que tenga un fondo redondeado y cambie de color en diferentes estados (normal, hover, activo, deshabilitado). Para usar este delegador en un botón, simplemente asignamos la UI personalizada al botón:",[311,1299,1301],{"className":313,"code":1300,"language":315,"meta":316,"style":316},"JButton myButton = new JButton(\"Click Me\");\nmyButton.setUI(new MyButtonUI());\n",[318,1302,1303,1323],{"__ignoreMap":316},[321,1304,1305,1308,1310,1312,1315,1317,1321],{"class":323,"line":324},[321,1306,1307],{"class":338},"JButton myButton ",[321,1309,357],{"class":327},[321,1311,360],{"class":327},[321,1313,1314],{"class":334}," JButton",[321,1316,366],{"class":338},[321,1318,1320],{"class":1319},"sU2Wk","\"Click Me\"",[321,1322,373],{"class":338},[321,1324,1325,1328,1331,1333,1335,1337],{"class":323,"line":342},[321,1326,1327],{"class":338},"myButton.",[321,1329,1330],{"class":334},"setUI",[321,1332,366],{"class":338},[321,1334,822],{"class":327},[321,1336,627],{"class":334},[321,1338,1232],{"class":338},[304,1340,1341,1342,1345,1346,1349],{},"Ahora, el botón ",[318,1343,1344],{},"myButton"," tendrá la apariencia personalizada definida en ",[318,1347,1348],{},"MyButtonUI",", utilizando los colores de la paleta que hemos establecido.",[1351,1352,1354],"h2",{"id":1353},"estilizando-campos-de-texto","Estilizando campos de texto",[304,1356,1357,1358,1361],{},"Ahora veamos como estilizar un ",[318,1359,1360],{},"TextField"," utilizando un delegador similar para que el campo tenga automáticamente una etiqueta flotante y un borde redondeado que cambie de color según el estado del campo (normal, enfocado, error).",[311,1363,1365],{"className":313,"code":1364,"language":315,"meta":316,"style":316},"import javax.swing.*;\nimport javax.swing.plaf.basic.BasicTextFieldUI;\nimport java.awt.*;\nimport java.awt.event.FocusAdapter;\nimport java.awt.event.FocusEvent;\n\npublic class MyTextFieldUI extends BasicTextFieldUI {\n\n    private String labelText;\n    private String placeholderText;\n    private Color backgroundColor = MyPalette.BACKGROUND_COLOR;\n    private Color borderColor = MyPalette.PRIMARY_COLOR;\n    private Color focusBorderColor = MyPalette.PRIMARY_HOVER_COLOR;\n    private Color errorBorderColor = MyPalette.ERROR_COLOR;\n\n    public MyTextFieldUI(String labelText, String placeholderText) {\n        this.labelText = labelText;\n        this.placeholderText = placeholderText;\n    }\n\n    @Override\n    public void installUI(JComponent c) {\n        super.installUI(c);\n        c.setOpaque(false);\n        c.setBackground(backgroundColor);\n        c.setForeground(Color.LIGHT_GRAY);\n        c.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));\n        c.setBackground(null);\n        c.setForeground(Color.BLACK);\n        c.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));\n        \u002F\u002F Agregamos un margen adicional para la etiqueta\n        c.setBorder(BorderFactory.createCompoundBorder(c.getBorder(),\n                BorderFactory.createEmptyBorder(20, 0, 0, 0)));\n        \u002F\u002F Agregamos un listener para cambiar el borde al enfocar o perder el enfoque\n        c.addFocusListener(new FocusAdapter() {\n            @Override\n            public void focusGained(FocusEvent e) {\n                c.setBorder(BorderFactory.createCompoundBorder(\n                        BorderFactory.createLineBorder(focusBorderColor, 2),\n                        BorderFactory.createEmptyBorder(20, 0, 0, 0)));\n            }\n\n            @Override\n            public void focusLost(FocusEvent e) {\n                c.setBorder(BorderFactory.createCompoundBorder(\n                        BorderFactory.createLineBorder(borderColor, 1),\n                        BorderFactory.createEmptyBorder(20, 0, 0, 0)));\n            }\n        });\n    }\n\n    @Override\n    public void uninstallUI(JComponent c) {\n        super.uninstallUI(c);\n        c.removeFocusListener(c.getFocusListeners()[0]);\n    }\n\n    @Override\n    public void paintBackground(Graphics g, JComponent c) {\n        Graphics2D g2d = (Graphics2D) g;\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 en primer lugar la etiqueta sobre el borde del campo de texto\n        g2d.setColor(MyThemeColors.PRIMARY_COLOR);\n        FontMetrics fm = g2d.getFontMetrics();\n        int labelHeight = fm.getAscent();\n        int labelY = labelHeight + 5; \u002F\u002F Posición de la etiqueta sobre el borde\n        g2d.drawString(outlineLabel, 5, labelY);\n        \u002F\u002F Luego dibujamos el fondo del campo de texto\n        g2d.translate(0, labelHeight + 5); \u002F\u002F Movemos el origen para dibujar el fondo debajo de la etiqueta\n        g2d.setColor(c.getBackground());\n        g2d.fillRoundRect(0, 0, c.getWidth(), c.getHeight() - labelHeight - 5, 10, 10);\n        \u002F\u002F Luego dibujamos un borde redondeado para envolver el campo de texto, asegurándonos de que la etiqueta quede por encima del borde\n        g2d.setColor(MyThemeColors.PRIMARY_COLOR);\n        g2d.setStroke(new BasicStroke(2));\n        g2d.drawRoundRect(0, 0, c.getWidth(), c.getHeight() - labelHeight - 5, 10, 10);\n    }\n}\n",[318,1366,1367,1377,1384,1394,1401,1408,1412,1428,1432,1439,1446,1457,1468,1479,1491,1495,1515,1528,1540,1544,1548,1554,1568,1578,1590,1598,1607,1635,1648,1657,1673,1679,1698,1724,1729,1745,1751,1767,1781,1798,1822,1826,1830,1836,1851,1863,1877,1901,1905,1909,1913,1917,1923,1937,1947,1965,1969,1973,1979,1998,2006,2014,2022,2027,2036,2052,2070,2094,2111,2117,2142,2155,2200,2206,2215,2236,2280,2285],{"__ignoreMap":316},[321,1368,1369,1371,1373,1375],{"class":323,"line":324},[321,1370,571],{"class":327},[321,1372,574],{"class":338},[321,1374,577],{"class":369},[321,1376,580],{"class":338},[321,1378,1379,1381],{"class":323,"line":342},[321,1380,571],{"class":327},[321,1382,1383],{"class":338}," javax.swing.plaf.basic.BasicTextFieldUI;\n",[321,1385,1386,1388,1390,1392],{"class":323,"line":376},[321,1387,571],{"class":327},[321,1389,594],{"class":338},[321,1391,577],{"class":369},[321,1393,580],{"class":338},[321,1395,1396,1398],{"class":323,"line":401},[321,1397,571],{"class":327},[321,1399,1400],{"class":338}," java.awt.event.FocusAdapter;\n",[321,1402,1403,1405],{"class":323,"line":426},[321,1404,571],{"class":327},[321,1406,1407],{"class":338}," java.awt.event.FocusEvent;\n",[321,1409,1410],{"class":323,"line":451},[321,1411,618],{"emptyLinePlaceholder":617},[321,1413,1414,1416,1418,1421,1423,1426],{"class":323,"line":476},[321,1415,328],{"class":327},[321,1417,331],{"class":327},[321,1419,1420],{"class":334}," MyTextFieldUI",[321,1422,630],{"class":327},[321,1424,1425],{"class":334}," BasicTextFieldUI",[321,1427,339],{"class":338},[321,1429,1430],{"class":323,"line":501},[321,1431,618],{"emptyLinePlaceholder":617},[321,1433,1434,1436],{"class":323,"line":526},[321,1435,640],{"class":327},[321,1437,1438],{"class":338}," String labelText;\n",[321,1440,1441,1443],{"class":323,"line":551},[321,1442,640],{"class":327},[321,1444,1445],{"class":338}," String placeholderText;\n",[321,1447,1448,1450,1452,1454],{"class":323,"line":675},[321,1449,640],{"class":327},[321,1451,643],{"class":338},[321,1453,357],{"class":327},[321,1455,1456],{"class":338}," MyPalette.BACKGROUND_COLOR;\n",[321,1458,1459,1461,1464,1466],{"class":323,"line":688},[321,1460,640],{"class":327},[321,1462,1463],{"class":338}," Color borderColor ",[321,1465,357],{"class":327},[321,1467,648],{"class":338},[321,1469,1470,1472,1475,1477],{"class":323,"line":693},[321,1471,640],{"class":327},[321,1473,1474],{"class":338}," Color focusBorderColor ",[321,1476,357],{"class":327},[321,1478,660],{"class":338},[321,1480,1481,1483,1486,1488],{"class":323,"line":702},[321,1482,640],{"class":327},[321,1484,1485],{"class":338}," Color errorBorderColor ",[321,1487,357],{"class":327},[321,1489,1490],{"class":338}," MyPalette.ERROR_COLOR;\n",[321,1492,1493],{"class":323,"line":723},[321,1494,618],{"emptyLinePlaceholder":617},[321,1496,1497,1499,1501,1504,1507,1510,1513],{"class":323,"line":738},[321,1498,345],{"class":327},[321,1500,1420],{"class":334},[321,1502,1503],{"class":338},"(String ",[321,1505,1506],{"class":716},"labelText",[321,1508,1509],{"class":338},", String ",[321,1511,1512],{"class":716},"placeholderText",[321,1514,720],{"class":338},[321,1516,1517,1520,1523,1525],{"class":323,"line":754},[321,1518,1519],{"class":369},"        this",[321,1521,1522],{"class":338},".labelText ",[321,1524,357],{"class":327},[321,1526,1527],{"class":338}," labelText;\n",[321,1529,1530,1532,1535,1537],{"class":323,"line":765},[321,1531,1519],{"class":369},[321,1533,1534],{"class":338},".placeholderText ",[321,1536,357],{"class":327},[321,1538,1539],{"class":338}," placeholderText;\n",[321,1541,1542],{"class":323,"line":776},[321,1543,1080],{"class":338},[321,1545,1546],{"class":323,"line":812},[321,1547,618],{"emptyLinePlaceholder":617},[321,1549,1550,1552],{"class":323,"line":831},[321,1551,696],{"class":338},[321,1553,699],{"class":327},[321,1555,1556,1558,1560,1562,1564,1566],{"class":323,"line":839},[321,1557,345],{"class":327},[321,1559,707],{"class":327},[321,1561,710],{"class":334},[321,1563,713],{"class":338},[321,1565,717],{"class":716},[321,1567,720],{"class":338},[321,1569,1570,1572,1574,1576],{"class":323,"line":858},[321,1571,726],{"class":369},[321,1573,729],{"class":338},[321,1575,732],{"class":334},[321,1577,735],{"class":338},[321,1579,1580,1582,1584,1586,1588],{"class":323,"line":873},[321,1581,741],{"class":338},[321,1583,744],{"class":334},[321,1585,366],{"class":338},[321,1587,749],{"class":369},[321,1589,373],{"class":338},[321,1591,1592,1594,1596],{"class":323,"line":884},[321,1593,741],{"class":338},[321,1595,759],{"class":334},[321,1597,762],{"class":338},[321,1599,1600,1602,1604],{"class":323,"line":890},[321,1601,741],{"class":338},[321,1603,770],{"class":334},[321,1605,1606],{"class":338},"(Color.LIGHT_GRAY);\n",[321,1608,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627,1629,1631,1633],{"class":323,"line":896},[321,1610,741],{"class":338},[321,1612,781],{"class":334},[321,1614,784],{"class":338},[321,1616,787],{"class":334},[321,1618,366],{"class":338},[321,1620,792],{"class":369},[321,1622,795],{"class":338},[321,1624,792],{"class":369},[321,1626,795],{"class":338},[321,1628,792],{"class":369},[321,1630,795],{"class":338},[321,1632,792],{"class":369},[321,1634,809],{"class":338},[321,1636,1637,1639,1641,1643,1646],{"class":323,"line":901},[321,1638,741],{"class":338},[321,1640,759],{"class":334},[321,1642,366],{"class":338},[321,1644,1645],{"class":369},"null",[321,1647,373],{"class":338},[321,1649,1650,1652,1654],{"class":323,"line":908},[321,1651,741],{"class":338},[321,1653,770],{"class":334},[321,1655,1656],{"class":338},"(Color.BLACK);\n",[321,1658,1659,1661,1664,1667,1670],{"class":323,"line":924},[321,1660,741],{"class":338},[321,1662,1663],{"class":334},"setCursor",[321,1665,1666],{"class":338},"(Cursor.",[321,1668,1669],{"class":334},"getPredefinedCursor",[321,1671,1672],{"class":338},"(Cursor.TEXT_CURSOR));\n",[321,1674,1675],{"class":323,"line":935},[321,1676,1678],{"class":1677},"sAwPA","        \u002F\u002F Agregamos un margen adicional para la etiqueta\n",[321,1680,1681,1683,1685,1687,1690,1692,1695],{"class":323,"line":944},[321,1682,741],{"class":338},[321,1684,781],{"class":334},[321,1686,784],{"class":338},[321,1688,1689],{"class":334},"createCompoundBorder",[321,1691,1131],{"class":338},[321,1693,1694],{"class":334},"getBorder",[321,1696,1697],{"class":338},"(),\n",[321,1699,1700,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721],{"class":323,"line":949},[321,1701,1702],{"class":338},"                BorderFactory.",[321,1704,787],{"class":334},[321,1706,366],{"class":338},[321,1708,798],{"class":369},[321,1710,795],{"class":338},[321,1712,1140],{"class":369},[321,1714,795],{"class":338},[321,1716,1140],{"class":369},[321,1718,795],{"class":338},[321,1720,1140],{"class":369},[321,1722,1723],{"class":338},")));\n",[321,1725,1726],{"class":323,"line":954},[321,1727,1728],{"class":1677},"        \u002F\u002F Agregamos un listener para cambiar el borde al enfocar o perder el enfoque\n",[321,1730,1731,1733,1736,1738,1740,1743],{"class":323,"line":959},[321,1732,741],{"class":338},[321,1734,1735],{"class":334},"addFocusListener",[321,1737,366],{"class":338},[321,1739,822],{"class":327},[321,1741,1742],{"class":334}," FocusAdapter",[321,1744,828],{"class":338},[321,1746,1747,1749],{"class":323,"line":966},[321,1748,834],{"class":338},[321,1750,699],{"class":327},[321,1752,1753,1755,1757,1760,1763,1765],{"class":323,"line":982},[321,1754,842],{"class":327},[321,1756,707],{"class":327},[321,1758,1759],{"class":334}," focusGained",[321,1761,1762],{"class":338},"(FocusEvent ",[321,1764,853],{"class":716},[321,1766,720],{"class":338},[321,1768,1769,1772,1774,1776,1778],{"class":323,"line":993},[321,1770,1771],{"class":338},"                c.",[321,1773,781],{"class":334},[321,1775,784],{"class":338},[321,1777,1689],{"class":334},[321,1779,1780],{"class":338},"(\n",[321,1782,1783,1786,1789,1792,1795],{"class":323,"line":1003},[321,1784,1785],{"class":338},"                        BorderFactory.",[321,1787,1788],{"class":334},"createLineBorder",[321,1790,1791],{"class":338},"(focusBorderColor, ",[321,1793,1794],{"class":369},"2",[321,1796,1797],{"class":338},"),\n",[321,1799,1800,1802,1804,1806,1808,1810,1812,1814,1816,1818,1820],{"class":323,"line":1008},[321,1801,1785],{"class":338},[321,1803,787],{"class":334},[321,1805,366],{"class":338},[321,1807,798],{"class":369},[321,1809,795],{"class":338},[321,1811,1140],{"class":369},[321,1813,795],{"class":338},[321,1815,1140],{"class":369},[321,1817,795],{"class":338},[321,1819,1140],{"class":369},[321,1821,1723],{"class":338},[321,1823,1824],{"class":323,"line":1013},[321,1825,893],{"class":338},[321,1827,1828],{"class":323,"line":1018},[321,1829,618],{"emptyLinePlaceholder":617},[321,1831,1832,1834],{"class":323,"line":1025},[321,1833,834],{"class":338},[321,1835,699],{"class":327},[321,1837,1838,1840,1842,1845,1847,1849],{"class":323,"line":1041},[321,1839,842],{"class":327},[321,1841,707],{"class":327},[321,1843,1844],{"class":334}," focusLost",[321,1846,1762],{"class":338},[321,1848,853],{"class":716},[321,1850,720],{"class":338},[321,1852,1853,1855,1857,1859,1861],{"class":323,"line":1052},[321,1854,1771],{"class":338},[321,1856,781],{"class":334},[321,1858,784],{"class":338},[321,1860,1689],{"class":334},[321,1862,1780],{"class":338},[321,1864,1865,1867,1869,1872,1875],{"class":323,"line":1061},[321,1866,1785],{"class":338},[321,1868,1788],{"class":334},[321,1870,1871],{"class":338},"(borderColor, ",[321,1873,1874],{"class":369},"1",[321,1876,1797],{"class":338},[321,1878,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899],{"class":323,"line":1066},[321,1880,1785],{"class":338},[321,1882,787],{"class":334},[321,1884,366],{"class":338},[321,1886,798],{"class":369},[321,1888,795],{"class":338},[321,1890,1140],{"class":369},[321,1892,795],{"class":338},[321,1894,1140],{"class":369},[321,1896,795],{"class":338},[321,1898,1140],{"class":369},[321,1900,1723],{"class":338},[321,1902,1903],{"class":323,"line":1071},[321,1904,893],{"class":338},[321,1906,1907],{"class":323,"line":1077},[321,1908,1074],{"class":338},[321,1910,1911],{"class":323,"line":1083},[321,1912,1080],{"class":338},[321,1914,1915],{"class":323,"line":1088},[321,1916,618],{"emptyLinePlaceholder":617},[321,1918,1919,1921],{"class":323,"line":1095},[321,1920,696],{"class":338},[321,1922,699],{"class":327},[321,1924,1925,1927,1929,1931,1933,1935],{"class":323,"line":1111},[321,1926,345],{"class":327},[321,1928,707],{"class":327},[321,1930,1102],{"class":334},[321,1932,713],{"class":338},[321,1934,717],{"class":716},[321,1936,720],{"class":338},[321,1938,1939,1941,1943,1945],{"class":323,"line":1123},[321,1940,726],{"class":369},[321,1942,729],{"class":338},[321,1944,1118],{"class":334},[321,1946,735],{"class":338},[321,1948,1949,1951,1954,1956,1959,1961,1963],{"class":323,"line":1146},[321,1950,741],{"class":338},[321,1952,1953],{"class":334},"removeFocusListener",[321,1955,1131],{"class":338},[321,1957,1958],{"class":334},"getFocusListeners",[321,1960,1137],{"class":338},[321,1962,1140],{"class":369},[321,1964,1143],{"class":338},[321,1966,1967],{"class":323,"line":1151},[321,1968,1080],{"class":338},[321,1970,1971],{"class":323,"line":1156},[321,1972,618],{"emptyLinePlaceholder":617},[321,1974,1975,1977],{"class":323,"line":1163},[321,1976,696],{"class":338},[321,1978,699],{"class":327},[321,1980,1981,1983,1985,1988,1990,1992,1994,1996],{"class":323,"line":1186},[321,1982,345],{"class":327},[321,1984,707],{"class":327},[321,1986,1987],{"class":334}," paintBackground",[321,1989,1173],{"class":338},[321,1991,1176],{"class":716},[321,1993,1179],{"class":338},[321,1995,717],{"class":716},[321,1997,720],{"class":338},[321,1999,2000,2002,2004],{"class":323,"line":1197},[321,2001,1189],{"class":338},[321,2003,357],{"class":327},[321,2005,1194],{"class":338},[321,2007,2008,2010,2012],{"class":323,"line":1209},[321,2009,1200],{"class":338},[321,2011,1203],{"class":334},[321,2013,1206],{"class":338},[321,2015,2016,2018,2020],{"class":323,"line":1219},[321,2017,1200],{"class":338},[321,2019,1203],{"class":334},[321,2021,1216],{"class":338},[321,2023,2024],{"class":323,"line":1235},[321,2025,2026],{"class":1677},"        \u002F\u002F Dibujamos en primer lugar la etiqueta sobre el borde del campo de texto\n",[321,2028,2029,2031,2033],{"class":323,"line":1274},[321,2030,1200],{"class":338},[321,2032,1224],{"class":334},[321,2034,2035],{"class":338},"(MyThemeColors.PRIMARY_COLOR);\n",[321,2037,2038,2041,2043,2046,2049],{"class":323,"line":1287},[321,2039,2040],{"class":338},"        FontMetrics fm ",[321,2042,357],{"class":327},[321,2044,2045],{"class":338}," g2d.",[321,2047,2048],{"class":334},"getFontMetrics",[321,2050,2051],{"class":338},"();\n",[321,2053,2054,2057,2060,2062,2065,2068],{"class":323,"line":1292},[321,2055,2056],{"class":327},"        int",[321,2058,2059],{"class":338}," labelHeight ",[321,2061,357],{"class":327},[321,2063,2064],{"class":338}," fm.",[321,2066,2067],{"class":334},"getAscent",[321,2069,2051],{"class":338},[321,2071,2073,2075,2078,2080,2082,2085,2088,2091],{"class":323,"line":2072},67,[321,2074,2056],{"class":327},[321,2076,2077],{"class":338}," labelY ",[321,2079,357],{"class":327},[321,2081,2059],{"class":338},[321,2083,2084],{"class":327},"+",[321,2086,2087],{"class":369}," 5",[321,2089,2090],{"class":338},"; ",[321,2092,2093],{"class":1677},"\u002F\u002F Posición de la etiqueta sobre el borde\n",[321,2095,2097,2099,2102,2105,2108],{"class":323,"line":2096},68,[321,2098,1200],{"class":338},[321,2100,2101],{"class":334},"drawString",[321,2103,2104],{"class":338},"(outlineLabel, ",[321,2106,2107],{"class":369},"5",[321,2109,2110],{"class":338},", labelY);\n",[321,2112,2114],{"class":323,"line":2113},69,[321,2115,2116],{"class":1677},"        \u002F\u002F Luego dibujamos el fondo del campo de texto\n",[321,2118,2120,2122,2125,2127,2129,2132,2134,2136,2139],{"class":323,"line":2119},70,[321,2121,1200],{"class":338},[321,2123,2124],{"class":334},"translate",[321,2126,366],{"class":338},[321,2128,1140],{"class":369},[321,2130,2131],{"class":338},", labelHeight ",[321,2133,2084],{"class":327},[321,2135,2087],{"class":369},[321,2137,2138],{"class":338},"); ",[321,2140,2141],{"class":1677},"\u002F\u002F Movemos el origen para dibujar el fondo debajo de la etiqueta\n",[321,2143,2145,2147,2149,2151,2153],{"class":323,"line":2144},71,[321,2146,1200],{"class":338},[321,2148,1224],{"class":334},[321,2150,1131],{"class":338},[321,2152,1229],{"class":334},[321,2154,1232],{"class":338},[321,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178,2181,2184,2186,2188,2190,2192,2194,2196,2198],{"class":323,"line":2157},72,[321,2159,1200],{"class":338},[321,2161,1240],{"class":334},[321,2163,366],{"class":338},[321,2165,1140],{"class":369},[321,2167,795],{"class":338},[321,2169,1140],{"class":369},[321,2171,1251],{"class":338},[321,2173,1254],{"class":334},[321,2175,1257],{"class":338},[321,2177,1260],{"class":334},[321,2179,2180],{"class":338},"() ",[321,2182,2183],{"class":327},"-",[321,2185,2059],{"class":338},[321,2187,2183],{"class":327},[321,2189,2087],{"class":369},[321,2191,795],{"class":338},[321,2193,792],{"class":369},[321,2195,795],{"class":338},[321,2197,792],{"class":369},[321,2199,373],{"class":338},[321,2201,2203],{"class":323,"line":2202},73,[321,2204,2205],{"class":1677},"        \u002F\u002F Luego dibujamos un borde redondeado para envolver el campo de texto, asegurándonos de que la etiqueta quede por encima del borde\n",[321,2207,2209,2211,2213],{"class":323,"line":2208},74,[321,2210,1200],{"class":338},[321,2212,1224],{"class":334},[321,2214,2035],{"class":338},[321,2216,2218,2220,2223,2225,2227,2230,2232,2234],{"class":323,"line":2217},75,[321,2219,1200],{"class":338},[321,2221,2222],{"class":334},"setStroke",[321,2224,366],{"class":338},[321,2226,822],{"class":327},[321,2228,2229],{"class":334}," BasicStroke",[321,2231,366],{"class":338},[321,2233,1794],{"class":369},[321,2235,809],{"class":338},[321,2237,2239,2241,2244,2246,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278],{"class":323,"line":2238},76,[321,2240,1200],{"class":338},[321,2242,2243],{"class":334},"drawRoundRect",[321,2245,366],{"class":338},[321,2247,1140],{"class":369},[321,2249,795],{"class":338},[321,2251,1140],{"class":369},[321,2253,1251],{"class":338},[321,2255,1254],{"class":334},[321,2257,1257],{"class":338},[321,2259,1260],{"class":334},[321,2261,2180],{"class":338},[321,2263,2183],{"class":327},[321,2265,2059],{"class":338},[321,2267,2183],{"class":327},[321,2269,2087],{"class":369},[321,2271,795],{"class":338},[321,2273,792],{"class":369},[321,2275,795],{"class":338},[321,2277,792],{"class":369},[321,2279,373],{"class":338},[321,2281,2283],{"class":323,"line":2282},77,[321,2284,1080],{"class":338},[321,2286,2288],{"class":323,"line":2287},78,[321,2289,554],{"class":338},[304,2291,2292],{},"Para usar este delegador en un campo de texto, simplemente asignamos la UI personalizada al campo:",[311,2294,2296],{"className":313,"code":2295,"language":315,"meta":316,"style":316},"JTextField myTextField = new JTextField();\nmyTextField.setUI(new MyTextFieldUI());\n",[318,2297,2298,2312],{"__ignoreMap":316},[321,2299,2300,2303,2305,2307,2310],{"class":323,"line":324},[321,2301,2302],{"class":338},"JTextField myTextField ",[321,2304,357],{"class":327},[321,2306,360],{"class":327},[321,2308,2309],{"class":334}," JTextField",[321,2311,2051],{"class":338},[321,2313,2314,2317,2319,2321,2323,2325],{"class":323,"line":342},[321,2315,2316],{"class":338},"myTextField.",[321,2318,1330],{"class":334},[321,2320,366],{"class":338},[321,2322,822],{"class":327},[321,2324,1420],{"class":334},[321,2326,1232],{"class":338},[1351,2328,2330],{"id":2329},"radio-buttons-y-checkboxes","Radio Buttons y Checkboxes",[304,2332,2333,2334,2337,2338,2341,2342,2344,2345,2347],{},"De manera similar, podemos crear delegadores personalizados para ",[318,2335,2336],{},"JRadioButton"," y ",[318,2339,2340],{},"JCheckBox"," para estilizar su apariencia. Por ejemplo, para un ",[318,2343,2336],{},", podríamos crear un delegador que dibuje un círculo personalizado en lugar del círculo predeterminado, y para un ",[318,2346,2340],{},", podríamos dibujar un cuadro personalizado con una marca de verificación estilizada.",[304,2349,2350,2351,561],{},"Veamos el ejemplo de un delegador para ",[318,2352,2336],{},[311,2354,2356],{"className":313,"code":2355,"language":315,"meta":316,"style":316},"import javax.swing.*;\nimport javax.swing.plaf.basic.BasicRadioButtonUI;\nimport java.awt.*;\n\npublic class MyRadioButtonUI extends BasicRadioButtonUI {\n\n    private Color selectedColor = MyPalette.PRIMARY_COLOR;\n    private Color unselectedColor = MyPalette.BACKGROUND_COLOR;\n    private Color borderColor = MyPalette.PRIMARY_COLOR;\n\n    @Override\n    public void installUI(JComponent c) {\n        super.installUI(c);\n        c.setOpaque(false);\n        c.setBackground(unselectedColor);\n        c.setForeground(Color.BLACK);\n        c.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));\n    }\n\n    @Override\n    public void paint(Graphics g, JComponent c) {\n        Graphics2D g2d = (Graphics2D) g;\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 el círculo del radio button\n        int diameter = Math.min(c.getWidth(), c.getHeight()) - 10;\n        int x = (c.getWidth() - diameter) \u002F 2;\n        int y = (c.getHeight() - diameter) \u002F 2;\n        g2d.setColor(borderColor);\n        g2d.drawOval(x, y, diameter, diameter);\n        if (((JRadioButton) c).isSelected()) {\n            g2d.setColor(selectedColor);\n            g2d.fillOval(x + 4, y + 4, diameter - 8, diameter - 8);\n        }\n        \u002F\u002F Luego dibujamos el texto al lado del círculo\n        g2d.setColor(c.getForeground());\n        FontMetrics fm = g2d.getFontMetrics();\n        int textX = x + diameter + 10;\n        int textY = (c.getHeight() + fm.getAscent()) \u002F 2 - 2;\n        g2d.drawString(((JRadioButton) c).getText(), textX, textY);\n    }\n}\n",[318,2357,2358,2368,2375,2385,2389,2405,2409,2420,2431,2441,2445,2451,2465,2475,2487,2496,2504,2532,2536,2540,2546,2564,2572,2580,2588,2593,2626,2654,2678,2687,2697,2710,2720,2758,2763,2768,2781,2793,2814,2848,2863,2867],{"__ignoreMap":316},[321,2359,2360,2362,2364,2366],{"class":323,"line":324},[321,2361,571],{"class":327},[321,2363,574],{"class":338},[321,2365,577],{"class":369},[321,2367,580],{"class":338},[321,2369,2370,2372],{"class":323,"line":342},[321,2371,571],{"class":327},[321,2373,2374],{"class":338}," javax.swing.plaf.basic.BasicRadioButtonUI;\n",[321,2376,2377,2379,2381,2383],{"class":323,"line":376},[321,2378,571],{"class":327},[321,2380,594],{"class":338},[321,2382,577],{"class":369},[321,2384,580],{"class":338},[321,2386,2387],{"class":323,"line":401},[321,2388,618],{"emptyLinePlaceholder":617},[321,2390,2391,2393,2395,2398,2400,2403],{"class":323,"line":426},[321,2392,328],{"class":327},[321,2394,331],{"class":327},[321,2396,2397],{"class":334}," MyRadioButtonUI",[321,2399,630],{"class":327},[321,2401,2402],{"class":334}," BasicRadioButtonUI",[321,2404,339],{"class":338},[321,2406,2407],{"class":323,"line":451},[321,2408,618],{"emptyLinePlaceholder":617},[321,2410,2411,2413,2416,2418],{"class":323,"line":476},[321,2412,640],{"class":327},[321,2414,2415],{"class":338}," Color selectedColor ",[321,2417,357],{"class":327},[321,2419,648],{"class":338},[321,2421,2422,2424,2427,2429],{"class":323,"line":501},[321,2423,640],{"class":327},[321,2425,2426],{"class":338}," Color unselectedColor ",[321,2428,357],{"class":327},[321,2430,1456],{"class":338},[321,2432,2433,2435,2437,2439],{"class":323,"line":526},[321,2434,640],{"class":327},[321,2436,1463],{"class":338},[321,2438,357],{"class":327},[321,2440,648],{"class":338},[321,2442,2443],{"class":323,"line":551},[321,2444,618],{"emptyLinePlaceholder":617},[321,2446,2447,2449],{"class":323,"line":675},[321,2448,696],{"class":338},[321,2450,699],{"class":327},[321,2452,2453,2455,2457,2459,2461,2463],{"class":323,"line":688},[321,2454,345],{"class":327},[321,2456,707],{"class":327},[321,2458,710],{"class":334},[321,2460,713],{"class":338},[321,2462,717],{"class":716},[321,2464,720],{"class":338},[321,2466,2467,2469,2471,2473],{"class":323,"line":693},[321,2468,726],{"class":369},[321,2470,729],{"class":338},[321,2472,732],{"class":334},[321,2474,735],{"class":338},[321,2476,2477,2479,2481,2483,2485],{"class":323,"line":702},[321,2478,741],{"class":338},[321,2480,744],{"class":334},[321,2482,366],{"class":338},[321,2484,749],{"class":369},[321,2486,373],{"class":338},[321,2488,2489,2491,2493],{"class":323,"line":723},[321,2490,741],{"class":338},[321,2492,759],{"class":334},[321,2494,2495],{"class":338},"(unselectedColor);\n",[321,2497,2498,2500,2502],{"class":323,"line":738},[321,2499,741],{"class":338},[321,2501,770],{"class":334},[321,2503,1656],{"class":338},[321,2505,2506,2508,2510,2512,2514,2516,2518,2520,2522,2524,2526,2528,2530],{"class":323,"line":754},[321,2507,741],{"class":338},[321,2509,781],{"class":334},[321,2511,784],{"class":338},[321,2513,787],{"class":334},[321,2515,366],{"class":338},[321,2517,2107],{"class":369},[321,2519,795],{"class":338},[321,2521,2107],{"class":369},[321,2523,795],{"class":338},[321,2525,2107],{"class":369},[321,2527,795],{"class":338},[321,2529,2107],{"class":369},[321,2531,809],{"class":338},[321,2533,2534],{"class":323,"line":765},[321,2535,1080],{"class":338},[321,2537,2538],{"class":323,"line":776},[321,2539,618],{"emptyLinePlaceholder":617},[321,2541,2542,2544],{"class":323,"line":812},[321,2543,696],{"class":338},[321,2545,699],{"class":327},[321,2547,2548,2550,2552,2554,2556,2558,2560,2562],{"class":323,"line":831},[321,2549,345],{"class":327},[321,2551,707],{"class":327},[321,2553,1170],{"class":334},[321,2555,1173],{"class":338},[321,2557,1176],{"class":716},[321,2559,1179],{"class":338},[321,2561,717],{"class":716},[321,2563,720],{"class":338},[321,2565,2566,2568,2570],{"class":323,"line":839},[321,2567,1189],{"class":338},[321,2569,357],{"class":327},[321,2571,1194],{"class":338},[321,2573,2574,2576,2578],{"class":323,"line":858},[321,2575,1200],{"class":338},[321,2577,1203],{"class":334},[321,2579,1206],{"class":338},[321,2581,2582,2584,2586],{"class":323,"line":873},[321,2583,1200],{"class":338},[321,2585,1203],{"class":334},[321,2587,1216],{"class":338},[321,2589,2590],{"class":323,"line":884},[321,2591,2592],{"class":1677},"        \u002F\u002F Dibujamos el círculo del radio button\n",[321,2594,2595,2597,2600,2602,2605,2608,2610,2612,2614,2616,2619,2621,2624],{"class":323,"line":890},[321,2596,2056],{"class":327},[321,2598,2599],{"class":338}," diameter ",[321,2601,357],{"class":327},[321,2603,2604],{"class":338}," Math.",[321,2606,2607],{"class":334},"min",[321,2609,1131],{"class":338},[321,2611,1254],{"class":334},[321,2613,1257],{"class":338},[321,2615,1260],{"class":334},[321,2617,2618],{"class":338},"()) ",[321,2620,2183],{"class":327},[321,2622,2623],{"class":369}," 10",[321,2625,580],{"class":338},[321,2627,2628,2630,2633,2635,2637,2639,2641,2643,2646,2649,2652],{"class":323,"line":896},[321,2629,2056],{"class":327},[321,2631,2632],{"class":338}," x ",[321,2634,357],{"class":327},[321,2636,864],{"class":338},[321,2638,1254],{"class":334},[321,2640,2180],{"class":338},[321,2642,2183],{"class":327},[321,2644,2645],{"class":338}," diameter) ",[321,2647,2648],{"class":327},"\u002F",[321,2650,2651],{"class":369}," 2",[321,2653,580],{"class":338},[321,2655,2656,2658,2660,2662,2664,2666,2668,2670,2672,2674,2676],{"class":323,"line":901},[321,2657,2056],{"class":327},[321,2659,2337],{"class":338},[321,2661,357],{"class":327},[321,2663,864],{"class":338},[321,2665,1260],{"class":334},[321,2667,2180],{"class":338},[321,2669,2183],{"class":327},[321,2671,2645],{"class":338},[321,2673,2648],{"class":327},[321,2675,2651],{"class":369},[321,2677,580],{"class":338},[321,2679,2680,2682,2684],{"class":323,"line":908},[321,2681,1200],{"class":338},[321,2683,1224],{"class":334},[321,2685,2686],{"class":338},"(borderColor);\n",[321,2688,2689,2691,2694],{"class":323,"line":924},[321,2690,1200],{"class":338},[321,2692,2693],{"class":334},"drawOval",[321,2695,2696],{"class":338},"(x, y, diameter, diameter);\n",[321,2698,2699,2702,2705,2708],{"class":323,"line":935},[321,2700,2701],{"class":327},"        if",[321,2703,2704],{"class":338}," (((JRadioButton) c).",[321,2706,2707],{"class":334},"isSelected",[321,2709,870],{"class":338},[321,2711,2712,2715,2717],{"class":323,"line":944},[321,2713,2714],{"class":338},"            g2d.",[321,2716,1224],{"class":334},[321,2718,2719],{"class":338},"(selectedColor);\n",[321,2721,2722,2724,2727,2730,2732,2735,2738,2740,2742,2745,2747,2750,2752,2754,2756],{"class":323,"line":949},[321,2723,2714],{"class":338},[321,2725,2726],{"class":334},"fillOval",[321,2728,2729],{"class":338},"(x ",[321,2731,2084],{"class":327},[321,2733,2734],{"class":369}," 4",[321,2736,2737],{"class":338},", y ",[321,2739,2084],{"class":327},[321,2741,2734],{"class":369},[321,2743,2744],{"class":338},", diameter ",[321,2746,2183],{"class":327},[321,2748,2749],{"class":369}," 8",[321,2751,2744],{"class":338},[321,2753,2183],{"class":327},[321,2755,2749],{"class":369},[321,2757,373],{"class":338},[321,2759,2760],{"class":323,"line":954},[321,2761,2762],{"class":338},"        }\n",[321,2764,2765],{"class":323,"line":959},[321,2766,2767],{"class":1677},"        \u002F\u002F Luego dibujamos el texto al lado del círculo\n",[321,2769,2770,2772,2774,2776,2779],{"class":323,"line":966},[321,2771,1200],{"class":338},[321,2773,1224],{"class":334},[321,2775,1131],{"class":338},[321,2777,2778],{"class":334},"getForeground",[321,2780,1232],{"class":338},[321,2782,2783,2785,2787,2789,2791],{"class":323,"line":982},[321,2784,2040],{"class":338},[321,2786,357],{"class":327},[321,2788,2045],{"class":338},[321,2790,2048],{"class":334},[321,2792,2051],{"class":338},[321,2794,2795,2797,2800,2802,2804,2806,2808,2810,2812],{"class":323,"line":993},[321,2796,2056],{"class":327},[321,2798,2799],{"class":338}," textX ",[321,2801,357],{"class":327},[321,2803,2632],{"class":338},[321,2805,2084],{"class":327},[321,2807,2599],{"class":338},[321,2809,2084],{"class":327},[321,2811,2623],{"class":369},[321,2813,580],{"class":338},[321,2815,2816,2818,2821,2823,2825,2827,2829,2831,2833,2835,2837,2839,2841,2844,2846],{"class":323,"line":1003},[321,2817,2056],{"class":327},[321,2819,2820],{"class":338}," textY ",[321,2822,357],{"class":327},[321,2824,864],{"class":338},[321,2826,1260],{"class":334},[321,2828,2180],{"class":338},[321,2830,2084],{"class":327},[321,2832,2064],{"class":338},[321,2834,2067],{"class":334},[321,2836,2618],{"class":338},[321,2838,2648],{"class":327},[321,2840,2651],{"class":369},[321,2842,2843],{"class":327}," -",[321,2845,2651],{"class":369},[321,2847,580],{"class":338},[321,2849,2850,2852,2854,2857,2860],{"class":323,"line":1008},[321,2851,1200],{"class":338},[321,2853,2101],{"class":334},[321,2855,2856],{"class":338},"(((JRadioButton) c).",[321,2858,2859],{"class":334},"getText",[321,2861,2862],{"class":338},"(), textX, textY);\n",[321,2864,2865],{"class":323,"line":1013},[321,2866,1080],{"class":338},[321,2868,2869],{"class":323,"line":1018},[321,2870,554],{"class":338},[304,2872,2873,2874,2876],{},"Para usar este delegador en un ",[318,2875,2336],{},", simplemente asignamos la UI personalizada al botón:",[311,2878,2880],{"className":313,"code":2879,"language":315,"meta":316,"style":316},"JRadioButton myRadioButton = new JRadioButton(\"Option 1\");\nmyRadioButton.setUI(new MyRadioButtonUI());\n",[318,2881,2882,2901],{"__ignoreMap":316},[321,2883,2884,2887,2889,2891,2894,2896,2899],{"class":323,"line":324},[321,2885,2886],{"class":338},"JRadioButton myRadioButton ",[321,2888,357],{"class":327},[321,2890,360],{"class":327},[321,2892,2893],{"class":334}," JRadioButton",[321,2895,366],{"class":338},[321,2897,2898],{"class":1319},"\"Option 1\"",[321,2900,373],{"class":338},[321,2902,2903,2906,2908,2910,2912,2914],{"class":323,"line":342},[321,2904,2905],{"class":338},"myRadioButton.",[321,2907,1330],{"class":334},[321,2909,366],{"class":338},[321,2911,822],{"class":327},[321,2913,2397],{"class":334},[321,2915,1232],{"class":338},[304,2917,2918,2919,2921],{},"Por su lado para un ",[318,2920,2340],{},", podríamos crear un delegador similar que dibuje un cuadro personalizado con una marca de verificación estilizada de la siguiente manera:",[311,2923,2925],{"className":313,"code":2924,"language":315,"meta":316,"style":316},"import javax.swing.*;\nimport javax.swing.plaf.basic.BasicCheckBoxUI;\nimport java.awt.*;\n\npublic class MyCheckBoxUI extends BasicCheckBoxUI {\n\n    private Color selectedColor = MyPalette.PRIMARY_COLOR;\n    private Color unselectedColor = MyPalette.BACKGROUND_COLOR;\n    private Color borderColor = MyPalette.PRIMARY_COLOR;\n\n    @Override\n    public void installUI(JComponent c) {\n        super.installUI(c);\n        c.setOpaque(false);\n        c.setBackground(unselectedColor);\n        c.setForeground(Color.BLACK);\n        c.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));\n    }\n\n    @Override\n    public void paint(Graphics g, JComponent c) {\n        Graphics2D g2d = (Graphics2D) g;\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 el cuadro del checkbox\n        int size = Math.min(c.getWidth(), c.getHeight()) - 10;\n        int x = (c.getWidth() - size) \u002F 2;\n        int y = (c.getHeight() - size) \u002F 2;\n        g2d.setColor(borderColor);\n        g2d.drawRect(x, y, size, size);\n        if (((JCheckBox) c).isSelected()) {\n            g2d.setColor(selectedColor);\n            g2d.fillRect(x + 4, y + 4, size - 8, size - 8);\n            g2d.setColor(Color.GREEN);\n            g2d.setStroke(new BasicStroke(2));\n            g2d.drawLine(x + 6, y + size \u002F 2, x + size \u002F 3, y + size - 6);\n            g2d.drawLine(x + size \u002F 3, y + size - 6, x + size - 6, y + 6);\n        }\n        \u002F\u002F Luego dibujamos el texto al lado del cuadro\n        g2d.setColor(c.getForeground());\n        FontMetrics fm = g2d.getFontMetrics();\n        int textX = x + size + 10;\n        int textY = (c.getHeight() + fm.getAscent()) \u002F 2 - 2;\n        g2d.drawString(((JCheckBox) c).getText(), textX, textY);\n    }\n",[318,2926,2927,2937,2944,2954,2958,2974,2978,2988,2998,3008,3012,3018,3032,3042,3054,3062,3070,3098,3102,3106,3112,3130,3138,3146,3154,3159,3188,3213,3237,3245,3255,3266,3274,3308,3317,3335,3383,3427,3431,3436,3448,3460,3480,3512,3525],{"__ignoreMap":316},[321,2928,2929,2931,2933,2935],{"class":323,"line":324},[321,2930,571],{"class":327},[321,2932,574],{"class":338},[321,2934,577],{"class":369},[321,2936,580],{"class":338},[321,2938,2939,2941],{"class":323,"line":342},[321,2940,571],{"class":327},[321,2942,2943],{"class":338}," javax.swing.plaf.basic.BasicCheckBoxUI;\n",[321,2945,2946,2948,2950,2952],{"class":323,"line":376},[321,2947,571],{"class":327},[321,2949,594],{"class":338},[321,2951,577],{"class":369},[321,2953,580],{"class":338},[321,2955,2956],{"class":323,"line":401},[321,2957,618],{"emptyLinePlaceholder":617},[321,2959,2960,2962,2964,2967,2969,2972],{"class":323,"line":426},[321,2961,328],{"class":327},[321,2963,331],{"class":327},[321,2965,2966],{"class":334}," MyCheckBoxUI",[321,2968,630],{"class":327},[321,2970,2971],{"class":334}," BasicCheckBoxUI",[321,2973,339],{"class":338},[321,2975,2976],{"class":323,"line":451},[321,2977,618],{"emptyLinePlaceholder":617},[321,2979,2980,2982,2984,2986],{"class":323,"line":476},[321,2981,640],{"class":327},[321,2983,2415],{"class":338},[321,2985,357],{"class":327},[321,2987,648],{"class":338},[321,2989,2990,2992,2994,2996],{"class":323,"line":501},[321,2991,640],{"class":327},[321,2993,2426],{"class":338},[321,2995,357],{"class":327},[321,2997,1456],{"class":338},[321,2999,3000,3002,3004,3006],{"class":323,"line":526},[321,3001,640],{"class":327},[321,3003,1463],{"class":338},[321,3005,357],{"class":327},[321,3007,648],{"class":338},[321,3009,3010],{"class":323,"line":551},[321,3011,618],{"emptyLinePlaceholder":617},[321,3013,3014,3016],{"class":323,"line":675},[321,3015,696],{"class":338},[321,3017,699],{"class":327},[321,3019,3020,3022,3024,3026,3028,3030],{"class":323,"line":688},[321,3021,345],{"class":327},[321,3023,707],{"class":327},[321,3025,710],{"class":334},[321,3027,713],{"class":338},[321,3029,717],{"class":716},[321,3031,720],{"class":338},[321,3033,3034,3036,3038,3040],{"class":323,"line":693},[321,3035,726],{"class":369},[321,3037,729],{"class":338},[321,3039,732],{"class":334},[321,3041,735],{"class":338},[321,3043,3044,3046,3048,3050,3052],{"class":323,"line":702},[321,3045,741],{"class":338},[321,3047,744],{"class":334},[321,3049,366],{"class":338},[321,3051,749],{"class":369},[321,3053,373],{"class":338},[321,3055,3056,3058,3060],{"class":323,"line":723},[321,3057,741],{"class":338},[321,3059,759],{"class":334},[321,3061,2495],{"class":338},[321,3063,3064,3066,3068],{"class":323,"line":738},[321,3065,741],{"class":338},[321,3067,770],{"class":334},[321,3069,1656],{"class":338},[321,3071,3072,3074,3076,3078,3080,3082,3084,3086,3088,3090,3092,3094,3096],{"class":323,"line":754},[321,3073,741],{"class":338},[321,3075,781],{"class":334},[321,3077,784],{"class":338},[321,3079,787],{"class":334},[321,3081,366],{"class":338},[321,3083,2107],{"class":369},[321,3085,795],{"class":338},[321,3087,2107],{"class":369},[321,3089,795],{"class":338},[321,3091,2107],{"class":369},[321,3093,795],{"class":338},[321,3095,2107],{"class":369},[321,3097,809],{"class":338},[321,3099,3100],{"class":323,"line":765},[321,3101,1080],{"class":338},[321,3103,3104],{"class":323,"line":776},[321,3105,618],{"emptyLinePlaceholder":617},[321,3107,3108,3110],{"class":323,"line":812},[321,3109,696],{"class":338},[321,3111,699],{"class":327},[321,3113,3114,3116,3118,3120,3122,3124,3126,3128],{"class":323,"line":831},[321,3115,345],{"class":327},[321,3117,707],{"class":327},[321,3119,1170],{"class":334},[321,3121,1173],{"class":338},[321,3123,1176],{"class":716},[321,3125,1179],{"class":338},[321,3127,717],{"class":716},[321,3129,720],{"class":338},[321,3131,3132,3134,3136],{"class":323,"line":839},[321,3133,1189],{"class":338},[321,3135,357],{"class":327},[321,3137,1194],{"class":338},[321,3139,3140,3142,3144],{"class":323,"line":858},[321,3141,1200],{"class":338},[321,3143,1203],{"class":334},[321,3145,1206],{"class":338},[321,3147,3148,3150,3152],{"class":323,"line":873},[321,3149,1200],{"class":338},[321,3151,1203],{"class":334},[321,3153,1216],{"class":338},[321,3155,3156],{"class":323,"line":884},[321,3157,3158],{"class":1677},"        \u002F\u002F Dibujamos el cuadro del checkbox\n",[321,3160,3161,3163,3166,3168,3170,3172,3174,3176,3178,3180,3182,3184,3186],{"class":323,"line":890},[321,3162,2056],{"class":327},[321,3164,3165],{"class":338}," size ",[321,3167,357],{"class":327},[321,3169,2604],{"class":338},[321,3171,2607],{"class":334},[321,3173,1131],{"class":338},[321,3175,1254],{"class":334},[321,3177,1257],{"class":338},[321,3179,1260],{"class":334},[321,3181,2618],{"class":338},[321,3183,2183],{"class":327},[321,3185,2623],{"class":369},[321,3187,580],{"class":338},[321,3189,3190,3192,3194,3196,3198,3200,3202,3204,3207,3209,3211],{"class":323,"line":896},[321,3191,2056],{"class":327},[321,3193,2632],{"class":338},[321,3195,357],{"class":327},[321,3197,864],{"class":338},[321,3199,1254],{"class":334},[321,3201,2180],{"class":338},[321,3203,2183],{"class":327},[321,3205,3206],{"class":338}," size) ",[321,3208,2648],{"class":327},[321,3210,2651],{"class":369},[321,3212,580],{"class":338},[321,3214,3215,3217,3219,3221,3223,3225,3227,3229,3231,3233,3235],{"class":323,"line":901},[321,3216,2056],{"class":327},[321,3218,2337],{"class":338},[321,3220,357],{"class":327},[321,3222,864],{"class":338},[321,3224,1260],{"class":334},[321,3226,2180],{"class":338},[321,3228,2183],{"class":327},[321,3230,3206],{"class":338},[321,3232,2648],{"class":327},[321,3234,2651],{"class":369},[321,3236,580],{"class":338},[321,3238,3239,3241,3243],{"class":323,"line":908},[321,3240,1200],{"class":338},[321,3242,1224],{"class":334},[321,3244,2686],{"class":338},[321,3246,3247,3249,3252],{"class":323,"line":924},[321,3248,1200],{"class":338},[321,3250,3251],{"class":334},"drawRect",[321,3253,3254],{"class":338},"(x, y, size, size);\n",[321,3256,3257,3259,3262,3264],{"class":323,"line":935},[321,3258,2701],{"class":327},[321,3260,3261],{"class":338}," (((JCheckBox) c).",[321,3263,2707],{"class":334},[321,3265,870],{"class":338},[321,3267,3268,3270,3272],{"class":323,"line":944},[321,3269,2714],{"class":338},[321,3271,1224],{"class":334},[321,3273,2719],{"class":338},[321,3275,3276,3278,3281,3283,3285,3287,3289,3291,3293,3296,3298,3300,3302,3304,3306],{"class":323,"line":949},[321,3277,2714],{"class":338},[321,3279,3280],{"class":334},"fillRect",[321,3282,2729],{"class":338},[321,3284,2084],{"class":327},[321,3286,2734],{"class":369},[321,3288,2737],{"class":338},[321,3290,2084],{"class":327},[321,3292,2734],{"class":369},[321,3294,3295],{"class":338},", size ",[321,3297,2183],{"class":327},[321,3299,2749],{"class":369},[321,3301,3295],{"class":338},[321,3303,2183],{"class":327},[321,3305,2749],{"class":369},[321,3307,373],{"class":338},[321,3309,3310,3312,3314],{"class":323,"line":954},[321,3311,2714],{"class":338},[321,3313,1224],{"class":334},[321,3315,3316],{"class":338},"(Color.GREEN);\n",[321,3318,3319,3321,3323,3325,3327,3329,3331,3333],{"class":323,"line":959},[321,3320,2714],{"class":338},[321,3322,2222],{"class":334},[321,3324,366],{"class":338},[321,3326,822],{"class":327},[321,3328,2229],{"class":334},[321,3330,366],{"class":338},[321,3332,1794],{"class":369},[321,3334,809],{"class":338},[321,3336,3337,3339,3342,3344,3346,3349,3351,3353,3355,3357,3359,3362,3364,3366,3368,3371,3373,3375,3377,3379,3381],{"class":323,"line":966},[321,3338,2714],{"class":338},[321,3340,3341],{"class":334},"drawLine",[321,3343,2729],{"class":338},[321,3345,2084],{"class":327},[321,3347,3348],{"class":369}," 6",[321,3350,2737],{"class":338},[321,3352,2084],{"class":327},[321,3354,3165],{"class":338},[321,3356,2648],{"class":327},[321,3358,2651],{"class":369},[321,3360,3361],{"class":338},", x ",[321,3363,2084],{"class":327},[321,3365,3165],{"class":338},[321,3367,2648],{"class":327},[321,3369,3370],{"class":369}," 3",[321,3372,2737],{"class":338},[321,3374,2084],{"class":327},[321,3376,3165],{"class":338},[321,3378,2183],{"class":327},[321,3380,3348],{"class":369},[321,3382,373],{"class":338},[321,3384,3385,3387,3389,3391,3393,3395,3397,3399,3401,3403,3405,3407,3409,3411,3413,3415,3417,3419,3421,3423,3425],{"class":323,"line":982},[321,3386,2714],{"class":338},[321,3388,3341],{"class":334},[321,3390,2729],{"class":338},[321,3392,2084],{"class":327},[321,3394,3165],{"class":338},[321,3396,2648],{"class":327},[321,3398,3370],{"class":369},[321,3400,2737],{"class":338},[321,3402,2084],{"class":327},[321,3404,3165],{"class":338},[321,3406,2183],{"class":327},[321,3408,3348],{"class":369},[321,3410,3361],{"class":338},[321,3412,2084],{"class":327},[321,3414,3165],{"class":338},[321,3416,2183],{"class":327},[321,3418,3348],{"class":369},[321,3420,2737],{"class":338},[321,3422,2084],{"class":327},[321,3424,3348],{"class":369},[321,3426,373],{"class":338},[321,3428,3429],{"class":323,"line":993},[321,3430,2762],{"class":338},[321,3432,3433],{"class":323,"line":1003},[321,3434,3435],{"class":1677},"        \u002F\u002F Luego dibujamos el texto al lado del cuadro\n",[321,3437,3438,3440,3442,3444,3446],{"class":323,"line":1008},[321,3439,1200],{"class":338},[321,3441,1224],{"class":334},[321,3443,1131],{"class":338},[321,3445,2778],{"class":334},[321,3447,1232],{"class":338},[321,3449,3450,3452,3454,3456,3458],{"class":323,"line":1013},[321,3451,2040],{"class":338},[321,3453,357],{"class":327},[321,3455,2045],{"class":338},[321,3457,2048],{"class":334},[321,3459,2051],{"class":338},[321,3461,3462,3464,3466,3468,3470,3472,3474,3476,3478],{"class":323,"line":1018},[321,3463,2056],{"class":327},[321,3465,2799],{"class":338},[321,3467,357],{"class":327},[321,3469,2632],{"class":338},[321,3471,2084],{"class":327},[321,3473,3165],{"class":338},[321,3475,2084],{"class":327},[321,3477,2623],{"class":369},[321,3479,580],{"class":338},[321,3481,3482,3484,3486,3488,3490,3492,3494,3496,3498,3500,3502,3504,3506,3508,3510],{"class":323,"line":1025},[321,3483,2056],{"class":327},[321,3485,2820],{"class":338},[321,3487,357],{"class":327},[321,3489,864],{"class":338},[321,3491,1260],{"class":334},[321,3493,2180],{"class":338},[321,3495,2084],{"class":327},[321,3497,2064],{"class":338},[321,3499,2067],{"class":334},[321,3501,2618],{"class":338},[321,3503,2648],{"class":327},[321,3505,2651],{"class":369},[321,3507,2843],{"class":327},[321,3509,2651],{"class":369},[321,3511,580],{"class":338},[321,3513,3514,3516,3518,3521,3523],{"class":323,"line":1041},[321,3515,1200],{"class":338},[321,3517,2101],{"class":334},[321,3519,3520],{"class":338},"(((JCheckBox) c).",[321,3522,2859],{"class":334},[321,3524,2862],{"class":338},[321,3526,3527],{"class":323,"line":1052},[321,3528,1080],{"class":338},[304,3530,2873,3531,3533],{},[318,3532,2340],{},", simplemente asignamos la UI personalizada al checkbox:",[311,3535,3537],{"className":313,"code":3536,"language":315,"meta":316,"style":316},"JCheckBox myCheckBox = new JCheckBox(\"Accept Terms\");\nmyCheckBox.setUI(new MyCheckBoxUI());\n",[318,3538,3539,3558],{"__ignoreMap":316},[321,3540,3541,3544,3546,3548,3551,3553,3556],{"class":323,"line":324},[321,3542,3543],{"class":338},"JCheckBox myCheckBox ",[321,3545,357],{"class":327},[321,3547,360],{"class":327},[321,3549,3550],{"class":334}," JCheckBox",[321,3552,366],{"class":338},[321,3554,3555],{"class":1319},"\"Accept Terms\"",[321,3557,373],{"class":338},[321,3559,3560,3563,3565,3567,3569,3571],{"class":323,"line":342},[321,3561,3562],{"class":338},"myCheckBox.",[321,3564,1330],{"class":334},[321,3566,366],{"class":338},[321,3568,822],{"class":327},[321,3570,2966],{"class":334},[321,3572,1232],{"class":338},[304,3574,3575],{},"Con estos ejemplos, hemos visto cómo estilizar componentes Swing utilizando delegadores personalizados para crear una apariencia única y coherente con la paleta de colores definida en nuestro tema.",[3577,3578,3579],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}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 .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);}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}",{"title":316,"searchDepth":342,"depth":342,"links":3581},[3582,3583],{"id":1353,"depth":342,"text":1354},{"id":2329,"depth":342,"text":2330},"En este ejemplo, se muestra cómo estilizar componentes Swing utilizando delegadores para personalizar su apariencia.","md",null,{},{"title":230,"description":3584},"1KnpAdK8pavQ8ih4yTtVpOAKAxJMTxL0btKyW5CHGQs",[3591,3593],{"title":226,"path":227,"stem":228,"description":3592,"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.",{"title":234,"path":235,"stem":236,"description":3594,"icon":83,"children":-1},"Ejemplo de cómo usar hilos en Java usando Thread y Runnable, además de las funciones sleep y join e interrupciones.",1775101375714]