⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java11.htm

📁 E-books about Java Programing in Spanish
💻 HTM
📖 第 1 页 / 共 2 页
字号:
y le agregamos los men&uacute;es <FONT FACE="Arial">Archivo</FONT>
y <FONT FACE="Arial">Edit</FONT> (que habremos creado previamente)
con:<BR>
<PRE>
<FONT SIZE=2>barraMenu.add(menuArchivo);
barraMenu.add(menuEdit);<BR>
</FONT>
</PRE>
<P>
Finalmente la declaramos como EL men&uacute; de la ventana (<FONT FACE="Arial">Frame</FONT>):
<BR>
<PRE>
<FONT SIZE=2>setMenuBar(barraMenu);<BR>
</FONT>
</PRE>
<P>
Cada uno de los men&uacute;s los declaramos previamente:<BR>
<PRE>
<FONT SIZE=2>Menu menuArchivo = new Menu(&quot;&amp;Archivo&quot;);	
...
Menu menuEdit = new Menu(&quot;&amp;Edit&quot;);<BR>
</FONT>
</PRE>
<P>
Noten que el &quot;&amp;&quot; no se visualiza, sino que la letra
que le sigue aparece subrayada: <U>A</U>rchivo, <U>E</U>dit. Esto
permite que se pueda seleccionar el men&uacute; tanto con el mouse
como con la tecla alt- o meta-, seguida de la tecla subrayada.
<P>
A su vez, el m&eacute;todo <B><FONT FACE="Arial">add</FONT></B>
est&aacute; presente tambi&eacute;n en la clase <B><FONT FACE="Arial">Men&uacute;</FONT></B>
y nos permite agregar los &iacute;tems:<BR>
<PRE>
<FONT SIZE=2>mArchivoAbrir = new MenuItem(&quot;&amp;Abrir...&quot;);
mArchivoGrabar = new MenuItem(&quot;&amp;Grabar...&quot;);
mArchivoSalir = new MenuItem(&quot;&amp;Salir&quot;);
menuArchivo.add(mArchivoAbrir);
menuArchivo.add(mArchivoGrabar);
menuArchivo.add(new MenuItem(&quot;-&quot;));
menuArchivo.add(mArchivoSalir);<BR>
</FONT>
</PRE>
<P>
A estos &iacute;tems los hemos declarado como globales en la clase
para usarlos luego en los eventos. Noten adem&aacute;s que<BR>
<PRE>
<FONT SIZE=2>menuArchivo.add(new MenuItem(&quot;-&quot;));<BR>
</FONT>
</PRE>
<P>
no agrega un &iacute;tem al men&uacute; sino una l&iacute;nea
de separaci&oacute;n, y no necesitamos crearlo como objeto permanente.
<P>
Si miramos la arquitectura de las clases, tanto <FONT FACE="Arial">MenuBar</FONT>
como <FONT FACE="Arial">MenuItem</FONT> descienden de <FONT FACE="Arial">MenuComponent</FONT>.
A su vez, <FONT FACE="Arial">Menu</FONT> desciende de <FONT FACE="Arial">MenuItem</FONT>,
por lo que implementa los mismos m&eacute;todos y vamos a lo que
dec&iacute;amos antes: un men&uacute; puede ser un &iacute;tem
de otro men&uacute;, y as&iacute; sucesivamente tantos subniveles
de men&uacute;s como queramos.
<P>
Finalmente, en nuestro manejador de eventos simplemente necesitamos
verificar si se eligi&oacute; un &iacute;tem probando si el evento
ocurri&oacute; sobre el &iacute;tem determinado:<BR>
<PRE>
<FONT SIZE=2>if ((e.id==Event.WINDOW_DESTROY)||(<B>e.target==mArchivoSalir</B>)) {
	if (editado) System.out.println(&quot;Pedir confirmaci&oacute;n!\n&quot;);
	if (enApplet) dispose();
	else System.exit(0);
    }
<B>if (e.target==mArchivoAbrir) CargarArchivo();
................
if (e.target==mEditTodo) contenido.selectAll();<BR>
</B></FONT>
</PRE>
<P>
En resumen lo que hago es:
<UL>
<LI>Si eligi&oacute; Archivo/Salir (o alt-F4 o lo que sea) salgo
del programa
<LI>Si eligi&oacute; Archivo/Abrir, llamo al m&eacute;todo CargarArchivo
<LI>Si eligi&oacute; Archivo/Grabar, llamo al m&eacute;todo GrabarArchivo
<LI>Si eligi&oacute; Edit/Cortar copio el texto seleccionado a
mi <I><FONT FACE="Arial">clipboard</FONT></I> y borro la selecci&oacute;n
<LI>Si eligi&oacute; Edit/Copiar s&oacute;lo copio el texto seleccionado
a mi <I><FONT FACE="Arial">clipboard</FONT></I>
<LI>Si eligi&oacute; Edit/Pegar borro el texto seleccionado e
inserto el de mi <I><FONT FACE="Arial">clipboard</FONT></I>
<LI>Si eligi&oacute; Edit/Seleccionar_todo marco todo el texto
</UL>
<P>
En todos los casos, si se modifica el texto del <FONT FACE="Arial">contenido</FONT>
lo indico poniendo <FONT FACE="Arial">editado</FONT> en <FONT FACE="Arial">true</FONT>;
lo mismo si presiono una tecla sobre el &aacute;rea de edici&oacute;n:
<BR>
<PRE>
<FONT SIZE=2>if ((e.id==Event.KEY_PRESS)&amp;&amp;(e.target==contenido)) editado=true;
<BR>
</FONT>
</PRE>
<P>
Un par de aclaraciones:
<UL>
<LI><FONT FACE="Arial">getSelectionStart()</FONT> y <FONT FACE="Arial">getSelectionEnd()</FONT>
marcan los l&iacute;mites del texto seleccionado (si no lo hay,
son iguales).
<LI><FONT FACE="Arial">getSelectedText()</FONT> devuelve el texto
seleccionado en el <FONT FACE="Arial">TextArea</FONT>.
<LI><FONT FACE="Arial">replaceText()</FONT> reemplaza una parte
(o todo) del <FONT FACE="Arial">TextArea</FONT> por un <FONT FACE="Arial">String</FONT>.
<LI><FONT FACE="Arial">insertText()</FONT> inserta un <FONT FACE="Arial">String</FONT>
en un lugar determinado del <FONT FACE="Arial">TextArea</FONT>.
<LI><FONT FACE="Arial">selectAll()</FONT> selecciona todo el texto
del <FONT FACE="Arial">TextArea</FONT>.
<LI><FONT FACE="Arial">MenuItem.enable()</FONT> habilita un &iacute;tem
de men&uacute;. Lo utilizo para habilitar Edit/Pegar s&oacute;lo
luego de cortar o copiar algo a mi <I><FONT FACE="Arial">clipboard</FONT></I>.
<LI>En el caso del &iacute;tem Archivo/Grabar, lo habilito o no
dependiendo de la variable <FONT FACE="Arial">editado</FONT>,
utilizando la otra forma de <I><FONT FACE="Arial">enable</FONT></I>:
<FONT FACE="Arial">MenuItem.enable(boolean)</FONT>.
</UL>
<P>
<BR>
<H2>Di&aacute;logos<BR>
</H2>
<P>
En Java disponemos de la clase Dialog para crear di&aacute;logos,
es decir, ventanitas temporarias para entradas de usuario, que
dependen de otra (de hecho la clase <FONT FACE="Arial">Dialog</FONT>
es heredera de la clase <FONT FACE="Arial">Window</FONT>).
<P>
Si bien podemos crear di&aacute;logos a medida usando la clase
<FONT FACE="Arial">Frame</FONT>, se supone que usar di&aacute;logos
debe ser m&aacute;s f&aacute;cil. La realidad es que por ahora
no se puede usar mucho m&aacute;s que los di&aacute;logos est&aacute;ndar
(y el &uacute;nico que vale la pena es <FONT FACE="Arial">FileDialog</FONT>),
ya que las implementaciones actuales de Java tienen un problema:
en algunas plataformas el programa que abre el di&aacute;logo
sigue, en lugar de esperar que se cierre el di&aacute;logo y devuelva
la respuesta.
<P>
Por eso hemos puesto solamente una indicaci&oacute;n adonde deber&iacute;a
haber un di&aacute;logo de confirmaci&oacute;n:<BR>
<PRE>
<FONT SIZE=2>if (editado) System.out.println(&quot;Pedir confirmaci&oacute;n!\n&quot;);
<BR>
</FONT>
</PRE>
<P>
En ese lugar deber&iacute;amos llamar por ejemplo a un di&aacute;logo
que nos permita decidir por s&iacute; o por no:
<PRE>
<FONT SIZE=2>if (editado) {
sino = new ConfirmarDlg(this,&quot;Archivo modificado!&quot;);
if (sino.getResponse()==true) ....;
else ....;
}<BR>
</FONT>
</PRE>
<P>
o algo as&iacute;. Esto mismo lo podemos hacer de otras maneras,
por ejemplo usando threads y comunicaciones entre procesos, pero
se complica mucho para esta altura del curso. Esperemos un poco
m&aacute;s adelante, aunque Sun me prometi&oacute; que en la versi&oacute;n
1.1 ya va a estar corregido (sale para fines del '96).
<P>
Por lo pronto, veamos un caso simple con la clase <FONT FACE="Arial">FileDialog</FONT>:
<BR>
<PRE>
<FONT SIZE=2>FileDialog fd = new FileDialog(this,&quot;Abrir...&quot;,FileDialog.LOAD);
fd.show();
nombreArchivo = fd.getFile();<BR>
</FONT>
</PRE>
<P>
Primero declaramos una variable de tipo <FONT FACE="Arial">FileDialog</FONT>,
y creamos la instancia con <FONT FACE="Arial">new</FONT>. Como
par&aacute;metros se pasa el padre (<FONT FACE="Arial">this</FONT>,
o sea &quot;esta ventana&quot;), el t&iacute;tulo de la ventanita
de di&aacute;logo, y una constante <FONT FACE="Arial">LOAD</FONT>
o <FONT FACE="Arial">SAVE</FONT> (son <I>static</I>, por lo que
se denominan directamente con el nombre de la clase y no necesariamente
de una instancia) que indica si el di&aacute;logo es para cargar
o grabar un archivo (Obviamente la tarea en s&iacute; de cargar
o grabar el archivo la tenenmos que hacer nosotros, el di&aacute;logo
s&oacute;lo espera que elijamos un nombre).
<P>
El m&eacute;todo <FONT FACE="Arial">show()</FONT> muestra el di&aacute;logo
y <B>espera</B> que seleccionemos y presionemos Ok o Cancel. Aqu&iacute;
es donde fallan los dem&aacute;s di&aacute;logos ya que es programa
sigue sin esperar.
<P>
Finalmente, el di&aacute;logo se cierra pero no se elimina el
objeto (posiblemente est&aacute; implementado usando el m&eacute;todo
<FONT FACE="Arial">hide()</FONT>, que lo oculta de la vista pero
no se pierde hasta no salir del m&eacute;todo que lo cre&oacute;,
donde actuar&iacute;a el <I>recogedor de basura</I> de la memoria).
Esto hace que aunque no lo veamos podamos llamar al m&eacute;todo
<FONT FACE="Arial">getFile()</FONT> sobre este objeto, que nos
devuelve el nombre del archivo seleccionado (o <FONT FACE="Arial">null</FONT>
si se presion&oacute; Cancel).<BR>
<BR>
<P>
Bueno, antes de meternos en otras bibliotecas, vamos a reservar
una clase m&aacute;s (la pr&oacute;xima) para <BR>
<BR>
<P>
Jorge Bourdette
<P>
<A HREF="jpb@amarillas.com" >jpb@amarillas.com</A><BR>
</BODY>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -