亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? java9.htm

?? E-books about Java Programing in Spanish
?? HTM
字號:
<HTML>
<HEAD>
<TITLE>Java desde Cero</TITLE>
</HEAD>
<BODY background=/iconos/1.gif  TEXT=000000 LINK=FF0000 VLINK=A62A2A>

<H1>Completando la ventana<BR>
</H1>
<P>
Vamos a empezar por completar nuestro m&eacute;todo <FONT FACE="Arial">ActualizaBoton</FONT>,
que modificar&aacute; el texto del bot&oacute;n <FONT FACE="Arial">ok</FONT>
a medida que seleccionemos las ciudades y la fecha:<BR>
<PRE>
<FONT SIZE=2>void ActualizaBoton() {
    StringBuffer b = new StringBuffer(&quot;Viaje: de &quot;);
    if (cs.getDescription() != null) b.append(cs.getDescription());
    else b.append(&quot;?&quot;);
    b.append(&quot; a &quot;);
    if (cl.getDescription() != null) b.append(cl.getDescription());
    else b.append(&quot;?&quot;);
    b.append(&quot; el &quot;);
    if (dp.getDescription() != null) b.append(dp.getDescription());
    else b.append(&quot;?/?/?&quot;);
    ok.setLabel(b.toString());
  }<BR>
</FONT>
</PRE>
<P>
Nuestro m&eacute;todo comienza por crear un <FONT FACE="Arial">StringBuffer</FONT>
con las palabras &quot;Viaje: de &quot;, y va agregando el resto:
<UL>
<LI>la ciudad de partida, llamando al m&eacute;todo <FONT FACE="Arial">getDescription</FONT>
de <FONT FACE="Arial">cs</FONT> (ciudad de salida)
<LI>el texto constante &quot; a &quot;
<LI>la ciudad de llegada, llamando al m&eacute;todo <FONT FACE="Arial">getDescription</FONT>
de <FONT FACE="Arial">cl</FONT> (ciudad de llegada)
<LI>el texto constante &quot; el &quot;
<LI>la fecha seleccionada, llamando al m&eacute;todo <FONT FACE="Arial">getDescription</FONT>
de <FONT FACE="Arial">dp</FONT> (d&iacute;a de partida)
</UL>
<P>
Si en cualquier caso recibe un string nulo, pone un signo de pregunta
(o ?/?/? para la fecha).
<P>
El m&eacute;todo <FONT FACE="Arial">setLabel</FONT>, sobre el
objeto <FONT FACE="Arial">ok</FONT> de tipo <I>Label</I>, modifica
la &quot;etiqueta&quot; del bot&oacute;n.
<P>
Realmente nos devuelven <FONT FACE="Arial">null</FONT> los m&eacute;todos
que llamamos si no hay selecci&oacute;n hecha?
<P>
Veamos:<BR>
<PRE>
<FONT SIZE=2>class SelecPueblo extends Panel {
private List	listaPueblos;
............................
public String getDescription() {
return listaPueblos.getSelectedItem();
}
}<BR>
</FONT>
</PRE>
<P>
El m&eacute;todo <FONT FACE="Arial">getSelectedItem</FONT> de
la clase <I>List</I> devuelve <FONT FACE="Arial">null</FONT> si
no hay &iacute;tems seleccionados, as&iacute; que ac&aacute; andamos
bien. En cuanto a la clase <FONT FACE="Arial">DiaPartida</FONT>,
de entrada inicializa el valor del texto en la fecha actual, as&iacute;
que aqu&iacute; no se dar&iacute;a nunca este caso... Aunque al
crear el objeto <FONT FACE="Arial">Ventana8</FONT> estamos poniendo
un texto fijo en el bot&oacute;n, y no el que devuelve el objeto
<FONT FACE="Arial">dp</FONT>.
<P>
Ser&iacute;a mejor, para ser m&aacute;s consistente, modificar
el constructor de <FONT FACE="Arial">Ventana8</FONT> para que
arme el texto mediante el m&eacute;todo <FONT FACE="Arial">ActualizaBot&oacute;n</FONT>:
<BR>
<PRE>
<FONT SIZE=2>Ventana8 (String titulo, boolean enApplet) {
........................................
<B>	ok = new Button(&quot;cualquiera&quot;);
	ActualizaBoton();
	add(&quot;South&quot;,ok);
</B>	pack();
	show();
  }<BR>
</FONT>
</PRE>
<P>
Esto ya se ve mejor! Y de paso probamos el m&eacute;todo...<BR>
<H3>Un poquito de actividad</H3>
<P>
Ahora s&iacute;, pasemos a completar nuestro manejador de eventos:
<BR>
<PRE>
<FONT SIZE=2>public boolean handleEvent(Event e) {
	if (e.id == Event.WINDOW_DESTROY) {
		if (enApplet) dispose();
		else System.exit(0);
	}
<B>if ( (e.target==dp)||(e.target==cs)||(e.target==cl) )
ActualizaBoton();
if (e.target==ok)
Activar();
}
</B>return super.handleEvent(e);
}<BR>
</FONT>
</PRE>
<P>
Simplemente, si detectamos un evento sobre alguno de nuestros
paneles actualizamos el texto del bot&oacute;n; y si se presiona
dicho bot&oacute;n llamamos al m&eacute;todo Activar que se supone
que va a tomar los datos de la base de datos, indicarnos servicios
disponibles, etc.
<P>
Algo importante a notar es que el simple hecho de mover el mouse
sobre uno de los paneles ya llama a ActualizaBoton (se nota porque
titila el texto, sobre todo en una m&aacute;quina lenta). Adem&aacute;s,
si hacen click sobre el bot&oacute;n <B>Hoy</B> o <B>Ma&ntilde;ana</B>
<I>sin</I> mover el mouse, el texto del bot&oacute;n <FONT FACE="Arial">ok</FONT>
no se actualiza ya que el evento va dirigido al bot&oacute;n presionado
y no al panel.
<P>
Una forma de filtrar s&oacute;lo los eventos que nos interesan
ser&iacute;a usar, por ejemplo:<BR>
<PRE>
<FONT SIZE=2>if ((e.target=cs.listaPueblos) &amp;&amp; (e.id==Event.LIST_SELECT)) ActualizaBoton();
<BR>
</FONT>
</PRE>
<P>
que est&aacute; dirigida a la <I>lista</I> y no al <I>panel</I>
en general, y tiene en cuenta el tipo de evento.
<P>
Lamentablemente, <FONT FACE="Arial">listaPueblos</FONT> es privada
dentro de la clase <FONT FACE="Arial">SelecPueblo</FONT> y por
lo tanto dentro de <FONT FACE="Arial">cs</FONT>. Pero es mejor
as&iacute;, porque declararla p&uacute;blica y leerla desde afuera
ser&iacute;a bastante sucio (as&iacute; como la leemos podr&iacute;amos
escribirla).
<P>
Hay varias formas de mejorar esto sin cometer la torpeza de declarar
p&uacute;blica a <FONT FACE="Arial">listaPueblos</FONT>. Una posibilidad
es verificar, usando <FONT FACE="Arial">cs.getDescription()</FONT>,
si el texto cambi&oacute; (y s&oacute;lo en ese caso modificar
el texto del bot&oacute;n).
<P>
Otra, es hacer que los objetos de la clase <FONT FACE="Arial">SelecPueblo</FONT>
pasen a sus padres cualquier evento sobre ellos, o mejor solamente
la selecci&oacute;n de un elemento de la lista; para eso basta
agregar a la clase <FONT FACE="Arial">SelecPueblo</FONT>:<BR>
<PRE>
<FONT SIZE=2>public boolean handleEvent(Event e) {
if ((e.target==listaPueblos) &amp;&amp; (e.id==Event.LIST_SELECT)) {
e.target=this;
}
return super.handleEvent(e);
}<BR>
</FONT>
</PRE>
<P>
En resumen: si el evento en el panel es una selecci&oacute;n de
la lista (tanto con mouse como moviendo la selecci&oacute;n con
las flechas), cambio el <FONT FACE="Arial">target</FONT> del evento
para que indique el <I>panel</I> (y no la <I>lista</I>); si no,
lo paso a la clase antecesora.
<P>
Lo mismo podemos hacer con <FONT FACE="Arial">handleEvent</FONT>
para la clase <FONT FACE="Arial">DiaPartida</FONT>:<BR>
<PRE>
<FONT SIZE=2>public boolean handleEvent (Event e) {
if (e.target == hoy) {
elDia.setText(GetHoy());
e.target=this;
}
if (e.target == diasiguiente) {
elDia.setText(GetManana());
e.target=this;
}
if (e.target == elDia) {
e.target=this;
}
return super.handleEvent(e);
}<BR>
</FONT>
</PRE>
<P>
Esto no anda como esperar&iacute;amos! El campo de texto no se
comporta muy bien...
<P>
Esto es porque el c&oacute;digo dependiente de la plataforma procesa
los eventos de mouse <I>antes</I> de llamar a <FONT FACE="Arial">handleEvent</FONT>,
pero procesa los de teclado <I>despu&eacute;s</I> de llamar a
<FONT FACE="Arial">handleEvent</FONT>.
<P>
Lo que significa que, en el caso del campo de texto, <FONT FACE="Arial">handleEvent</FONT>
(y por lo tanto <FONT FACE="Arial">ActualizaBot&oacute;n</FONT>)
se llama <I>antes</I> de modificar el texto!
<P>
Para corregir esto, deber&iacute;amos procesar nosotros las teclas
presionadas (lo que podr&iacute;amos aprovechar para verificar
que se presiona una tecla v&aacute;lida).
<P>
Cuidado! En futuras versiones de Java podr&iacute;a implementarse
el mismo comportamiento para el mouse, y por lo tanto tendr&iacute;amos
que repensar la estrategia.
<P>
Para colmo, s&oacute;lo los eventos que la plataforma env&iacute;a
llegan a Java; por ejemplo, Motif no env&iacute;a eventos de movimiento
de mouse dentro de un campo de texto... lo que significa que nunca
podr&iacute;amos capturar ese tipo de eventos. S&oacute;lo el
componente <B>Canvas</B> pasa todos los eventos.
<P>
Para simplificar, s&oacute;lo actualizaremos el texto del bot&oacute;n
cuando se presiona <B>Enter</B> (Event.key=10):<BR>
<PRE>
<FONT SIZE=2>if ((e.target == elDia)&amp;&amp;(e.id==Event.KEY_PRESS)) {
	if (e.key==10) e.target=this;
}<BR>
</FONT>
</PRE>
<P>
Ahora debemos modificar el m&eacute;todo <FONT FACE="Arial">handleEvent</FONT>
en nuestra clase <FONT FACE="Arial">Ventana8</FONT> para que soporte
todos estos eventos:<BR>
<PRE>
<FONT SIZE=2>public boolean handleEvent(Event e) {
	if (e.id == Event.WINDOW_DESTROY) {
		if (enApplet) dispose();
		else System.exit(0);
	}
	if ( ((e.target==dp)&amp;&amp;((e.id==Event.ACTION_EVENT)||(e.id==Event.KEY_PRESS)))
||((e.target==cs)&amp;&amp;(e.id==Event.LIST_SELECT))
||((e.target==cl)&amp;&amp;(e.id==Event.LIST_SELECT)) )
			ActualizaBoton();
	if (e.target==ok)
Activar();
	return super.handleEvent(e);
}<BR>
</FONT>
</PRE>
<P>
Obviamente, procesar todas las teclas nosotros ser&iacute;a bastante
m&aacute;s complicado... de todos modos, el m&eacute;todo en <FONT FACE="Arial">DiaPartida</FONT>
ser&iacute;a m&aacute;s o menos as&iacute;:<BR>
<PRE>
<FONT SIZE=2>if ((e.target == elDia)&amp;&amp;(e.id==Event.KEY_PRESS)) {
	// 1- leer el contenido del campo con: elDia.getText()
	// 2- modificarlo de acuerdo a la tecla presionada: e.key
	// 3- poner el resultado en el campo con: elDia.setText(texto)
	// 4- modificar el objeto del evento al panel con: e.target=this;
	// 5- enviar el evento al objeto padre (no la clase padre),
	//     en este caso Ventana8, mediante: <B>getParent().deliverEvent(e)
</B>	// 6- evitar proceso posterior del evento mediante: <B>result(true)
</B>}
</FONT>
</PRE>
<P>
Me ahorro explicar estos dos &uacute;ltimos pasos; se complica
bastante todo porque hay que manejar la posici&oacute;n del cursor
dentro del campo de texto, etc&eacute;tera. Con lo que hicimos
es bastante... creo!
<H3>Y para terminar...</H3>
<P>
Bueno, s&oacute;lo nos queda por definir el m&eacute;todo <FONT FACE="Arial">Activar()</FONT>.
Primero vamos a llamar a <FONT FACE="Arial">ActualizaBoton()</FONT>
por si alguien lo &uacute;ltimo que hizo fue entrar un texto sin
presionar <B>Enter</B>, y dejo para otro d&iacute;a m&aacute;s
tranquilo consultar un archivo o base de datos con lo que vamos
a mostrar al usuario de nuestro programa.
<P>
Por ahora simplemente vamos a mostrar una ventana con la selecci&oacute;n
y un lindo bot&oacute;n de OK.
<P>
Primero vamos a hacer una muy peque&ntilde;a modificaci&oacute;n
a <FONT FACE="Arial">ActualizaBoton()</FONT> para que nos devuelva
el valor del texto del bot&oacute;n (para no calcularlo de nuevo):
<BR>
<PRE>
<FONT SIZE=2>String ActualizaBoton() {
    StringBuffer b = new StringBuffer(&quot;Viaje: de &quot;);
..............................................
    ok.setLabel(b.toString());
  }<BR>
</FONT>
</PRE>
<P>
Y ahora vamos a definir nuestro m&eacute;todo, teniendo en cuenta
que nuestro bot&oacute;n s&oacute;lo actuar&aacute; si se han
entrado todos los datos:<BR>
<PRE>
<FONT SIZE=2>void Activar() {
if ( (cs.getDescription() != null) &amp;&amp; (cl.getDescription() != null) )
// tambi&eacute;n podr&iacute;amos verificar que la fecha sea v&aacute;lida aqu&iacute;
Result8 resultado = new Result8(&quot;Resultado&quot;,ActualizaBoton());
else ok.setLabel(&quot;Especificaci&oacute;n incompleta!&quot;);
  }<BR>
</FONT>
</PRE>
<P>
S&oacute;lo nos falta definir una sencilla clase <FONT FACE="Arial">Result8</FONT>
para nuestra ventanita resultado:<BR>
<PRE>
<FONT SIZE=2>// archivo Result8.java, compilar con javac Result8.java
import java.awt.*;

class Result8 extends Frame {

Button	r_ok;

Result8 (String titulo, String texto) {	// constructor
super(titulo);
Label r_lbl = new Label(texto);
r_ok = new Button(&quot;Ok&quot;);
	add(&quot;Center&quot;, r_lbl);
		add(&quot;South&quot;, r_ok);
	pack();
		show();
}

public boolean handleEvent(Event e) {
if ((e.id == Event.WINDOW_DESTROY)||(e.target==r_ok))
dispose();	// cierra esta ventana pero no la aplicaci&oacute;n
	return super.handleEvent(e);
}
}<BR>
</FONT>
</PRE>
<P>
Noten que us&eacute; <FONT FACE="Arial">dispose</FONT> y no <FONT FACE="Arial">System.exit</FONT>!
Esto permite cerrar s&oacute;lo la ventana de resultado, y seguir
usando la aplicaci&oacute;n hasta que se nos ocurra cerrarla mediante
meta-F4, alt-F4, el men&uacute; de sistema de la ventana, la cruz
de Windows 95 o lo que le resulte a su sistema operativo.<BR>
<H3>Finale con tutto</H3>
<P>
Espero que se haya entendido! Esta aplicaci&oacute;n cost&oacute;
bastante pero en el camino hemos tenido oportunidad de aprender
unas cuantas cosas... Si logran juntar todo el c&oacute;digo y
generar las varias clases que definimos, todo tiene que andar
sobre rieles e independientemente de la plataforma.
<P>
Si no... av&iacute;senme, y subo tambi&eacute;n los fuentes o
las clases.<BR>
<P>
Por las dudas, pueden probar esta aplicaci&oacute;n como applet
cargando:<BR>
<PRE>
<FONT SIZE=2>http://www.amarillas.com/rock/java/Ejemplo8.htm<BR>
<BR>
</FONT>
</PRE>
<P>
Y basta por hoy. En el cap&iacute;tulo 10 vamos a empezar a manejar
el I/O de Java.
<P>
Todav&iacute;a nos queda mucho por ver! (Y no hemos terminado
con el AWT...)<BR>
<BR>
<P>
Jorge Bourdette
<P>
<A HREF="mailto:jpb@amarillas.com" >jpb@amarillas.com</A>
</BODY>
</HTML>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
eeuss鲁片一区二区三区| 91久久精品网| 亚洲午夜精品一区二区三区他趣| 日韩一级片网站| 91黄视频在线| 成人性视频免费网站| 日韩精品成人一区二区三区| 国产精品国产馆在线真实露脸| 欧美一级片免费看| 一本大道久久a久久综合| 国产剧情一区二区| 视频一区二区不卡| 亚洲香蕉伊在人在线观| 国产精品大尺度| 久久久精品蜜桃| 精品理论电影在线观看| 51精品视频一区二区三区| 99久久精品国产精品久久| 精品亚洲porn| 麻豆精品一二三| 亚洲不卡一区二区三区| 亚洲女人的天堂| 中文字幕第一区| 国产欧美日本一区二区三区| 日韩精品一区在线观看| 欧美日韩免费视频| 色就色 综合激情| 色综合视频一区二区三区高清| 国产福利一区二区三区| 国产在线播放一区二区三区| 日韩黄色一级片| 首页欧美精品中文字幕| 亚洲午夜精品一区二区三区他趣| 亚洲精品一二三区| 亚洲欧美激情插| 亚洲精品网站在线观看| 亚洲男人电影天堂| 最新不卡av在线| 一区二区三区中文字幕电影| 亚洲精品国产视频| 亚洲伦在线观看| 亚洲欧美一区二区三区久本道91| 亚洲欧洲日韩综合一区二区| 国产精品久久久久久一区二区三区 | 欧美在线视频不卡| 在线精品视频小说1| 一本色道综合亚洲| 欧美专区在线观看一区| 欧美系列日韩一区| 欧美少妇bbb| 91精品国产综合久久精品app| 欧美男同性恋视频网站| 欧美高清hd18日本| 日韩美女主播在线视频一区二区三区| 日韩午夜激情免费电影| 久久人人超碰精品| 国产精品久久久久久久午夜片| 亚洲天堂成人网| 亚洲成人一区二区| 另类综合日韩欧美亚洲| 国产精品乡下勾搭老头1| 成人午夜视频福利| 91蜜桃在线观看| 欧美伦理影视网| 精品欧美一区二区三区精品久久| 久久久久久久久久久久电影| 国产精品情趣视频| 亚洲综合久久久| 蜜桃精品在线观看| www.色精品| 欧美三级日韩三级| 精品久久久久一区二区国产| 国产精品久久精品日日| 亚洲精品国产精品乱码不99| 日韩精品久久理论片| 国产乱妇无码大片在线观看| 91免费看视频| 日韩欧美电影一区| 成人免费在线视频观看| 五月天国产精品| 国产成人精品午夜视频免费| 91久久精品网| 久久久久久久久久久黄色| 亚洲免费观看高清| 日韩av高清在线观看| 成人精品免费网站| 91精品国产综合久久精品性色| 国产精品三级av| 日韩国产在线观看一区| 春色校园综合激情亚洲| 欧美日本韩国一区| 中文字幕免费不卡| 天堂成人国产精品一区| www.66久久| 日韩欧美一二三四区| 亚洲婷婷综合色高清在线| 日本午夜一区二区| 99精品视频在线观看| 欧美成人a视频| 一区二区三区在线视频观看| 精品夜夜嗨av一区二区三区| 欧美影院精品一区| 中文字幕欧美日本乱码一线二线| 日本女优在线视频一区二区| av在线综合网| 精品久久人人做人人爽| 亚洲成av人片| 日本丶国产丶欧美色综合| 欧美韩国日本不卡| 美洲天堂一区二卡三卡四卡视频| 99精品国产91久久久久久| 2024国产精品视频| 日本亚洲电影天堂| 精品视频在线免费看| 136国产福利精品导航| 国产一区二区视频在线播放| 欧美美女激情18p| 亚洲综合在线免费观看| 成人激情免费视频| 国产午夜精品一区二区三区嫩草 | 一区在线观看免费| 大美女一区二区三区| 精品国产一区二区亚洲人成毛片| 婷婷久久综合九色国产成人| 色欧美日韩亚洲| 亚洲免费av在线| 色综合视频一区二区三区高清| 日本一区二区免费在线| 国产乱码精品一区二区三区五月婷| 欧美高清精品3d| 婷婷亚洲久悠悠色悠在线播放| 欧美亚洲一区三区| 亚洲愉拍自拍另类高清精品| 一本色道久久综合亚洲精品按摩| 国产精品成人网| 99国产精品久久久久久久久久久| 国产精品毛片高清在线完整版| 国产黄色成人av| 国产精品色婷婷| www.爱久久.com| 亚洲免费观看高清| 欧美性一级生活| 亚洲成人一二三| 91麻豆精品国产| 蜜桃视频第一区免费观看| 69堂成人精品免费视频| 天堂蜜桃一区二区三区| 欧美一区二区三区四区久久 | 日韩精品欧美精品| 日韩欧美第一区| 国产最新精品免费| 国产日韩欧美综合在线| 99久久精品国产观看| 亚洲国产毛片aaaaa无费看| 在线播放亚洲一区| 激情另类小说区图片区视频区| 国产欧美一区二区三区鸳鸯浴| 成人免费电影视频| 亚洲午夜精品网| 日韩一区二区高清| 丰满白嫩尤物一区二区| 亚洲欧美日韩久久精品| 777色狠狠一区二区三区| 美女视频黄a大片欧美| 国产婷婷精品av在线| 色综合欧美在线视频区| 天天色综合成人网| 久久影院午夜片一区| 成人深夜视频在线观看| 夜夜精品视频一区二区| 日韩久久免费av| 粉嫩13p一区二区三区| 亚洲精品国产a| 日韩三级av在线播放| 96av麻豆蜜桃一区二区| 婷婷开心久久网| 国产精品麻豆欧美日韩ww| 欧美视频精品在线观看| 国产一区999| 亚洲va韩国va欧美va| 中文字幕乱码亚洲精品一区| 欧美日韩一区在线观看| 国产精品一二三在| 午夜精品福利久久久| 国产精品日韩成人| 日韩午夜激情av| 色婷婷av一区二区三区软件| 国产一区二区三区免费在线观看| 免播放器亚洲一区| 亚洲国产精品t66y| 日韩一区二区三区在线观看| 不卡av免费在线观看| 青青草国产精品亚洲专区无| 中文字幕一区在线观看| 精品少妇一区二区三区在线视频 | 久久综合久久鬼色| 色呦呦国产精品| 国产福利电影一区二区三区| 视频一区在线视频| 亚洲三级在线观看|