From 252e0d3506440a5f83f5829b8e20171de5910bd0 Mon Sep 17 00:00:00 2001
From: Santiago Veiga <santiagoveiga229@gmail.com>
Date: Wed, 17 Aug 2022 16:34:01 -0300
Subject: [PATCH] hola

---
 .checkstyle                                   |   7 +
 .classpath                                    |   6 +
 .project                                      |  17 ++
 .settings/org.eclipse.jdt.core.prefs          |  11 +
 .../UsuarioNoExisteException.class            | Bin 0 -> 387 bytes
 .../UsuarioRepetidoException.class            | Bin 0 -> 387 bytes
 bin/logica/ControladorUsuario.class           | Bin 0 -> 2128 bytes
 bin/logica/DataUsuario.class                  | Bin 0 -> 1568 bytes
 bin/logica/Fabrica.class                      | Bin 0 -> 591 bytes
 bin/logica/IControladorUsuario.class          | Bin 0 -> 456 bytes
 bin/logica/ManejadorUsuario.class             | Bin 0 -> 1837 bytes
 bin/logica/Usuario.class                      | Bin 0 -> 1060 bytes
 bin/presentacion/ConsultarUsuario$1.class     | Bin 0 -> 786 bytes
 bin/presentacion/ConsultarUsuario$2.class     | Bin 0 -> 804 bytes
 bin/presentacion/ConsultarUsuario.class       | Bin 0 -> 3353 bytes
 bin/presentacion/CrearUsuario$1.class         | Bin 0 -> 767 bytes
 bin/presentacion/CrearUsuario$2.class         | Bin 0 -> 780 bytes
 bin/presentacion/CrearUsuario.class           | Bin 0 -> 5237 bytes
 bin/presentacion/ListaUsuarios$1.class        | Bin 0 -> 899 bytes
 bin/presentacion/ListaUsuarios.class          | Bin 0 -> 2435 bytes
 bin/presentacion/Principal$1.class            | Bin 0 -> 838 bytes
 bin/presentacion/Principal$2.class            | Bin 0 -> 843 bytes
 bin/presentacion/Principal$3.class            | Bin 0 -> 820 bytes
 bin/presentacion/Principal$4.class            | Bin 0 -> 828 bytes
 bin/presentacion/Principal$5.class            | Bin 0 -> 863 bytes
 bin/presentacion/Principal.class              | Bin 0 -> 3562 bytes
 src/excepciones/UsuarioNoExisteException.java |  15 ++
 src/excepciones/UsuarioRepetidoException.java |  16 ++
 src/logica/ControladorUsuario.java            |  56 ++++
 src/logica/DataUsuario.java                   |  57 ++++
 src/logica/Fabrica.java                       |  27 ++
 src/logica/IControladorUsuario.java           |  35 +++
 src/logica/ManejadorUsuario.java              |  52 ++++
 src/logica/Usuario.java                       |  44 ++++
 src/presentacion/ConsultarUsuario.java        | 158 +++++++++++
 src/presentacion/CrearUsuario.java            | 247 ++++++++++++++++++
 src/presentacion/ListaUsuarios.java           |  94 +++++++
 src/presentacion/Principal.java               | 135 ++++++++++
 38 files changed, 977 insertions(+)
 create mode 100644 .checkstyle
 create mode 100644 .classpath
 create mode 100644 .project
 create mode 100644 .settings/org.eclipse.jdt.core.prefs
 create mode 100644 bin/excepciones/UsuarioNoExisteException.class
 create mode 100644 bin/excepciones/UsuarioRepetidoException.class
 create mode 100644 bin/logica/ControladorUsuario.class
 create mode 100644 bin/logica/DataUsuario.class
 create mode 100644 bin/logica/Fabrica.class
 create mode 100644 bin/logica/IControladorUsuario.class
 create mode 100644 bin/logica/ManejadorUsuario.class
 create mode 100644 bin/logica/Usuario.class
 create mode 100644 bin/presentacion/ConsultarUsuario$1.class
 create mode 100644 bin/presentacion/ConsultarUsuario$2.class
 create mode 100644 bin/presentacion/ConsultarUsuario.class
 create mode 100644 bin/presentacion/CrearUsuario$1.class
 create mode 100644 bin/presentacion/CrearUsuario$2.class
 create mode 100644 bin/presentacion/CrearUsuario.class
 create mode 100644 bin/presentacion/ListaUsuarios$1.class
 create mode 100644 bin/presentacion/ListaUsuarios.class
 create mode 100644 bin/presentacion/Principal$1.class
 create mode 100644 bin/presentacion/Principal$2.class
 create mode 100644 bin/presentacion/Principal$3.class
 create mode 100644 bin/presentacion/Principal$4.class
 create mode 100644 bin/presentacion/Principal$5.class
 create mode 100644 bin/presentacion/Principal.class
 create mode 100644 src/excepciones/UsuarioNoExisteException.java
 create mode 100644 src/excepciones/UsuarioRepetidoException.java
 create mode 100644 src/logica/ControladorUsuario.java
 create mode 100644 src/logica/DataUsuario.java
 create mode 100644 src/logica/Fabrica.java
 create mode 100644 src/logica/IControladorUsuario.java
 create mode 100644 src/logica/ManejadorUsuario.java
 create mode 100644 src/logica/Usuario.java
 create mode 100644 src/presentacion/ConsultarUsuario.java
 create mode 100644 src/presentacion/CrearUsuario.java
 create mode 100644 src/presentacion/ListaUsuarios.java
 create mode 100644 src/presentacion/Principal.java

diff --git a/.checkstyle b/.checkstyle
new file mode 100644
index 0000000..5783bc0
--- /dev/null
+++ b/.checkstyle
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<fileset-config file-format-version="1.2.0" simple-config="true" sync-formatter="false">
+  <fileset name="all" enabled="true" check-config-name="Google Checks" local="false">
+    <file-match-pattern match-pattern="." include-pattern="true"/>
+  </fileset>
+</fileset-config>
diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..51a8bba
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/.project b/.project
new file mode 100644
index 0000000..f55b383
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>swingDemo</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a21537
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/bin/excepciones/UsuarioNoExisteException.class b/bin/excepciones/UsuarioNoExisteException.class
new file mode 100644
index 0000000000000000000000000000000000000000..b21d317568f7adf393fdb93e0bf3de19f6d1f7e2
GIT binary patch
literal 387
zcma)1O-sW-5PcJ4qOrAF(VGWB#1AkRZ<Su8o<c9x-nVh7BXL)<8|mNjBzW)#_@l(x
zD0&dV9T@h#c{}gz+xyEafHU+{M1+04DD^|h)@YYsyGGS)$9A+}=k+Lzyo^%BgsnUE
zsPamgdHy{hB<F0{4+-0c#gAa(Yc})2(UcHh*c+W;39B6}BO&w(HhSFL&vbpIW|b!N
z3tOscD%Jsik+HvJM>r_{6L26wT<aOO{mMbeCbp?deaXRZ_pg7RhL_j_N!)NqN-|4N
s1q~5N0m<>nGghAD79o?KwQN_E>sS-K^Ql4yT|uH3zSr*B5ENna16g}s<NyEw

literal 0
HcmV?d00001

diff --git a/bin/excepciones/UsuarioRepetidoException.class b/bin/excepciones/UsuarioRepetidoException.class
new file mode 100644
index 0000000000000000000000000000000000000000..09e8ff121cf8c1867af82e29cdd9689f2766b109
GIT binary patch
literal 387
zcma)1O-sW-5Pg%zq{h~2MQ<Ji5kJ6Oyj6M;Jp~U|d*7x*U5UFT*@%D3Q^A8jz#k>f
zM$tnN+<{@=o451czJI*F0XRcHMnKr-=bY!cwuY<puBuh3?G4Y_>8ZW+BPXL6Az|x5
zJ*l)%W|sa82+_GV+6@WYhuN=S<VtO3gQGDays%SF(86j5D~JfaOdGzgA17Sis!73w
zer9u3jK$jHZ!&cEx*{B8{|PvdAXVe(w=Lx$BqLjwIbUh-xBJ&WPyI{mfh4X!Bqf=p
t$AX3kq=4x7WP$dJ+yW%hlZNezavf`ecfM5Upeso9!uOh88-fCCegb<<Ukd;L

literal 0
HcmV?d00001

diff --git a/bin/logica/ControladorUsuario.class b/bin/logica/ControladorUsuario.class
new file mode 100644
index 0000000000000000000000000000000000000000..9d931845fe46779b820c3fc4f5b6fe3cb37843f2
GIT binary patch
literal 2128
zcma)7T~`}L7=DIqSQ-K?fsj&KNReWIgp`k>B^7J~C;~xCL9y1lWT&_oc5{+VkKX%7
zywXd(fgU-wcN~xZz#mibnaytC5Io0=o!ObZ^S;l=yOY2E`TaG38SLq35$G#9dsflN
z<{jIuI3>e$DqGc>QL!8yn!vSv<E4=;8TMXwV|QN`T^+3gH~d2@&8GxfA6T~K&I^Q6
zquT;n-Z5naA+$%KqfOxInq|vE?O<0{o*26&DG*z8ibiRhMb+Bh)ZA~aszCqRe*(-A
zUPbO%RkvaUpat%y*3K|*x)sab%l)4ng*CGDeNmQO%dx9EdIW~0S{J#N)vPbeV_BB2
zWjc+}2zqf{M?xUsLtQs)xqnW{DEe?ipnZ=A?W$|oMUw7MjRw>%#^+SZn^D}tfIz3S
z>q=Xm5gfjRU?Y_eGN&U+JQsy{RI^H^th8Z>XqHOJTHWbn1cMk>_S_MOUzUDbMZ6nD
z3ZpdGD3_&e3S=$|ZPMB=nrp+jKzH&7BPpptGH}jxRPIa^6UYj*xlY|PfgTEUkpPwH
z#;}el>f(#-Gmc;qGm1i&5^pw&_wYUqHB8eFVC_^Oc%YK<T-d4sn+gfE7-bGci^D;U
zA4+hz$t~vK@7IFggX97oo32s(Zrv#RE#3K2R#xm6P6JWuQUQHpi-v0ixpXXD-i-zJ
zAwK}w=tdnMkxz39rO!$fpD2;9un`N+!ES}$<s{akSXaBMJs*~3sl?`1`x{Yws`g{t
z&r7pbGFD7!v-J%#f@RFKVUq$UZ6_%`2oWq|xSqy`&CfTH8hsiFbDoeg>5C|~u%moA
ziwOv~;i<r2A;@h9ty(?TH%zb9sufOMjT*sunr70Jc;koj#Rc?Qz4K`u{S_-Zp6Pf_
zI-5?dQk2V<x|R~nx7&p36Wj(bH$GwBqZ(&kYaFj|HO*OY4v!rn@*7`T5ak%*40JHK
zlOwq21#xwiEA|e$7!l*UO4seB`jhEfxs!i|_?*_KWe(9l7w!w6AbE`Lons8{#BLwq
z9qy0B#yA`zeT2Jjjxo72p3WR$n$cQc_z?FLkdOytfLOs|VHWFPp%{9Qr4>0O@CesE
zaP#%DJ~#rveav})^NgGGsO0g0Zz1NH#|L~go}9%3KIG0rR%nNKi>!`bosA@zI)9Ge
zqQ~zShH4C5AiwqWIN234CrBJ)d54rf=CjJDaD>l(J;vf0Uq+6^9tV7%ylHUjWkR5z
zNpDi{Tf{$rAtXIcWA#!EP75A>_752;{4G3j&%+-&!#~u(zlH54{BJ3x@@Iqi*9hwK
z_4EmH>DPZ?xe%HS|BR7zJUlh0W#VDQsZS#*HLR*Z(c1hmEaKtx>z_{l&Uh4KUmoEc
zpD|(r?hxY$1xt~~C>@*Ne@T`X=3TlnL0PA<MC7We>b`CG95t+Z%v4`4<10KPfo@FU
xYdoiKgVg66x~0+k3=Hi0zNHX4Wr0>5!XsbQVJho~PTAt2#xAP~NRBOd@h{uO=i2}P

literal 0
HcmV?d00001

diff --git a/bin/logica/DataUsuario.class b/bin/logica/DataUsuario.class
new file mode 100644
index 0000000000000000000000000000000000000000..1edee88d04843638a66c4f4c1158453fcdd70fd6
GIT binary patch
literal 1568
zcmZ`(Yg5xu5Ir|7eQ}|swgnWmMZh)%qJSV4Q6Azr!@viW8NQjev4#l^Q&N7H&M0+c
z#vkC1a@<WLt!emjA1AwKch7F_?>|3(0a(G?C=`LTWjD;4uI=iM{^6pnw@f>Vut4fm
zztlBLZ#J~U>Zwt41R_oQtlBcjXTSIH$Z46)Mnxc|pBt8C)@^}g&8W96{axK?I%Zw3
zlk0}rG@VU>P_c9@5Z<xtMgk#>NW_tdBKcpyE@uLx7)gM_N!&q3Abw#u2VM%<;$RM?
zW46vojI;GHS#NnMF+M4Am+>^=JO2EV`)1QPXrEP$)_c8bxi#7~-8v>c`0jyW=d*bs
zkl7y;jTBf9$Z0UkL4*~FH+r>YilsrLIF;~7Vh9l`jg0@5#`v5>l<_p-zS8(}Ng~Fd
zV~*WbHi~(HaeoiD+on}FTCCNg#A6h=0Z$~JVo4x+satL1@Dl~=ud+KDm4JK`C}V}Y
zn~7mnK*<*wc`mVz7c>w0`MJ@g!C2^L^JZy~%}cGqxot?~QHX(tN#q%LEiuEuHUT9L
zvMZsYAdon++pU_hXL3JNeFMJ8rK3Q;A^H<SP*_$vDJ-MAlU}s5cr>204%6);Sqj?c
z)DEP2jnR`1QXP!-j@jOE;;YMZkJcQq14)FDqIHa>FpXK7=qW;Fml5~zfNmV^p%=}f
zY{G<P+-PNvGv7g0UFcwdJ4=>1@*Ss!O%U^>%dK|(J#J!htK<qYZk>vI;!3$L($tHr
z(au&w>NiY(p@RZ0BjSQneQ6Kfq)qw<IM4c>^MTGZX#vhfzw=C>Gd0?CKJnV4U88)W
zUSZ(}v<{Zj&#tgW*9vXvm)-L#K5x--g&ltwwJ(h36{zt0<AvEIIas-fTK<mdUY8Rt
zx=0#pE<>(sb)$a7Q(xiNDTr&<&$UDz%eQdxoYGIlFIo^+(a*I?Tx+**@dR+k-?**b
F`wJH708an_

literal 0
HcmV?d00001

diff --git a/bin/logica/Fabrica.class b/bin/logica/Fabrica.class
new file mode 100644
index 0000000000000000000000000000000000000000..f03ef7c2660ad481b52af7a1353b5bc9da44fa10
GIT binary patch
literal 591
zcmZvY%S*#R5XQf4(xyq%r?n3i!CULWf_kfXDHepPhibv&CWg8-W+hGiyL=o97Q71n
zQQ~YG@OjzUnf>NB-_HBT%PW9=Y#2x}6nr@rF7NcY6H+vwGn6L$o_Bm6j5}w}#B(DC
zQv}n92d?1sJowquWyl<eKtzWOTB|)`(0lUAv!Eeo!$6jyI1qt%I=gke@SHoo$50ta
zm-{0g3Y8~CJ-QZChTPbTj+gV4veo`Q&;*rjq>-`cmSe~dBktau@Vf+5Q-q!jqEPz$
zN`@EH8BLN5n_sYh-n#}G49(<wfBP-e)ii4;XQAu$h5Cq{Y;H#_4O`?#qxF(V*`u3=
zl-dDROv?5sGK%T#Ijl#zq+ru&Q3UePQJ@o4i$#<vgoz?b3E(JJ0@Wv!-;iH`UCy!c
zj56g9q}5_xAvRH_?h18QW2Tx=jTKD6R#8ikyM$EZvJ2D+)>N3KtxQ~Re6y5IEHSLb
Gs`XE9yl`;<

literal 0
HcmV?d00001

diff --git a/bin/logica/IControladorUsuario.class b/bin/logica/IControladorUsuario.class
new file mode 100644
index 0000000000000000000000000000000000000000..94beba85207a459a09d9ca7376ed209fe992a705
GIT binary patch
literal 456
zcma)&y-or_6ot<PWE2$9Mq_QU+qjL5p%hI>2qqG3tj6WK8M2unvjg$jEPMbT%6Lge
z*<uT;x#!E7`*Xg&KRy9m<5ZzVxF}s=a-B_XoekcVdg1(2wbtG^g$`l3)Ek|Z+7{Wv
z>yq;z$a7(;;PtPOaFa}TzIpJ*7Nh@=^qJ7Rd(U|ljI))(0pXIjIv34V7FT)X6$i6$
ze^$a^!+v7lTyzkUh8@yrJa4Rnj?R(7QS+3U^q0f9Hl<&1i2o|WS(3gqb(ACKZtZiv
vHzgC!8^XNW=F=q*+LAudmTdRX6|F>d<lPt2L%&82g$!_9CsGf^-@?fcNiKmV

literal 0
HcmV?d00001

diff --git a/bin/logica/ManejadorUsuario.class b/bin/logica/ManejadorUsuario.class
new file mode 100644
index 0000000000000000000000000000000000000000..8b04b215f1604fdb03fcb253d3f726041db99aad
GIT binary patch
literal 1837
zcmZ`(%TgOh6g{m617eVQNFd^1Y;3S3gh^~doJb+IWE|rNoJ2Nxtr}@c9x|Sxq#0Lv
zpP$Gwt8AU8%W;LuE>-!Ctn&%6PtUXv2uG@t=63fz=iGDq&fow2eh6R<4-CWvW*o0=
zH|6TKbgg~a@;VQ?f$Z3xfrP;LzI-fK9qG1L@9phdO<y1tMEl*^mcW^Mcp&g?hX4m<
zfsuyYcBLP5EP-n$cPmjCqBZ=E?Y7HxO|Ci18w$a8yS{XrwiKA{9T-%{bHkOUW4pG$
zArQ|Ob_EhOuVsyZs!WU^rPSH3wG%wrvpV<Xo<l{Gb+0L%UDl^!y*N|}VN!@AV`37f
zfoXw>er0!L_aUoGA&ZQ{pEZ%h5DEQ<c2{7uZTVU=DbD5#|0_Dh<cz>r!<Wr(h^Pgm
zWUHke5SYsM(tD;9c2iiuB?A`)(kBfwv4|y>MFlmh6*zLMWx2lHk}VQZNWXpB@KNMZ
zG*F<3etlG8Vi_eGc@VJ0*Yn2`qrR6<uN+6$hX}yi!D};Ef<UZkEBj9gVoBbfZ@E_Q
z-U(bfPOo(zdD=5Y6|!dH9jud-<qIqwPt$^4t5Nk!!?1f(`NG$OauxXdCd#M?7<PB_
z(SiRYyk%dhoedKo;)cM`W9bAIA#y#Z!#SvVj>Ac@J-0lHDsCC5u^D~0`}-y~ahnXj
zceB%xWXLKleT$A<O$6Nzd8VViK^6hwv5wbf4znL>nwdRus!S%bDS~r6eR3|I9Q0;G
zdpbZ_88mF8Y~ZeeI$sYBFX%L_+qN3F?BLj5QN`f`#~{vEP>f#=5+fswhLKW(%jY2s
zV-zNL#uzQ~Uwx9|XQY4RLk#2mRf*u!M7W|>IlDTgN`i2=_zY9U7s!733^TtX*UwIe
z5+;$r6wV+MqNr?z_(mvV1ZVN4#@i&i`ec4W`Y(*VfFR%;<uHEA^?0Z#!knS99OKy|
zW#_^ZVw_;}IIkhUV3KlSa``u0*e?EpTxt0^F30itpvXD8bdF&2A>er}JQB%#tl$bU
zlk{p8Z&9eg+qkM(s*IKNv?3t>wHW@yf|7jP#Dx%fIy$M#XHJO68-jOnUE}>j!;;Ld
zD!k`-PvATD<!KasAW$dAO@Zyw;U8GoiLWPqz{E;6QOYK+lDF|~LNGY|{^h?bN<$*F
zZHZk6me{<@<Sfv<B5Pe{-%I>m!8-qMurk%?wTNA7R3|^e9cr7$MQq_ND_F!FK1Q7`
u<%zV79kSeGrfP0<{u4f_mgEpmzhsM(284mCflm#5#v3rk{Ra1Axc>^kK8X1M

literal 0
HcmV?d00001

diff --git a/bin/logica/Usuario.class b/bin/logica/Usuario.class
new file mode 100644
index 0000000000000000000000000000000000000000..e7dfde5820d507fdb11dc58b40f65bed84358462
GIT binary patch
literal 1060
zcma)3O>fgc6r8owq)trId=(0mQfRBheB{CffhwU&NJvpR6ms9#R@ln5tHkN=0*MHT
z13!Qtg_vDiO-Wpd%kI3lZ)V?{_xsP!UjSa=r~*r%9wigy%faW_TuxO|K}lfiTwcjR
zB;(28<M=%EQ-N}vT#TooKx?>sJWHo4p1cv*l$T)?sUQ((_+c=Q<cA=PQx(X7)VC^D
z>9N4;-a7YxGX0T2=_ColDs0?w;h-*H_xd9T?A65v${Mv?R5H|Yv57K!8LBuuonMT@
z=_fgkO!tW|qY)?7ah@!tU(}3B!+)*dTp|{*<RuSZ2{@B5J<V<C^!n?q3)EQh?%InM
zqmxxToY_*PTi}SEw#J$pGK|(_s%Oc3>WA-@9?Q+Q_fqc$`!vJmifvfh8zM_PV{ZDw
zyTS?wRh~6Q5#LL^JKhht-m?W7-tz^T-irm=-wdnEbDLT~os|u8w}_f(qs2VnWqjPl
zJw{Z*4*wAb-6ygPdO&0|`w+YN&ja4NYQy`E##aIh`m2oEHPUWYkV^|ZDkL{o$vcJQ
zy+U$(mAqR>er$}@h8?p{JyO}2wX~>evimgZiBZ_js;+G*=e7vG>m{veHCMF`sdaRV
emNr(~_q15+#_F=Z`qc7n(bB8YS_ftahkpUR9-`L(

literal 0
HcmV?d00001

diff --git a/bin/presentacion/ConsultarUsuario$1.class b/bin/presentacion/ConsultarUsuario$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..a8bf4c65affe58021b24949afc0893178fdd1509
GIT binary patch
literal 786
zcmah{+invv5Is&pmMjYi1;VYRwB#X8C6-FO6(N<VNEO?H1mxZEn$*?CMz*(n7ZMkV
z2R?w0LX6#T5kg@lTlVbu%sFS~+xIVD0X)PYL4#rat(8t{&xJBN9~<rJ%5(eL)!ZsG
z*h$c0=$-IWo>yGY^5@eNDSU!9!&;2;cRrV=gpltEPZ))AUTSF>+WuI%!2_yMEG@E2
zsgIOa{xQSm@ISd*6Nc8<l(GYciy0D}Ptim-LkB&E<}f653#H{zJ)cVZicc%auu>So
zs|jfe_eHQ32r_IeFFDvDf?XcPy^!{ev2$6HsA2I>{rka--K|NA8@QF=Ci%2feTLiU
z6P%crPiiNAS%2o{9|al7SY1|=A$@6TE96rZBwzcxnfC)<lCrNwWt`HpL+OuA8JydU
zdMYzhg69YH&|6dS()^qQ(!-D)XzJ^@;?7BjyX1e9);X|VFSLP%szIxRl%f~nh&5s)
z9c_O^Hu{W9?_<to+S`-^Ji`j@Sv;q>f~#~R;^;3B_UL`Y9DP8x{R!891ElfCA(cIf
kApNt%1xTQ=iZz01;tqi}uug=57Byu9_vjQz1`7230OVi52><{9

literal 0
HcmV?d00001

diff --git a/bin/presentacion/ConsultarUsuario$2.class b/bin/presentacion/ConsultarUsuario$2.class
new file mode 100644
index 0000000000000000000000000000000000000000..11ba1413a56c58f8a735c0cfda33398c048d5e01
GIT binary patch
literal 804
zcmah{+iDa+5Iwy!?qtU?J4TJS#F)71WCcfpZxKP32!Zhe#(nUux3}GNm~_i@?|S(w
z!5cpK0e+NN-L42CYeV0Ps#E7w)%PD?zX7<5B0-B`<5eTA)Q$^fbU85EPHV@T=XS~)
zWqLaaVut*P&v;pLJt?1zj-+r2+6?Q#%3r%u&IqA=ARJ*-$~viK!_anz%J%M1j%s0&
zU2?srv~u?uwu=AwZVwsaff>sV7*1tKu#_S~H$w+GLsWQ&Zl$z*JUt%C=75iC$*@ux
z!RsMu^8dLp_5>L=7pLs)5Wy}F;-1RprD=}km_!xTKlShVTI_BQQ(VBM1Q)4J3)N@1
zjFe%C3n49)%g3!}xPlFa)Jiv0Rs{)h@xp6kq-JeVY6^R1rj3vfl~;c5@1EZFv`NvP
z7PYZTPaa8kXvV&PH-fC%OqAf|J_WkQ)O>7yj|0hK$o4h0cTjU{rNvchLqz)oSf2ZC
z&}_A6caW0xWSF#8u%!K4ACdJxWBGmXIZbDqe1I8N=*+@9#TlHX9}&mu9HF9kkD2#B
zAp3&z{)#?f?GMf}aRA;>{<rAjUBFxY6*I@9XyUp_h!M8Pw}ory(H&E{uj3}YJYUa-
F)=z^WzRLgr

literal 0
HcmV?d00001

diff --git a/bin/presentacion/ConsultarUsuario.class b/bin/presentacion/ConsultarUsuario.class
new file mode 100644
index 0000000000000000000000000000000000000000..0dcd6b8d04c9f30c4384a23815468d002a832cef
GIT binary patch
literal 3353
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
D9G_f4

literal 0
HcmV?d00001

diff --git a/bin/presentacion/CrearUsuario$1.class b/bin/presentacion/CrearUsuario$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..15d031c3bf34e1d7e9d3336fa672cfd5f4e92881
GIT binary patch
literal 767
zcmaJ<+iuf95Iviim>5IS0)f&y<RMKZOeNlmkgBLimCQw4^1iVLcPnQXt)22E2z~>J
zi^KyTz(*lww?XuQ)Y7hY$1`WnIkUfh|M&^uA^IU20;}&VRitZ~DWj8-C28MOGijCS
z?}Z2ix+n5fCZ*Ix@_ceaSskJ!u<oPseVx!LS0@Kq&Go6OYSLr{TJ^E2`VSaCUD#ls
z(;g|U>c;{bgA4L@#sa~}<kW`1)fgczM`)rGqm8aWbKnv>snYapHl2`tEhi-jET<-u
z<(Rd&`#cypV$6SWyZ#;%>qsx?1=+X8PAM1I9Hjr%eCYJ=?~Ehd#+?u=0xJs@$5=&A
zU^|=UFR5U&teKmA=HIz?fwTqNw{}ref#{W)*^Hhjr+4Z6^zJ*dtm9B;rKyxIo>F~m
za%b6HFQznw%4BjhGMZ_WGB<w*&te4PBh7;xm9na+!WJ9f<aG(6+jai)3u^FcBjV^4
z|DGB?5)F61A|8Inwa-3hiT4)g03Wc-d+g5<uHy#Z1a6`?M>ybmk2(B;c=sD_{R4>n
pkB{8;lLzUYCC)({jWw(@OcNUn+Q23g1_GYQHtzAsk#rRJ`vbvcxAXu2

literal 0
HcmV?d00001

diff --git a/bin/presentacion/CrearUsuario$2.class b/bin/presentacion/CrearUsuario$2.class
new file mode 100644
index 0000000000000000000000000000000000000000..931245bffcb7eb94804fe84f880e1e157e51b32c
GIT binary patch
literal 780
zcmaJ<U2oGc6g_T2vxcx{0|sMXe3UKgB!VX1hLBJ-q)FjJV)TJGH#ME7%tp35e$fOx
zB5i<p;0N%d5Z9py9_S)Dwy*9v_ndqE<L9^U03INV&|p}4YlIcb@ltA)_l)4?l^t^<
zb!R(5$dDfLW1d%Bjq>M%Ls7a2O@@^^%HO$M91}W!Tsp!R(mJ7pVQ9JoX*>6cznEHJ
zhteKOCEX*2)$E+S%|1ie(?ih$!=(ffW?}?rCukvM2r{40E~FCA#zzBT_W7U^4D*F9
zdDSN`{yqtYUKr`0UaqrE!rHtx^g@_7+8l`?!&+AS*YmFTzq8qoaUC}zEHW%kb(~-c
zF~bZmOJS)!9<!2Q6>AK!6|OI>tfhz9YwwAXi{<mm66~cOn^HWH-tpYO^SkHel9OFk
zR@zE6dMez39{Q%O*LEsBk|odgdRjT7D?ZeJMo)Gal08ME>{Z-aVR4gMAJDo0mZp9J
z^oAO=T8Jrnv3^mFIuduc&X9D!VD?j;Ge`d><p3v`r+-qPV_e1+x-neE!i1q9yyr~2
zr%1lyn%{!YSpLg1OB#UpRR06o_*nBT{Kic92u)gV5o3Vcl-s}^bZ8H$)pxN$C$HD5
Gq3;)i`Lvq=

literal 0
HcmV?d00001

diff --git a/bin/presentacion/CrearUsuario.class b/bin/presentacion/CrearUsuario.class
new file mode 100644
index 0000000000000000000000000000000000000000..9c3f527dcf813ebbc99e707c74aa7d9caff31ce3
GIT binary patch
literal 5237
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

literal 0
HcmV?d00001

diff --git a/bin/presentacion/ListaUsuarios$1.class b/bin/presentacion/ListaUsuarios$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..15292aecc6b54a6016a2ce6e90a25a45d9de91df
GIT binary patch
literal 899
zcmaJ<ZEq4m5Pp_JuAC=et5qv~QBi?v&nEf_V^T>qv}jFQ`QW$ZSlexmTXVb6{w))&
z#t;4gf0S`{A<>wYOLlK|GV{zc&&;piKYjvuiVYt*hU%wGXptHoOO-}lsSSUxM?8~C
z*EW6R87jwo%%g;-htXdDSj5IhfnnKs`H6|dn9`%I*bsot7pce?3g$@a+7l|!y|_Y)
z;-1S?nimYK^;v<99z(vZ2BHXtD<OQ$1@KS~QACBotJ{EbSEl0aXxJCo0q-Y*VZN(k
zp7f|4`<^=UmKwv#jC!?AqE_avr*|UzsIs9LIF9GGy=^6EHF^PVV#&uXhNX*}4sjb*
zhB+R`LOY3`&2GJGYo12>MA8U$+G^NWFV$%)zzWuUtTJ3bHz33vD@`dALp2s#NzyT5
zs4c~NA!@kK5NKg~QcEXQzW%{#$Vj!Ss~G)1+)0;|wy#E6EMCcp!vC(!hGjy^ZKrXf
zH1T~S%#j+{DLr!XCF)SdJnFPnYBH7Zfy$=qM)EO)os_nxop7y%#v0AqqjL$YQn4ea
zz0J`nA|UT&x5YW<37YF)5jMY}^x4H+rMo~ez-!FY9XdO}0<O`E6vN^aVUO}H=0fue
z!tc0ohGlDcXSn+pszfw^4wc;@xLpUiI7ypA5&$0HA%S|RQ)~_mH0hrwx!3WSEKAuE
GqVEsXV%j7C

literal 0
HcmV?d00001

diff --git a/bin/presentacion/ListaUsuarios.class b/bin/presentacion/ListaUsuarios.class
new file mode 100644
index 0000000000000000000000000000000000000000..a3e10ea38806cccd708171621adcfb2d1a0caa50
GIT binary patch
literal 2435
zcmai0Yf}?f7=D(3iD6X;f>tS_#hOGhYO7VTR*0b31T9E3YON<>jjPKp?rs$AMSHPV
z|3QC1+i!KIglU=S59p8T^m%u)44DB-X3p-O_x_yceGmWq``6z9-o?u}+BEE1a1GC}
zeN{CbJ6AA0U(I@T<(iHcM?2;B)g!f-^B$XaEq7_s_6^ro)`Y9(4GqbvWBaaS&3dke
z{(|My%&N*w=EGez=eSK@BO1D@&V0oga~31_8g>*~oadVgRNg#e)@<e1T?QFmU+YX1
z?z~z}dE_i@JFN;63QN$iz16y)DuyKiD!!dJTvsvi-d2^dy6-zSbvB(bZPP!iVNW`W
zwO(nNl7{xYGiM|bLywMa*sdX#&XhJoL!XWgY)bNNr;azUOM~ti{<PtlPgTWYb?xaJ
znUcu+b-XF^t&~p^SM#nZ8Y0@GV=xjG)uK5c8jEP3j<+yG@3cB^+*NhU&s&aXTwX9-
z<?~1-!ekiXZ5;>1O(%6lN!%xpAx1nfkCw_EtlNW4?8N&)9fvTiAwi3)rZ4&SrUSHc
zmLeZ!e3!Hs3Ek&(9KlgSOXV@AZqIod;^|5Lh4OcFlI}PQtT8+pLegDPHeL3mGoerQ
z*w2YXnYQ7M#PJ@(2}5!s7<1e?!!4*MPTf!91WpOkr!{migakN)vvItyA+>6;>Pp84
zI2R@s+H2U|EJHkpdqrid8pCEvaf~(HtnxmfO#<hMRYa}9X`{w&amjKoiBU{QKErb6
z7j<+(m%U3mK9tkxBP16c*L*6)S)&%oJ<swJC^G*k$Mx??{+D%J!AIndnw!&*S(70<
zW5Ka$F|r2y%a!{^)erKWX#%yHZ`4XjOru9~D(Q$Lk-&A*I!{N28^;X|JuM9wGCzS^
zfs!;w5@k$?{U<uMU~3$TMBR8|3>{744yu9#D`4AftQwG}jJrB&xTm3;HIG(>urh)S
zo<F(01_9#{lg_nj&_x3GiQo(=K_A-+<jqulzGApn!{$mAoT{=)oM!Uf+-&#nnWSd_
z>yqOknAJMDT2*dMMN^Cuk!cOC#VqQ%=IAPN3|O7;@hA?O@7j1G>UfMr_9B}hViX5r
zI&(7`HEYLO5)biIQ2kW8<>q=Mkdyvg#}{}Owrh}yhJg^nh!_zs0%<^<FEtDqi&bMm
z=D*?Pn#oK#<BM_-<01;@NXNVs$72b?M;_M$fU~o&75OI%5&9?p*LuUjzGa5D)Ptg0
zXdYxjRjY>Q4IR;N{Pk38iFqjkfoUd59k*&sm@?W@Ew|rcIcARQNt<NMTgvkc4|~}P
zG2Wi-Xp_0lw>If3?rsj=ll*4y2k-0`K4X+^Ll@U>K-*8NHtznGT}CQ<a0$KH_6Byy
zvRjq`S@z1ZKbuN7kj-`tbPaTChq~q(IGk<Z*a}XRW3gqNY+xk2g3)p+zl`xET*&@`
z3$X?!MM>UMg$AamF<oB9)g{a}_h(br!u@hNb#oaXFX1+|Z?E7^nK@M&Fq(?DQzjK(
z1*JUTI)xst2UvQB#U5gD!`wNHoyhUxI)Z&TiZqVlIDg|fMLM3w4UDk8&%xy^e1-|U
z#0C6}B7UVei{AP|Ffb3BUxWn?LDl$M!1fR_ydZ=E`M?SumYHhrpJ4Yc<4J)Zvj-da
z>=(2bUr`&pVEgf$8A`q>K7kTpzsCLR%<<Nmm;=q2-8`<Z@HMT!p|&2xl${rR`<6TW
zAL&+{KD!e54&Mi2U_YM{u0t~ToiA-cM9CbysiiVG<Tm^etUux>KIJ~W!zcg#1Ar-Y
Awg3PC

literal 0
HcmV?d00001

diff --git a/bin/presentacion/Principal$1.class b/bin/presentacion/Principal$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..edd5656548b2b44e6d9455c31bbcc48e386ce665
GIT binary patch
literal 838
zcmZ`&TTc@~7(LT2-MTEd7O>!jq7_=IttP(J_(CAj6eX54QJ<#U2@Gy$o87JO;Q#TN
z7ciRm1N>3Ov)iU<BAd+p%=y0WoY`N$zyAdA98DV;fzmKkkutILbYPl?p*Ef#O26{V
zh9$6gDnHAnFU@iDZSPchv5lNS;d=Mo$Qar4l|b%=HadPOkge9b0@iNOR}Qk6bzvhf
zu+Y{<y%`O9Dm)tBD6|7l`du07WIfrm;u9SSthaB<tHlW6$k-?dto|S5U<tEHx8h<I
zw*~Uj^Hda7o(eRoH!!zq?WC;pW^|@m?(6+f4phs*8t&LwpA`M?sf)X~C*VXX?&?UV
zGFa6QwXTB=Y}zOb6tAV)JNMKurphiJq=F17cHE)zpN>N5B@!}nKRBZ)H{~cGh+9cB
z9osTxr7m+R*?}BRv~)VbDD>36PW+jldfP~Hq9J?6^Mi=R9;o;v=(~7~Cp2y#wV|}t
zkAFq!#LV@$l^E;3GDd~FzKkLjp$yu=Hp3^CVWZVt-QujtQE;5uxq@?%9=q&w>E<Tp
zICsYY%wvHozP9P*FC<Io)_!2={S}Js`Zp|FmneNjzFoh>{fqSKB8pTxOCr$dB!>zq
z9+7AZ%h*N<wKPzf7?Mo_<%xMnq#(v3dW*Adp7Vd`*x0ZLu5y{-<sFU|A5t9+&Kv@h
HlKA}rnY6ar

literal 0
HcmV?d00001

diff --git a/bin/presentacion/Principal$2.class b/bin/presentacion/Principal$2.class
new file mode 100644
index 0000000000000000000000000000000000000000..bdf396d5e05f2d3e0c285d181b78b3a03c6d8abb
GIT binary patch
literal 843
zcmaJ<U2oGc6g_T2vj)?a0cGqPD3Es0pozC4Bs6UjD8K}$4?G~bso6ZGNo8jn;$I=b
zKs@jR_)&;!Q-P3LBH6L8?>+aNd+(2*-@XHQfL?$K!_q`cBlA+Es>tJgt@2b&MAqI8
z;4?Ij#EFPAksrh_hDS0j15_E-oK>8bu{@#B_;FfNaH32pbEz4s<)Jd|`vjiMM(>l)
zLzS!Y5yMI}&#5zD@OO%ltbySIM}UP89vU1qG#R|eIy4fM%jd`Aq13O%Fp~_6Ns)?d
zAhfdgsnNHT7?$VcYHt&zhHyIerG8iFu^cgMM9EC4yH<9;GYGMS<p9?hTC;_6tYDR4
zL8PfPt|Yzra$T<Xu{l*#?x%ZNjAcK>IyM7rkSxpO-&c<7xWNz_Sq_v@PQ4$!vAovN
z=D20c6pWOa6ov}p3w=OMS^b|TLVHyl>s0P3Tg&>Nf#})vRHNNI%?d*dpULvD7;)US
zNkZF9B{KDag7}l1#$YEC#z=!rYMw{y99Xkydq~4qp;bdj*7I%@E6x&jw?2b+zo7on
z`CO#EN<P3_EYi;1Im9JgrW?Z*w5A9zDc)kXx}U(m;;MIswdwH;H~*s5i3uPm>yV;T
khuZobIYlK5+{PWk^$?M71s!zh?^CC@aF0%wwdF+LFMip>;Q#;t

literal 0
HcmV?d00001

diff --git a/bin/presentacion/Principal$3.class b/bin/presentacion/Principal$3.class
new file mode 100644
index 0000000000000000000000000000000000000000..80299e95a153815e6bd6338517503d5f5d752624
GIT binary patch
literal 820
zcmaJ<U2oGc6g_T3vj($v1Ij+x#==NDiGT)AMM$U&2`R8ius-nSre^b&Ig_0ZiGPK}
zmw4a@@S_mdp#mngM6zRFpL^~-_ud~rzkLVr0NXw)3=3yQTB!?>s$9qWM(I?Yi7edl
z;W0Fi#kq(xp%3G|!LdvWA2o*6(kk8+u{<Z&_(@ujbE0e^wKNR1;z-%>9+4-L*}H^!
zq_ip?Gb~5bK<z$**UN{p4u&fnK4t<`(cq|~$xw|PpphsoUye=((!3UfOft+Tc`CBL
zFv{J>M$e_hurwuBxI-y5M5$w6nzy+*l|zQLD48gA*U9d-`vDfP<YSScHCZUfGFBL7
zM4C!#!}|;mr^~&VThB;g4(y0@<lO)_vF>AyVevwse?c4@xWy1yS@e}vWi7nujVltP
zvaI}13c0<?M<$ielq=!vpE<be^iyeeb(-Z?>BASYILe0{ZP$Xp^-zgSy(cIBTvPXZ
znXpz`tW(dbv@U@)o33><a}`>31Z2HjPGF_91fA_q;GHj+{ZL}&Xs;0lIKe#aygUcE
zifeRZxQ^DC;VJn$PTu(l{uMX8&shD-5tMJ5V&x@I>o<1H<9Ig_5>pkoiKBuo+@Zfm
OEsfBjlgra(LEkSF?!u%1

literal 0
HcmV?d00001

diff --git a/bin/presentacion/Principal$4.class b/bin/presentacion/Principal$4.class
new file mode 100644
index 0000000000000000000000000000000000000000..7935acec4f9db52486f8d058e6a086d4c1b7126c
GIT binary patch
literal 828
zcmaJ<U2oGc6g_T3vj($vAC$2VHXwtvlgNbnf{Kt(84^-}NkAWXb5pZ<%A6^7H^jd}
zVt{zy2k@g1*P#LpwM24a-<*4V&$;)<&u`xWbg|>3!mx5uNF%issmgV{Unrfb6On~o
zA09*VNSul|6Z#;2IXsf7^-*KkD5K)c#`2U><HxC`<U|=OwJaEF_E4E{m&lXp>^;If
zR9e|b3~SLWP<z1O_4ARegW(E?kGTL<G&t&LGE^f6Xe3I@7vtlhEMALYCK(o!JQdkM
z6v~|^LC=-MusY+euuCO1M5$w67Vq-nSdJJrqhzYoJtw=@9t2pys*mdot?5EJ*09bn
zC(=|J6W(WdFk9}$+WNUR<IIZUjTw`cycggGwtQ@o{}(R%7szoFw-^E=?LZk-dg4WI
zomq_RS^u9TN_&-$i&Q>U&dT{e^Kj4kKo;%kG|P?B2hXKF%tst;*NVXPQi)7`pd|iG
z(-ibGVT?4`qTW?$T>@)1T?=XUDzxedD0;b^#7Y?nIy>j!oiCXGSYj6FT_X%&u}E)T
z?gK1gnNAE>(V8$kp?t^5JD<S6;+ppv8-F>1^4}TV^}gh3{l-ps9Pe#}#8kyLaa3>z
Scj@a<Ya?`M=jwD-(DMtmnZ{-S

literal 0
HcmV?d00001

diff --git a/bin/presentacion/Principal$5.class b/bin/presentacion/Principal$5.class
new file mode 100644
index 0000000000000000000000000000000000000000..5685dd74bb68433099dba78d0cace2ef60cf0d10
GIT binary patch
literal 863
zcmaJ<U279T6g`uy*=8M+ST)vu*s7~;Qtb*_Um}8(3PP;Kk39G`nT+X_?QGfER1kbn
zf03Y7eDDYOqr^LFR04?$Gdpv+=gd9l-XA}|eFty{8$L=53x}Dq%H%@o)Wo})Hc}so
zB;54jF*NqYk%$vvhVhgBzLL3*3d2ef6|eJH9T7BsAaeqDwat}L8AB!C(>A<C<lX7)
z9m=_<jn3~gEJd@DT0I7DD;=mR7*28cm<v!woui5dLpgE@^{zH*XLQh4*>llP6vKQs
zl_KehOuPFy=(&;@7H7N_Zc<5gQRvuJ*{d`=Py>e5s5@2awv*jy^#Uwl(Z>ab=5(PP
zOIT)@6H+Q`!`lpZXUm<e&Dkkl*b(VSZ70A*toc|a2@@|(WN}<_#?++9h9dieb<isu
zA+9n6R^>fybzzhjy>t#T@@)BkItlhH9c5BI)Xv}9-yzv>=8$jOMkcA%X82g;d+C7V
zhASg*4b~#jZwSO685)hPL|CgV)~KOnS|`974cAv1$P%q80*an2#<NsJg7*4n@b(wf
zJ{CErX|GTY@D}s5^Wq%f49?Px;T)P{hNpygoXz$p@UJ+3jFs`pJI3XIY&EI`ct<b4
oC-jGcwfP%4W+e_>!*${<Bcj|AT4>YXqwcTcCY@Z>t|t0^0SlSU#sB~S

literal 0
HcmV?d00001

diff --git a/bin/presentacion/Principal.class b/bin/presentacion/Principal.class
new file mode 100644
index 0000000000000000000000000000000000000000..f6bdbd855c43b181848381294b28b31179e21e5e
GIT binary patch
literal 3562
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
VXU5%J<##7oh;s0|8?N_)^?y_~r%wO?

literal 0
HcmV?d00001

diff --git a/src/excepciones/UsuarioNoExisteException.java b/src/excepciones/UsuarioNoExisteException.java
new file mode 100644
index 0000000..f972d3e
--- /dev/null
+++ b/src/excepciones/UsuarioNoExisteException.java
@@ -0,0 +1,15 @@
+package excepciones;
+
+/**
+ * Excepción utilizada para indicar la inexistencia de un usuario en el sistema.
+ * 
+ * @author TProg2017
+ *
+ */
+@SuppressWarnings("serial")
+public class UsuarioNoExisteException extends Exception {
+
+    public UsuarioNoExisteException(String string) {
+        super(string);
+    }
+}
diff --git a/src/excepciones/UsuarioRepetidoException.java b/src/excepciones/UsuarioRepetidoException.java
new file mode 100644
index 0000000..5eee866
--- /dev/null
+++ b/src/excepciones/UsuarioRepetidoException.java
@@ -0,0 +1,16 @@
+package excepciones;
+
+/**
+ * Excepción utilizada para indicar la existencia de un usuario repetido en el sistema.
+ * 
+ * @author TProg2017
+ *
+ */
+@SuppressWarnings("serial")
+public class UsuarioRepetidoException extends Exception {
+
+    public UsuarioRepetidoException(String string) {
+        super(string);
+    }
+
+}
diff --git a/src/logica/ControladorUsuario.java b/src/logica/ControladorUsuario.java
new file mode 100644
index 0000000..0e9b280
--- /dev/null
+++ b/src/logica/ControladorUsuario.java
@@ -0,0 +1,56 @@
+package logica;
+
+import excepciones.UsuarioNoExisteException;
+import excepciones.UsuarioRepetidoException;
+
+/**
+ * Controlador de usuarios.
+ * @author TProg2017
+ *
+ */
+public class ControladorUsuario implements IControladorUsuario {
+
+    public ControladorUsuario() {
+    }
+
+    public void registrarUsuario(String n, String ap, String ci) throws UsuarioRepetidoException {
+        ManejadorUsuario mu = ManejadorUsuario.getinstance();
+        Usuario u = mu.obtenerUsuario(ci);
+        if (u != null)
+            throw new UsuarioRepetidoException("El usuario " + ci + " ya esta registrado");
+
+        u = new Usuario(n, ap, ci);
+        mu.addUsuario(u);
+    }
+
+    public DataUsuario verInfoUsuario(String ci) throws UsuarioNoExisteException {
+        ManejadorUsuario mu = ManejadorUsuario.getinstance();
+        Usuario u = mu.obtenerUsuario(ci);
+        if (u != null)
+            return new DataUsuario(u.getNombre(), u.getApellido(), u.getCedulaIdentidad());
+        else
+            throw new UsuarioNoExisteException("El usuario " + ci + " no existe");
+
+    }
+
+    public DataUsuario[] getUsuarios() throws UsuarioNoExisteException {
+        ManejadorUsuario mu = ManejadorUsuario.getinstance();
+        Usuario[] usrs = mu.getUsuarios();
+
+        if (usrs != null) {
+            DataUsuario[] du = new DataUsuario[usrs.length];
+            Usuario usuario;
+
+            // Para separar lógica de presentación, no se deben devolver los Usuario,
+            // sino los DataUsuario
+            for (int i = 0; i < usrs.length; i++) {
+                usuario = usrs[i];
+                du[i] = new DataUsuario(usuario.getNombre(), usuario.getApellido(), usuario.getCedulaIdentidad());
+            }
+
+            return du;
+        } else
+            throw new UsuarioNoExisteException("No existen usuarios registrados");
+
+    }
+}
diff --git a/src/logica/DataUsuario.java b/src/logica/DataUsuario.java
new file mode 100644
index 0000000..00c17a4
--- /dev/null
+++ b/src/logica/DataUsuario.java
@@ -0,0 +1,57 @@
+package logica;
+
+/**
+ * Datatype para transportar la información de un usuario entre capa lógica y de presentación.
+ * En Java los datatypes se definen con setters y getters, y se denominan JavaBean.
+ * @author TProg2017
+ *
+ */
+public class DataUsuario {
+
+    private String nombre;
+    private String apellido;
+    private String cedulaIdentidad;
+
+    public DataUsuario() {
+        this.setNombre(new String());
+        this.setApellido(new String());
+        this.setCedulaIdentidad(new String());
+    }
+
+    public DataUsuario(String nombre, String apellido, String cedulaIdentidad) {
+        this.setNombre(nombre);
+        this.setApellido(apellido);
+        this.setCedulaIdentidad(cedulaIdentidad);
+    }
+
+    public String getNombre() {
+        return nombre;
+    }
+
+    public String getApellido() {
+        return apellido;
+    }
+
+    public String getCedulaIdentidad() {
+        return cedulaIdentidad;
+    }
+
+    /* Sirve para mostrar textualmente la información del usuario, por ejemplo en un ComboBox
+     */
+    public String toString() {
+        return getCedulaIdentidad() + " (" + getNombre() + " " + getApellido() + ")";
+    }
+
+    private void setNombre(String nombre) {
+        this.nombre = nombre;
+    }
+
+    private void setApellido(String apellido) {
+        this.apellido = apellido;
+    }
+
+    private void setCedulaIdentidad(String cedulaIdentidad) {
+        this.cedulaIdentidad = cedulaIdentidad;
+    }
+
+}
diff --git a/src/logica/Fabrica.java b/src/logica/Fabrica.java
new file mode 100644
index 0000000..f2bd57d
--- /dev/null
+++ b/src/logica/Fabrica.java
@@ -0,0 +1,27 @@
+package logica;
+
+/**
+ * Fábrica para la construcción de un controlador de usuarios (uno distinto para cada invocación).
+ * Se implementa en base al patrón Singleton.
+ * @author TProg2017
+ *
+ */
+public class Fabrica {
+
+    private static Fabrica instancia;
+
+    private Fabrica() {
+    };
+
+    public static Fabrica getInstance() {
+        if (instancia == null) {
+            instancia = new Fabrica();
+        }
+        return instancia;
+    }
+
+    public IControladorUsuario getIControladorUsuario() {
+        return new ControladorUsuario();
+    }
+
+}
diff --git a/src/logica/IControladorUsuario.java b/src/logica/IControladorUsuario.java
new file mode 100644
index 0000000..c75000b
--- /dev/null
+++ b/src/logica/IControladorUsuario.java
@@ -0,0 +1,35 @@
+package logica;
+
+import excepciones.UsuarioNoExisteException;
+import excepciones.UsuarioRepetidoException;
+
+/**
+ * @author TProg2017
+ *
+ */
+public interface IControladorUsuario {
+    
+    /**
+     * Registra al usuario en el sistema.
+     * @param n Nombre del usuario.
+     * @param ap Apellido del usuario.
+     * @param ci Cédula del usuario.
+     * @throws UsuarioRepetidoException Si la cédula del usuario se encuentra registrada en el sistema.
+     */
+    public abstract void registrarUsuario(String n, String ap, String ci) throws UsuarioRepetidoException;
+
+    /**
+     * Retorna la información de un usuario con la cédula indicada.
+     * @param ci Cédula del usuario.
+     * @return Información del usuario.
+     * @throws UsuarioNoExisteException Si la cédula del usuario no está registrada en el sistema.
+     */
+    public abstract DataUsuario verInfoUsuario(String ci) throws UsuarioNoExisteException;
+
+    /**
+     * Retorna la información de todos los usuarios registrados en el sistema.
+     * @return Información de los usuarios del sistema.
+     * @throws UsuarioNoExisteException Si no existen usuarios registrados en el sistema.
+     */
+    public abstract DataUsuario[] getUsuarios() throws UsuarioNoExisteException;
+}
diff --git a/src/logica/ManejadorUsuario.java b/src/logica/ManejadorUsuario.java
new file mode 100644
index 0000000..59906d3
--- /dev/null
+++ b/src/logica/ManejadorUsuario.java
@@ -0,0 +1,52 @@
+package logica;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Clase que conserva la colección global de los usuarios del sistema.
+ * Los usuarios se identifican por su cédula de identidad.
+ * Se implementa en base al patrón Singleton.
+ * @author TProg2017
+ *
+ */
+public class ManejadorUsuario {
+    private Map<String, Usuario> usuariosCI;
+    private static ManejadorUsuario instancia = null;
+
+    private ManejadorUsuario() {
+        usuariosCI = new HashMap<String, Usuario>();
+    }
+
+    public static ManejadorUsuario getinstance() {
+        if (instancia == null)
+            instancia = new ManejadorUsuario();
+        return instancia;
+    }
+
+    public void addUsuario(Usuario usu) {
+        String ci = usu.getCedulaIdentidad();
+        usuariosCI.put(ci, usu);
+    }
+
+    public Usuario obtenerUsuario(String ci) {
+        return ((Usuario) usuariosCI.get(ci));
+    }
+
+    public Usuario[] getUsuarios() {
+        if (usuariosCI.isEmpty())
+            return null;
+        else {
+            Collection<Usuario> usrs = usuariosCI.values();
+            Object[] o = usrs.toArray();
+            Usuario[] usuarios = new Usuario[o.length];
+            for (int i = 0; i < o.length; i++) {
+                usuarios[i] = (Usuario) o[i];
+            }
+
+            return usuarios;
+        }
+    }
+
+}
diff --git a/src/logica/Usuario.java b/src/logica/Usuario.java
new file mode 100644
index 0000000..5a08ffc
--- /dev/null
+++ b/src/logica/Usuario.java
@@ -0,0 +1,44 @@
+package logica;
+
+/**
+ * Representa a un usuario en el sistema con nombre, apellido y cédula de identidad.
+ * @author TProg2017
+ *
+ */
+public class Usuario {
+
+    private String nombre;
+    private String apellido;
+    private String cedulaIdentidad;
+
+    public Usuario(String n, String ap, String ci) {
+        this.nombre = n;
+        this.apellido = ap;
+        this.cedulaIdentidad = ci;
+    }
+
+    public String getNombre() {
+        return nombre;
+    }
+
+    public String getApellido() {
+        return apellido;
+    }
+
+    public String getCedulaIdentidad() {
+        return cedulaIdentidad;
+    }
+
+    public void setNombre(String n) {
+        nombre = n;
+    }
+
+    public void setApellido(String ap) {
+        apellido = ap;
+    }
+
+    public void setCedulaIdentidad(String ci) {
+        cedulaIdentidad = ci;
+    }
+
+}
diff --git a/src/presentacion/ConsultarUsuario.java b/src/presentacion/ConsultarUsuario.java
new file mode 100644
index 0000000..6b3c75f
--- /dev/null
+++ b/src/presentacion/ConsultarUsuario.java
@@ -0,0 +1,158 @@
+package presentacion;
+
+import javax.swing.JInternalFrame;
+
+import excepciones.UsuarioNoExisteException;
+import logica.DataUsuario;
+import logica.IControladorUsuario;
+
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JTextField;
+import javax.swing.JButton;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+/**
+ * JInternalFrame que permite consultar la información de un usuario del sistema.
+ * @author TProg2017
+ *
+ */
+@SuppressWarnings("serial")
+public class ConsultarUsuario extends JInternalFrame {
+
+    // Controlador de usuarios que se utilizará para las acciones del JFrame
+    private IControladorUsuario controlUsr;
+    
+    // Los componentes gráficos se agregan como atributos de la clase
+    // para facilitar su acceso desde diferentes métodos de la misma.
+    private JTextField textFieldCI;
+    private JTextField textFieldNombre;
+    private JTextField textFieldApellido;
+    private JLabel lblIngresoCI;
+    private JButton btnBuscar;
+    private JLabel lblNombre;
+    private JLabel lblApellido;
+    private JButton btnCerrar;
+    private JLabel lblInfoUsuario;
+
+    /**
+     * Create the frame.
+     */
+    public ConsultarUsuario(IControladorUsuario icu) {
+        // Se inicializa con el controlador de usuarios
+        controlUsr = icu;
+        
+        // Propiedades del JInternalFrame como dimensión, posición dentro del frame, etc.
+        setResizable(true);
+        setIconifiable(true);
+        setMaximizable(true);
+        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
+        setClosable(true);
+        setTitle("Consultar un Usuario");
+        setBounds(30, 30, 400, 280);
+
+        // En este caso usaremos el Absolute Layout y deberemos indicar
+        // la posición absoluta de todos los componentes
+        getContentPane().setLayout(null);
+
+        // Una etiqueta (JLabel) indicando que en el siguiente campo debe ingresarse 
+        // la cédula del usuario.
+        lblIngresoCI = new JLabel("Ingrese CI:");
+        lblIngresoCI.setBounds(10, 24, 170, 14);
+        getContentPane().add(lblIngresoCI);
+
+        // Una campo de texto (JTextField) para ingresar la cédula de un usuario. 
+        textFieldCI = new JTextField();
+        textFieldCI.setBounds(104, 17, 140, 30);
+        getContentPane().add(textFieldCI);
+
+        // Un botón (JButton) con un evento asociado que permite buscar un usuario.
+        // Dado que el código de registro tiene cierta complejidad, conviene delegarlo
+        // a otro método en lugar de incluirlo directamente de el método actionPerformed 
+        btnBuscar = new JButton("Buscar");
+        btnBuscar.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                cmdBuscarUsuarioActionPerformed(e);
+            }
+        });
+        btnBuscar.setBounds(256, 16, 95, 30);
+        getContentPane().add(btnBuscar);
+        
+        // Una etiqueta (JLabel) indicando que a continuación se verá la 
+        // información del usuarios buscado.
+        lblInfoUsuario = new JLabel("Información de Usuario");
+        lblInfoUsuario.setBounds(104, 70, 180, 14);
+        getContentPane().add(lblInfoUsuario);
+
+        // Una etiqueta (JLabel) indicando que en el siguiente campo se verá 
+        // el nombre del usuario encontrado.
+        lblNombre = new JLabel("Nombre:");
+        lblNombre.setBounds(10, 114, 65, 14);
+        getContentPane().add(lblNombre);
+
+        // Una campo de texto (JTextField) para mostrar el nombre del usuario. 
+        // El campo se hace no editable para impedir que se modifique.
+        textFieldNombre = new JTextField();
+        textFieldNombre.setEditable(false);
+        textFieldNombre.setBounds(80, 107, 271, 30);
+        getContentPane().add(textFieldNombre);
+
+        // Una etiqueta (JLabel) indicando que en el siguiente campo se verá 
+        // el apellido del usuario encontrado.
+        lblApellido = new JLabel("Apellido");
+        lblApellido.setBounds(10, 156, 65, 14);
+        getContentPane().add(lblApellido);
+        
+        // Una campo de texto (JTextField) para mostrar el apellido del usuario. 
+        // El campo se hace no editable para impedir que se modifique.
+        textFieldApellido = new JTextField();
+        textFieldApellido.setEditable(false);
+        textFieldApellido.setBounds(80, 149, 271, 30);
+        getContentPane().add(textFieldApellido);
+
+        // Un botón (JButton) con un evento asociado que permite cerrar el formulario (solo ocultarlo).
+        // Dado que antes de cerrar se limpia el formulario, se invoca un método reutilizable para ello. 
+        btnCerrar = new JButton("Cerrar");
+        btnCerrar.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                limpiarFormulario();
+                setVisible(false);
+            }
+        });
+        btnCerrar.setBounds(262, 191, 89, 23);
+        getContentPane().add(btnCerrar);
+    }
+
+    // Este método es invocado al querer buscar un usuario, funcionalidad
+    // provista por la operación del sistem verInfoUsuario().
+    // En caso de que haya un error de búsqueda se despliega
+    // un mensaje utilizando un panel de mensaje (JOptionPane).
+    // No es necesario verificar que el campo con la cédula sea un número ya
+    // que internamente el sistema almacena la cédula como un string.
+    protected void cmdBuscarUsuarioActionPerformed(ActionEvent e) {
+        DataUsuario du;
+        try {
+            du = controlUsr.verInfoUsuario(textFieldCI.getText());
+            textFieldNombre.setText(du.getNombre());
+            textFieldApellido.setText(du.getApellido());
+        } catch (UsuarioNoExisteException e1) {
+            // Si el usuario no existe, se muestra mensaje de error y se limpia el
+            // formulario.
+            JOptionPane.showMessageDialog(this, e1.getMessage(), "Buscar Usuario", JOptionPane.ERROR_MESSAGE);
+            limpiarFormulario();
+        }
+
+    }
+
+    // Permite borrar el contenido de un formulario antes de cerrarlo.
+    // Recordar que las ventanas no se destruyen, sino que simplemente 
+    // se ocultan, por lo que conviene borrar la información para que 
+    // no aparezca al mostrarlas nuevamente.
+    private void limpiarFormulario() {
+        textFieldNombre.setText("");
+        textFieldApellido.setText("");
+        textFieldCI.setText("");
+    }
+}
diff --git a/src/presentacion/CrearUsuario.java b/src/presentacion/CrearUsuario.java
new file mode 100644
index 0000000..096ccf3
--- /dev/null
+++ b/src/presentacion/CrearUsuario.java
@@ -0,0 +1,247 @@
+package presentacion;
+
+import javax.swing.JInternalFrame;
+
+import excepciones.UsuarioRepetidoException;
+import logica.IControladorUsuario;
+
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.SwingConstants;
+import javax.swing.JTextField;
+import javax.swing.JButton;
+import java.awt.GridBagLayout;
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+import javax.swing.JFrame;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+/**
+ * JInternalFrame que permite registrar un nuevo usuario al sistema.
+ * 
+ * @author TProg2017
+ *
+ */
+@SuppressWarnings("serial")
+public class CrearUsuario extends JInternalFrame {
+
+    // Controlador de usuarios que se utilizará para las acciones del JFrame
+    private IControladorUsuario controlUsr;
+    
+    // Los componentes gráficos se agregan como atributos de la clase
+    // para facilitar su acceso desde diferentes métodos de la misma.
+    private JTextField textFieldNombre;
+    private JTextField textFieldApellido;
+    private JTextField textFieldCI;
+    private JLabel lblIngreseNombre;
+    private JLabel lblIngreseApellido;
+    private JLabel lblIngreseCi;
+    private JButton btnAceptar;
+    private JButton btnCancelar;
+
+    /**
+     * Create the frame.
+     */
+    public CrearUsuario(IControladorUsuario icu) {
+        // Se inicializa con el controlador de usuarios
+        controlUsr = icu;
+
+        // Propiedades del JInternalFrame como dimensión, posición dentro del frame,
+        // etc.
+        setResizable(true);
+        setIconifiable(true);
+        setMaximizable(true);
+        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
+        setClosable(true);
+        setTitle("Registrar un Usuario");
+        setBounds(10, 40, 360, 150);
+
+        // En este caso utilizaremos el GridBagLayout que permite armar una grilla
+        // en donde las filas y columnas no son uniformes.
+        // Conviene trabajar este componente desde la vista de diseño gráfico y sólo
+        // manipular los valores para ajustar alguna cosa.
+        GridBagLayout gridBagLayout = new GridBagLayout();
+        gridBagLayout.columnWidths = new int[] { 100, 120, 120, 0 };
+        gridBagLayout.rowHeights = new int[] { 30, 30, 30, 0, 0 };
+        gridBagLayout.columnWeights = new double[] { 0.0, 0.0, 0.0, Double.MIN_VALUE };
+        gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE };
+        getContentPane().setLayout(gridBagLayout);
+
+        // Una etiqueta (JLabel) indicandp que en el siguiente campo debe ingresarse 
+        // el nombre del usuario. El texto está alineado horizontalmente a la derecha para
+        // que quede casi pegado al campo de texto.
+        lblIngreseNombre = new JLabel("Nombre:");
+        lblIngreseNombre.setHorizontalAlignment(SwingConstants.RIGHT);
+        GridBagConstraints gbc_lblIngreseNombre = new GridBagConstraints();
+        gbc_lblIngreseNombre.fill = GridBagConstraints.BOTH;
+        gbc_lblIngreseNombre.insets = new Insets(0, 0, 5, 5);
+        gbc_lblIngreseNombre.gridx = 0;
+        gbc_lblIngreseNombre.gridy = 0;
+        getContentPane().add(lblIngreseNombre, gbc_lblIngreseNombre);
+
+        // Una campo de texto (JTextField) para ingresar el nombre del usuario. 
+        // Por defecto es posible ingresar cualquier string.
+        textFieldNombre = new JTextField();
+        GridBagConstraints gbc_textFieldNombre = new GridBagConstraints();
+        gbc_textFieldNombre.gridwidth = 2;
+        gbc_textFieldNombre.fill = GridBagConstraints.BOTH;
+        gbc_textFieldNombre.insets = new Insets(0, 0, 5, 0);
+        gbc_textFieldNombre.gridx = 1;
+        gbc_textFieldNombre.gridy = 0;
+        getContentPane().add(textFieldNombre, gbc_textFieldNombre);
+        textFieldNombre.setColumns(10);
+
+        // Una etiqueta (JLabel) indicandp que en el siguiente campo debe ingresarse 
+        // el apellido del usuario. El texto está alineado horizontalmente a la derecha para
+        // que quede casi pegado al campo de texto.
+        lblIngreseApellido = new JLabel("Apellido:");
+        lblIngreseApellido.setHorizontalAlignment(SwingConstants.RIGHT);
+        GridBagConstraints gbc_lblIngreseApellido = new GridBagConstraints();
+        gbc_lblIngreseApellido.fill = GridBagConstraints.BOTH;
+        gbc_lblIngreseApellido.insets = new Insets(0, 0, 5, 5);
+        gbc_lblIngreseApellido.gridx = 0;
+        gbc_lblIngreseApellido.gridy = 1;
+        getContentPane().add(lblIngreseApellido, gbc_lblIngreseApellido);
+
+        // Una campo de texto (JTextField) para ingresar el apellido del usuario. 
+        // Por defecto es posible ingresar cualquier string.
+        textFieldApellido = new JTextField();
+        GridBagConstraints gbc_textFieldApellido = new GridBagConstraints();
+        gbc_textFieldApellido.gridwidth = 2;
+        gbc_textFieldApellido.fill = GridBagConstraints.BOTH;
+        gbc_textFieldApellido.insets = new Insets(0, 0, 5, 0);
+        gbc_textFieldApellido.gridx = 1;
+        gbc_textFieldApellido.gridy = 1;
+        getContentPane().add(textFieldApellido, gbc_textFieldApellido);
+        textFieldApellido.setColumns(10);
+
+        // Una etiqueta (JLabel) indicando que en el siguiente campo debe ingresarse 
+        // la cédula del usuario. El texto está alineado horizontalmente a la derecha para
+        // que quede casi pegado al campo de texto.
+        lblIngreseCi = new JLabel("C.I.:");
+        lblIngreseCi.setHorizontalAlignment(SwingConstants.RIGHT);
+        GridBagConstraints gbc_lblIngreseCi = new GridBagConstraints();
+        gbc_lblIngreseCi.fill = GridBagConstraints.BOTH;
+        gbc_lblIngreseCi.insets = new Insets(0, 0, 5, 5);
+        gbc_lblIngreseCi.gridx = 0;
+        gbc_lblIngreseCi.gridy = 2;
+        getContentPane().add(lblIngreseCi, gbc_lblIngreseCi);
+
+        // Una campo de texto (JTextField) para ingresar la cédula del usuario. 
+        // Por defecto es posible ingresar cualquier string.
+        // Al campo se le incluye un Tooltip que, al pasar el mouse por encima, despliega un mensaje.
+        textFieldCI = new JTextField();
+        textFieldCI.setToolTipText("Ingrese un número sin puntos ni guiones");
+        textFieldCI.setColumns(10);
+        GridBagConstraints gbc_textFieldCI = new GridBagConstraints();
+        gbc_textFieldCI.gridwidth = 2;
+        gbc_textFieldCI.fill = GridBagConstraints.BOTH;
+        gbc_textFieldCI.insets = new Insets(0, 0, 5, 0);
+        gbc_textFieldCI.gridx = 1;
+        gbc_textFieldCI.gridy = 2;
+        getContentPane().add(textFieldCI, gbc_textFieldCI);
+
+        // Un botón (JButton) con un evento asociado que permite registrar el usuario.
+        // Dado que el código de registro tiene cierta complejidad, conviene delegarlo
+        // a otro método en lugar de incluirlo directamente de el método actionPerformed 
+        btnAceptar = new JButton("Aceptar");
+        btnAceptar.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent arg0) {
+                cmdRegistroUsuarioActionPerformed(arg0);
+            }
+        });
+
+        GridBagConstraints gbc_btnAceptar = new GridBagConstraints();
+        gbc_btnAceptar.fill = GridBagConstraints.BOTH;
+        gbc_btnAceptar.insets = new Insets(0, 0, 0, 5);
+        gbc_btnAceptar.gridx = 1;
+        gbc_btnAceptar.gridy = 3;
+        getContentPane().add(btnAceptar, gbc_btnAceptar);
+
+        // Un botón (JButton) con un evento asociado que permite cerrar el formulario (solo ocultarlo).
+        // Dado que antes de cerrar se limpia el formulario, se invoca un método reutilizable para ello. 
+        btnCancelar = new JButton("Cancelar");
+        btnCancelar.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                limpiarFormulario();
+                setVisible(false);
+            }
+        });
+        GridBagConstraints gbc_btnCancelar = new GridBagConstraints();
+        gbc_btnCancelar.fill = GridBagConstraints.BOTH;
+        gbc_btnCancelar.gridx = 2;
+        gbc_btnCancelar.gridy = 3;
+        getContentPane().add(btnCancelar, gbc_btnCancelar);
+    }
+
+    // Este método es invocado al querer registrar un usuario, funcionalidad
+    // provista por la operación del sistem registrarUsuario().
+    // Previamente se hace una verificación de los campos, particularmente que no sean vacíos
+    // y que la cédula sea un número. 
+    // Tanto en caso de que haya un error (de verificación o de registro) o no, se despliega
+    // un mensaje utilizando un panel de mensaje (JOptionPane).
+    protected void cmdRegistroUsuarioActionPerformed(ActionEvent arg0) {
+        // TODO Auto-generated method stub
+
+        // Obtengo datos de los controles Swing
+        String nombreU = this.textFieldNombre.getText();
+        String apellidoU = this.textFieldApellido.getText();
+        String ciU = this.textFieldCI.getText();
+
+        if (checkFormulario()) {
+            try {
+                controlUsr.registrarUsuario(nombreU, apellidoU, ciU);
+
+                // Muestro éxito de la operación
+                JOptionPane.showMessageDialog(this, "El Usuario se ha creado con éxito", "Registrar Usuario",
+                        JOptionPane.INFORMATION_MESSAGE);
+
+            } catch (UsuarioRepetidoException e) {
+                // Muestro error de registro
+                JOptionPane.showMessageDialog(this, e.getMessage(), "Registrar Usuario", JOptionPane.ERROR_MESSAGE);
+            }
+
+            // Limpio el internal frame antes de cerrar la ventana
+            limpiarFormulario();
+            setVisible(false);
+        }
+    }
+
+    // Permite validar la información introducida en los campos e indicar
+    // a través de un mensaje de error (JOptionPane) cuando algo sucede.
+    // Este tipo de chequeos se puede realizar de otras formas y con otras librerías de Java, 
+    // por ejemplo impidiendo que se escriban caracteres no numéricos al momento de escribir en
+    // en el campo de la cédula, o mostrando un mensaje de error apenas el foco pasa a otro campo.
+    private boolean checkFormulario() {
+        String nombreU = this.textFieldNombre.getText();
+        String apellidoU = this.textFieldApellido.getText();
+        String ciU = this.textFieldCI.getText();
+
+        if (nombreU.isEmpty() || apellidoU.isEmpty() || ciU.isEmpty()) {
+            JOptionPane.showMessageDialog(this, "No puede haber campos vacíos", "Registrar Usuario",
+                    JOptionPane.ERROR_MESSAGE);
+            return false;
+        }
+
+        try {
+            Integer.parseInt(ciU);
+        } catch (NumberFormatException e) {
+            JOptionPane.showMessageDialog(this, "La CI debe ser un numero", "Registrar Usuario",
+                    JOptionPane.ERROR_MESSAGE);
+            return false;
+        }
+
+        return true;
+    }
+
+    // Permite borrar el contenido de un formulario antes de cerrarlo.
+    // Recordar que las ventanas no se destruyen, sino que simplemente 
+    // se ocultan, por lo que conviene borrar la información para que 
+    // no aparezca al mostrarlas nuevamente.
+    private void limpiarFormulario() {
+        textFieldNombre.setText("");
+        textFieldApellido.setText("");
+        textFieldCI.setText("");
+    }
+}
diff --git a/src/presentacion/ListaUsuarios.java b/src/presentacion/ListaUsuarios.java
new file mode 100644
index 0000000..dd0f454
--- /dev/null
+++ b/src/presentacion/ListaUsuarios.java
@@ -0,0 +1,94 @@
+package presentacion;
+
+import javax.swing.JFrame;
+import javax.swing.JInternalFrame;
+
+import excepciones.UsuarioNoExisteException;
+import logica.DataUsuario;
+import logica.IControladorUsuario;
+
+import java.awt.BorderLayout;
+import javax.swing.JLabel;
+import javax.swing.SwingConstants;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+import javax.swing.JComboBox;
+
+/**
+ * JInternalFrame que permite listar todos los usuarios del sistema.
+ * @author TProg2017
+ *
+ */
+@SuppressWarnings("serial")
+public class ListaUsuarios extends JInternalFrame {
+
+    // Controlador de usuarios que se utilizará para las acciones del JFrame
+    private IControladorUsuario controlUsr;
+    
+    // Los componentes gráficos se agregan como atributos de la clase
+    // para facilitar su acceso desde diferentes métodos de la misma.
+    private JComboBox<DataUsuario> comboBoxUsuarios;
+    private JLabel lblUsuarios;
+    private JButton btnCerrar;
+
+    /**
+     * Create the frame.
+     */
+    public ListaUsuarios(IControladorUsuario icu) {
+        // Se inicializa con el controlador de usuarios
+        controlUsr = icu;
+        
+        // Propiedades del JInternalFrame como dimensión, posición dentro del frame, etc.
+        setResizable(true);
+        setIconifiable(true);
+        setMaximizable(true);
+        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
+        setClosable(true);
+        setTitle("Consultar un Usuario");
+        setBounds(30, 30, 300, 100);
+        
+        // En este caso se utiliza un BorderLayout en donde los componentes se ubican según una orientación.
+        getContentPane().setLayout(new BorderLayout(0, 0));
+
+        // Una etiqueta (JLabel) muestra el título de la lista que vendrá después.
+        // Se ubica al norte del layout y el texto se centra horizontalmente.
+        lblUsuarios = new JLabel("Usuarios Registrados");
+        lblUsuarios.setHorizontalAlignment(SwingConstants.CENTER);
+        getContentPane().add(lblUsuarios, BorderLayout.NORTH);
+
+        // Un combo (JComboBox) muestra la lista de usuarios registrados en el sistema.
+        // Es posible utilizar otros componentes gráficos, esta es sólo una opción.
+        // Se ubica al centro del layout.
+        comboBoxUsuarios = new JComboBox<DataUsuario>();
+        getContentPane().add(comboBoxUsuarios, BorderLayout.CENTER);
+
+        // Un botón (JButton) con un evento asociado que permite limpiar la lista 
+        // de usuarios y cerrar la ventana (sólo la oculta).
+        // Se ubica al sur del layout.
+        btnCerrar = new JButton("Cerrar");
+        btnCerrar.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                comboBoxUsuarios.removeAllItems();
+                setVisible(false);
+            }
+        });
+        getContentPane().add(btnCerrar, BorderLayout.SOUTH);
+    }
+
+    // Método que permite cargar un nuevo modelo para el combo con la información
+    // actualizada de usuarios, provista por la operación del sistema getUsuarios(). 
+    // Se invoca el método antes de hacer visible el JInternalFrame
+    public void cargarUsuarios() {
+        DefaultComboBoxModel<DataUsuario> model;
+        try {
+            model = new DefaultComboBoxModel<DataUsuario>(controlUsr.getUsuarios());
+            comboBoxUsuarios.setModel(model);
+        } catch (UsuarioNoExisteException e) {
+            // No se imprime mensaje de error sino que simplemente no se muestra ningún elemento
+        }
+
+    }
+
+}
diff --git a/src/presentacion/Principal.java b/src/presentacion/Principal.java
new file mode 100644
index 0000000..c5289ea
--- /dev/null
+++ b/src/presentacion/Principal.java
@@ -0,0 +1,135 @@
+package presentacion;
+
+import java.awt.EventQueue;
+
+import javax.swing.JFrame;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+
+import logica.Fabrica;
+import logica.IControladorUsuario;
+
+import javax.swing.JMenu;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * Clase principal (Frame) con el método Main.
+ * @author TProg2017
+ *
+ */
+public class Principal {
+
+    private JFrame frmGestionDeUsuarios;
+    private IControladorUsuario ICU;
+    private CrearUsuario creUsrInternalFrame;
+    private ConsultarUsuario conUsrInternalFrame;
+    private ListaUsuarios lisUsrInternalFrame;
+
+    /**
+     * Launch the application.
+     */
+    public static void main(String[] args) {
+        EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                try {
+                    Principal window = new Principal();
+                    window.frmGestionDeUsuarios.setVisible(true);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+
+    /**
+     * Create the application.
+     */
+    public Principal() {
+        initialize();
+
+        // Inicialización
+        Fabrica fabrica = Fabrica.getInstance();
+        ICU = fabrica.getIControladorUsuario();
+        
+        // Se crean los tres InternalFrame y se incluyen al Frame principal ocultos.
+        // De esta forma, no es necesario crear y destruir objetos lo que enlentece la ejecución.
+        // Cada InternalFrame usa un layout diferente, simplemente para mostrar distintas opciones.
+        creUsrInternalFrame = new CrearUsuario(ICU);
+        creUsrInternalFrame.setVisible(false);
+
+        conUsrInternalFrame = new ConsultarUsuario(ICU);
+        conUsrInternalFrame.setVisible(false);
+
+        lisUsrInternalFrame = new ListaUsuarios(ICU);
+        lisUsrInternalFrame.setVisible(false);
+        frmGestionDeUsuarios.getContentPane().setLayout(null);
+
+        frmGestionDeUsuarios.getContentPane().add(conUsrInternalFrame);
+        frmGestionDeUsuarios.getContentPane().add(creUsrInternalFrame);
+        frmGestionDeUsuarios.getContentPane().add(lisUsrInternalFrame);
+    }
+
+    /**
+     * Initialize the contents of the frame.
+     */
+    private void initialize() {
+        
+        // Se crea el Frame con las dimensiones indicadas.
+        frmGestionDeUsuarios = new JFrame();
+        frmGestionDeUsuarios.setTitle("Gestion de Usuarios 1.0");
+        frmGestionDeUsuarios.setBounds(100, 100, 450, 400);
+        frmGestionDeUsuarios.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+        // Se crea una barra de menú (JMenuBar) con dos menú (JMenu) desplegables.
+        // Cada menú contiene diferentes opciones (JMenuItem), los cuales tienen un 
+        // evento asociado que permite realizar una acción una vez se seleccionan. 
+        JMenuBar menuBar = new JMenuBar();
+        frmGestionDeUsuarios.setJMenuBar(menuBar);
+
+        JMenu menuSistema = new JMenu("Sistema");
+        menuBar.add(menuSistema);
+
+        JMenuItem menuSalir = new JMenuItem("Salir");
+        menuSalir.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent arg0) {
+                // Salgo de la aplicación
+                frmGestionDeUsuarios.setVisible(false);
+                frmGestionDeUsuarios.dispose();
+            }
+        });
+        menuSistema.add(menuSalir);
+
+        JMenu menuUsuarios = new JMenu("Usuarios");
+        menuBar.add(menuUsuarios);
+
+        JMenuItem menuItemRegistrar = new JMenuItem("Registrar Usuario");
+        menuItemRegistrar.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                // Muestro el InternalFrame para registrar un usuario
+                creUsrInternalFrame.setVisible(true);
+            }
+        });
+        menuUsuarios.add(menuItemRegistrar);
+
+        JMenuItem menuItemVerInfo = new JMenuItem("Ver Información");
+        menuItemVerInfo.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                // Muestro el InternalFrame para ver información de un usuario
+                conUsrInternalFrame.setVisible(true);
+            }
+        });
+        menuUsuarios.add(menuItemVerInfo);
+
+        JMenuItem mntmListaUsuarios = new JMenuItem("ListarUsuarios");
+        mntmListaUsuarios.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                // Muestro el InternalFrame para ver la lista de todos los usuarios,
+                // cargando previamente la lista
+                lisUsrInternalFrame.cargarUsuarios();
+                lisUsrInternalFrame.setVisible(true);
+            }
+        });
+        menuUsuarios.add(mntmListaUsuarios);
+    }
+}
-- 
GitLab