📄 java11.htm
字号:
y le agregamos los menú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ú de la ventana (<FONT FACE="Arial">Frame</FONT>):
<BR>
<PRE>
<FONT SIZE=2>setMenuBar(barraMenu);<BR>
</FONT>
</PRE>
<P>
Cada uno de los menús los declaramos previamente:<BR>
<PRE>
<FONT SIZE=2>Menu menuArchivo = new Menu("&Archivo");
...
Menu menuEdit = new Menu("&Edit");<BR>
</FONT>
</PRE>
<P>
Noten que el "&" 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ú tanto con el mouse
como con la tecla alt- o meta-, seguida de la tecla subrayada.
<P>
A su vez, el método <B><FONT FACE="Arial">add</FONT></B>
está presente también en la clase <B><FONT FACE="Arial">Menú</FONT></B>
y nos permite agregar los ítems:<BR>
<PRE>
<FONT SIZE=2>mArchivoAbrir = new MenuItem("&Abrir...");
mArchivoGrabar = new MenuItem("&Grabar...");
mArchivoSalir = new MenuItem("&Salir");
menuArchivo.add(mArchivoAbrir);
menuArchivo.add(mArchivoGrabar);
menuArchivo.add(new MenuItem("-"));
menuArchivo.add(mArchivoSalir);<BR>
</FONT>
</PRE>
<P>
A estos ítems los hemos declarado como globales en la clase
para usarlos luego en los eventos. Noten además que<BR>
<PRE>
<FONT SIZE=2>menuArchivo.add(new MenuItem("-"));<BR>
</FONT>
</PRE>
<P>
no agrega un ítem al menú sino una línea
de separació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étodos y vamos a lo que
decíamos antes: un menú puede ser un ítem
de otro menú, y así sucesivamente tantos subniveles
de menús como queramos.
<P>
Finalmente, en nuestro manejador de eventos simplemente necesitamos
verificar si se eligió un ítem probando si el evento
ocurrió sobre el ítem determinado:<BR>
<PRE>
<FONT SIZE=2>if ((e.id==Event.WINDOW_DESTROY)||(<B>e.target==mArchivoSalir</B>)) {
if (editado) System.out.println("Pedir confirmación!\n");
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ó Archivo/Salir (o alt-F4 o lo que sea) salgo
del programa
<LI>Si eligió Archivo/Abrir, llamo al método CargarArchivo
<LI>Si eligió Archivo/Grabar, llamo al método GrabarArchivo
<LI>Si eligió Edit/Cortar copio el texto seleccionado a
mi <I><FONT FACE="Arial">clipboard</FONT></I> y borro la selección
<LI>Si eligió Edit/Copiar sólo copio el texto seleccionado
a mi <I><FONT FACE="Arial">clipboard</FONT></I>
<LI>Si eligió Edit/Pegar borro el texto seleccionado e
inserto el de mi <I><FONT FACE="Arial">clipboard</FONT></I>
<LI>Si eligió 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 área de edición:
<BR>
<PRE>
<FONT SIZE=2>if ((e.id==Event.KEY_PRESS)&&(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í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 ítem
de menú. Lo utilizo para habilitar Edit/Pegar sólo
luego de cortar o copiar algo a mi <I><FONT FACE="Arial">clipboard</FONT></I>.
<LI>En el caso del í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álogos<BR>
</H2>
<P>
En Java disponemos de la clase Dialog para crear diá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álogos a medida usando la clase
<FONT FACE="Arial">Frame</FONT>, se supone que usar diálogos
debe ser más fácil. La realidad es que por ahora
no se puede usar mucho más que los diálogos estándar
(y el ú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álogo
sigue, en lugar de esperar que se cierre el diálogo y devuelva
la respuesta.
<P>
Por eso hemos puesto solamente una indicación adonde debería
haber un diálogo de confirmación:<BR>
<PRE>
<FONT SIZE=2>if (editado) System.out.println("Pedir confirmación!\n");
<BR>
</FONT>
</PRE>
<P>
En ese lugar deberíamos llamar por ejemplo a un diálogo
que nos permita decidir por sí o por no:
<PRE>
<FONT SIZE=2>if (editado) {
sino = new ConfirmarDlg(this,"Archivo modificado!");
if (sino.getResponse()==true) ....;
else ....;
}<BR>
</FONT>
</PRE>
<P>
o algo así. 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ás adelante, aunque Sun me prometió que en la versió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,"Abrir...",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ámetros se pasa el padre (<FONT FACE="Arial">this</FONT>,
o sea "esta ventana"), el título de la ventanita
de diá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álogo es para cargar
o grabar un archivo (Obviamente la tarea en sí de cargar
o grabar el archivo la tenenmos que hacer nosotros, el diálogo
sólo espera que elijamos un nombre).
<P>
El método <FONT FACE="Arial">show()</FONT> muestra el diálogo
y <B>espera</B> que seleccionemos y presionemos Ok o Cancel. Aquí
es donde fallan los demás diálogos ya que es programa
sigue sin esperar.
<P>
Finalmente, el diálogo se cierra pero no se elimina el
objeto (posiblemente está implementado usando el método
<FONT FACE="Arial">hide()</FONT>, que lo oculta de la vista pero
no se pierde hasta no salir del método que lo creó,
donde actuaría el <I>recogedor de basura</I> de la memoria).
Esto hace que aunque no lo veamos podamos llamar al mé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ó Cancel).<BR>
<BR>
<P>
Bueno, antes de meternos en otras bibliotecas, vamos a reservar
una clase más (la pró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 + -