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

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

?? java13.htm

?? E-books about Java Programing in Spanish
?? HTM
字號:
<HTML>
<HEAD>
<TITLE>Curso Java desde Cero</TITLE>

<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0z">
</HEAD>
<BODY background=/iconos/1.gif  TEXT=000000 LINK=FF0000 VLINK=A62A2A>  
<H1>DibuJava II<BR>
</H1>
<P>
Vamos a retocar un poquito nuestro <FONT FACE="Arial">ejemplo15</FONT>
para que no se borren los rect&aacute;ngulos cuando queremos dibujar
uno nuevo. Aprenderemos algo sobre la clase <B>Vector</B>, perteneciente
al paquete java.util.
<H2>Vectores en acci&oacute;n</H2>
<P>
Los vectores nos permiten hacer arreglos de cualquier tipo de
objeto, y referirnos individualmente a cualquier elemento del
vector, aunque para utilizarlos (debido a que para java el vector
contiene objetos gen&eacute;ricos) tendremos que decirle qu&eacute;
clase de objeto es mediante un &quot;cast&quot;. Vamos a ver c&oacute;mo
quedan nuestras clases <FONT FACE="Arial">Ejemplo16</FONT> (ex
Ejemplo15) y <FONT FACE="Arial">miCanvas</FONT>:<BR>
<PRE>
<FONT SIZE=2>import java.awt.*;
<B>import java.util.*;
</B>import java.applet.Applet;

public class <B>Ejemplo16</B> extends Applet {
    public void init() {
<I>................ (esta parte no cambia)................
</I>    }
}

class miCanvas extends Canvas {
<B>    Vector v = new Vector();	// inicializamos con tama&ntilde;o indeterminado
				// Java se encarga de manejar la memoria necesaria!

</B>    public boolean mouseDown(Event e, int x, int y) {
<B>	v.addElement( new Rectangle(x, y, 0, 0) );	// nuevo elemento!
</B>	repaint();
	return false;
    }

    public boolean mouseDrag(Event e, int x, int y) {
<B>	Rectangle r = (Rectangle)v.lastElement();	// cast: <I>v</I> son rect&aacute;ngulos
	r.resize( x - r.x, y - r.y );			// (cre&eacute; <I>r</I> s&oacute;lo por claridad)
</B>	repaint();
	return false;
    }

    public boolean mouseUp(Event e, int x, int y) {
<B>	Rectangle r = (Rectangle)v.lastElement();	// cast: <I>v</I> son rect&aacute;ngulos
	r.resize( x - r.x, y - r.y );			// (cre&eacute; <I>r</I> s&oacute;lo por claridad)
</B>	repaint();
	return false;
    }

    public void paint(Graphics g) {
<B>	int i;					// contador de rect&aacute;ngulos
</B>	Dimension d = size();
	g.setColor(Color.red);
	g.drawRect(0, 0, d.width-1, d.height-1);
	g.setColor(Color.blue);
<B>	if (v.size() &gt; 0)
      for (i=0; i&lt;v.size(); i++) {
		Rectangle box = cortarRect( (Rectangle)v.elementAt( i ), d);
</B>		g.drawRect(box.x, box.y, box.width-1, box.height-1);
	      }
    }
<I>........................ (el resto no cambia) ........................
</I>}

Les sugiero utilizar un HTML que reserve espacio suficiente para ver todo el applet, como:
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;Ejemplo 16 - Ejemplo con canvas&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
&lt;applet code=&quot;Ejemplo16.class&quot; <B>width=300 height=250</B>&gt;
&lt;/applet&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;<BR>
</FONT>
</PRE>
<P>
Veamos los pasos ahora. En primer lugar creamos una variable (global
a la clase) llamada <FONT FACE="Arial">v</FONT>, de clase <FONT FACE="Arial">Vector</FONT>,
y sin asignarle un tama&ntilde;o definido:
<PRE>
<FONT SIZE=2>Vector v = new Vector();<BR>
</FONT>
</PRE>
<P>
Al crear un nuevo rect&aacute;ngulo agregamos un elemento (objeto)
al vector mediante el m&eacute;todo <FONT FACE="Arial">add</FONT>:
<PRE>
<FONT SIZE=2>v.addElement( new Rectangle(x, y, 0, 0) );<BR>
</FONT>
</PRE>
<P>
Para acceder a un atributo de un objeto del vector no basta utilizar
directamente el vector, como:
<PRE>
<FONT SIZE=2>	v.lastElement().x<BR>
</FONT>
</PRE>
<P>
(<FONT FACE="Arial">lastElement()</FONT> nos permite acceder al
&uacute;ltimo elemento agregado al vector). Es necesario aclarar
expl&iacute;citamente que el elemento en cuesti&oacute;n es un
rect&aacute;ngulo, ya que el vector puede contener objetos de
cualquier tipo. Para eso usamos el <I>casting</I>:
<PRE>
<FONT SIZE=2>	<B>(Rectangle)</B>v.lastElement().x<BR>
</FONT>
</PRE>
<P>
En nuestro c&oacute;digo original reemplazar&iacute;amos por:
<PRE>
<FONT SIZE=2>(Rectangle)v.lastElement().resize( x - (Rectangle)v.lastElement().x, ......
<BR>
</FONT>
</PRE>
<P>
Pero es m&aacute;s claro si usamos una variable local de clase
Rectangle, le asignamos el mismo objeto que acabamos de agregar
al vector,  y lo usamos en su lugar:
<PRE>
<FONT SIZE=2>	Rectangle <B>r</B> = (Rectangle)v.lastElement();
	<B>r</B>.resize( x - <B>r</B>.x, y - <B>r</B>.y );<BR>
</FONT>
</PRE>
<P>
Finalmente, en el m&eacute;todo <FONT FACE="Arial">paint()</FONT>
no podemos asignar el elemento hasta no saber que existe (originalmente
el vector estaba vac&iacute;o!). As&iacute; que un <FONT FACE="Arial">if</FONT>
 nos permite verificar que el tama&ntilde;o del vector es mayor
que cero (tiene elementos), y un <FONT FACE="Arial">for</FONT>
nos permite dibujarlos uno por uno.
<P>
Se puede acceder a todos los elementos, uno por uno, mediante
el m&eacute;todo <FONT FACE="Arial">elementAt(x)</FONT>, que nos
da el x-&eacute;simo elemento del vector. El m&eacute;todo <FONT FACE="Arial">size()</FONT>
nos da la cantidad de elementos (el primero es el n&uacute;mero
0, y as&iacute;):
<PRE>
<FONT SIZE=2>	if (v.size() &gt; 0)
      for (i=0; i&lt;v.size(); i++) {
		Rectangle box = cortarRect( (Rectangle)v.elementAt( i ), d);
		g.drawRect(box.x, box.y, box.width-1, box.height-1);
	      }<BR>
</FONT>
</PRE>
<P>
Aqu&iacute; no hemos creado variables intermedias ya que igualmente
es claro (eso creo...).<BR>
<H2>Flicker molesto!</H2>
<P>
Bueno, el problema que nos queda es el molesto &quot;flicker&quot;,
o sea la manera en que titila el dibujo cuando movemos el mouse.
Esto es porque cada vez que se llama a <FONT FACE="Arial">paint()</FONT>,
el fondo se borra y se redibuja todo el canvas.
<P>
B&aacute;sicamente, la manera de evitarlo es reescribiendo el
m&eacute;todo <FONT FACE="Arial">update()</FONT>, que es el que
borra el fondo antes de llamar a <FONT FACE="Arial">paint()</FONT>
para que no lo borre; otro m&eacute;todo (que es el que vamos
a usar) es dibujar <I>no sobre la pantalla</I> sino sobre un &quot;buffer&quot;
gr&aacute;fico, y luego copiar ese buffer sobre la pantalla (lo
que es mucho m&aacute;s eficiente que dibujar sobre la misma).
<P>
Para eso vamos a crear un par de objetos:
<PRE>
<FONT SIZE=2>class miCanvas extends Canvas {
    Vector v = new Vector();
<B>    Image	imgBuff;
    Graphics	grafBuff;
</B>.............................<BR>
</FONT>
</PRE>
<P>
<FONT FACE="Arial">Image</FONT> es una clase abstracta, madre
de todas las clases que representan im&aacute;genes gr&aacute;ficas.
<FONT FACE="Arial">Graphics</FONT> es tambi&eacute;n abstracta
y nos permite obtener un contexto en el cual dibujar.
<P>
Lo que vamos a hacer es modificar nuestro m&eacute;todo <FONT FACE="Arial">paint()</FONT>
para que simplemente llame a <FONT FACE="Arial">update()</FONT>,
y redefinir el m&eacute;todo <FONT FACE="Arial">update()</FONT>:
<PRE>
<FONT SIZE=2>public void paint(Graphics g) {
<B>	update(g);
</B>}<BR>
</FONT>
</PRE>
<P>
El m&eacute;todo <FONT FACE="Arial">update()</FONT> es el que
har&aacute; todo el trabajo y b&aacute;sicamente es como nuestro
viejo <FONT FACE="Arial">paint()</FONT> con algunos agregados:
<PRE>
<FONT SIZE=2>public void update(Graphics g) {
	int i;
	Dimension d = size();

<B>if (grafBuff == null) {
		imgBuff = createImage(d.width, d.height);
		grafBuff = imgBuff.getGraphics();
}
grafBuff.setColor(getBackground());
grafBuff.fillRect(0, 0, d.width, d.height);
</B>	<I>grafBuff</I>.setColor(Color.red);
	<I>grafBuff</I>.drawRect(0, 0, d.width-1, d.height-1);
	<I>grafBuff</I>.setColor(Color.blue);
	if (v.size() &gt; 0) for (i=0; i&lt;v.size(); i++) {
		Rectangle box = cortarRect((Rectangle)v.elementAt(i), d);
		<I>grafBuff</I>.drawRect(box.x, box.y, box.width-1, box.height-1);
	}
<B>	g.drawImage(imgBuff, 0, 0, this);
</B>}<BR>
</FONT>
</PRE>
<P>
En <B>negrita</B> hemos indicado los agregados.
<P>
Si no est&aacute; creado todav&iacute;a (<FONT FACE="Arial">grafBuff==null</FONT>),
creamos nuestro buffer de dibujo. Para crear dicho buffer gr&aacute;fico
(de clase <FONT FACE="Arial">Graphics</FONT>), primero creamos
una imagen que en este caso tiene las mismas dimensiones que el
canvas (<FONT FACE="Arial">d.width</FONT> x <FONT FACE="Arial">d.height</FONT>),
y luego asignamos a <FONT FACE="Arial">grafBuff</FONT> el contexto
de dicha imagen mediante el m&eacute;todo <FONT FACE="Arial">getGraphics()</FONT>.
Imag&iacute;nense que con <FONT FACE="Arial">createImage(...)</FONT>
crean una &quot;pantalla virtual&quot;, y <FONT FACE="Arial">getGraphics()</FONT>
nos da una forma de acceder a esa pantalla como si fuera real.
<P>
Utilizando dicho contexto, elegimos como color el mismo color
de fondo del applet (<FONT FACE="Arial">getBackground()</FONT>)
y dibujamos un rect&aacute;ngulo lleno (<FONT FACE="Arial">fillRect(...)</FONT>),
borrando as&iacute; cualquier cosa que hubiera estado dibujada.
<P>
En <I>it&aacute;lica</I> hemos indicado las modificaciones a nuestro
m&eacute;todo anterior. Simplemente, en lugar de usar el contexto
de la pantalla (el par&aacute;metro <FONT FACE="Arial">g</FONT>
del m&eacute;todo), dibujamos sobre nuestro contexto-pantalla
virtual.
<P>
Finalmente, y para poder visualizar nuestro dibujo, usamos el
m&eacute;todo <FONT FACE="Arial">drawImage</FONT> sobre el contexto
de la pantalla real (<FONT FACE="Arial">g</FONT>), que copia nuestro
contexto <FONT FACE="Arial">imgBuff</FONT> en las coordenadas
(0,0) sobre la pantalla. Se hace tambi&eacute;n referencia al
canvas (...<FONT FACE="Arial">this</FONT>): el cuarto par&aacute;metro
de <FONT FACE="Arial">drawImage</FONT> es un objeto de clase <FONT FACE="Arial">ImageObserver</FONT>,
una interface que sirve para que el objeto dentro del cual se
dibuja reciba mensajes asincr&oacute;nicos que le indican c&oacute;mo
est&aacute; siendo construida la imagen, y cu&aacute;ndo est&aacute;
lista.<BR>
<H2>Animate!</H2>
<P>
Si bien puede ser un poco m&aacute;s complejo de entender que
un dibujo directo sobre la pantalla, notar&aacute;n que la implementaci&oacute;n
es directa y no trae ning&uacute;n problema. Esta misma aproximaci&oacute;n
puede utilizarse para crear animaciones.
<P>
En este ejemplo, para manejar la ejecuci&oacute;n cuadro a cuadro
de la animaci&oacute;n, usamos <I>Threads</I>. No se preocupen
por eso, lo veremos pronto. &Uacute;nicamente tengan en cuenta
que nuestro applet debe implementar la clase <I>runnable</I>,
y el thread se encarga de ejecutar el m&eacute;todo <FONT FACE="Arial">run()</FONT>
que simplemente llama a <FONT FACE="Arial">repaint()</FONT> y
espera 100 milisegundos entre cuadro y cuadro.
<P>
El trabajo de c&aacute;lculo y dibujo lo hace <FONT FACE="Arial">update()</FONT>.
Se los dejo para que lo estudien; no es nada complicado y tambi&eacute;n
usa doble buffering (como el ejemplo anterior).<BR>
<PRE>
<FONT SIZE=2>import java.awt.*;
import java.util.*;
import java.applet.Applet;

public class Ejemplo18 extends Applet implements Runnable {

    Thread	animador;
    Image	imgBuff;
    Graphics	grafBuff;
    double ang = 0.0;

    public void init() {
	resize(new Dimension (200,200));
    }

    public void start() {
	if (animador == null) animador = new Thread(this);
	animador.start();
    }

    public void run() {
	while (Thread.currentThread() == animador) {
		repaint();
		try {
			Thread.sleep(100);
		}
		catch (InterruptedException e) {
			break;
		}
	}
    }

    public void update(Graphics g) {
	int i;
	int dx, dy;

	Dimension d = size();

if (grafBuff == null) {
		imgBuff = createImage(d.width, d.height);
		grafBuff = imgBuff.getGraphics();
}
grafBuff.setColor(getBackground());
grafBuff.fillRect(0, 0, d.width, d.height);
	grafBuff.setColor(Color.red);
	grafBuff.drawRect(0, 0, d.width-1, d.height-1);

	grafBuff.setColor(Color.blue);
	dx = (int)(50 * Math.abs(Math.cos(ang)));
	dy = (int)(50 * Math.abs(Math.sin(ang)));
	ang = ang + 0.1;
	if (ang&gt;2*Math.PI) ang = 0.0;
	grafBuff.drawRect(100-dx, 100-dy, 2*dx, 2*dy);

	g.drawImage(imgBuff, 0, 0, this);
    }
}<BR>
<BR>
</FONT>
</PRE>
<P>
Como siempre, me despido hasta la clase que viene...<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 + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区日韩| 国产成人av福利| 国产一区二区三区久久久| 色综合久久精品| 国产午夜亚洲精品午夜鲁丝片| 亚洲综合区在线| 丁香另类激情小说| 欧美精品一区二区三| 亚洲国产日韩精品| 91色视频在线| 国产亚洲制服色| 麻豆久久一区二区| 欧美日韩国产美| 亚洲午夜精品久久久久久久久| 丰满少妇在线播放bd日韩电影| 日韩一级免费一区| 午夜久久久影院| 欧美色综合天天久久综合精品| 国产精品久久午夜| 亚洲欧洲日本在线| 免费在线观看视频一区| 欧美优质美女网站| 亚洲精品久久久久久国产精华液| 风间由美性色一区二区三区| 26uuu国产一区二区三区| 免费在线看一区| 日韩三级精品电影久久久| 亚洲综合色自拍一区| 99久久精品久久久久久清纯| 久久伊人中文字幕| 麻豆国产91在线播放| 日韩一区二区三区电影| 美女在线观看视频一区二区| 制服丝袜中文字幕亚洲| 丝袜美腿亚洲一区二区图片| 欧美顶级少妇做爰| 美日韩一区二区| 精品国产乱码久久久久久免费| 狠狠色丁香婷综合久久| 日韩精品一区二区三区在线观看| 麻豆中文一区二区| 久久综合狠狠综合久久综合88 | 一区二区三区四区亚洲| 91一区在线观看| 亚洲韩国精品一区| 欧美疯狂性受xxxxx喷水图片| 丝袜美腿亚洲综合| 久久久亚洲午夜电影| 成人免费毛片片v| 亚洲男人的天堂一区二区 | 成人黄色国产精品网站大全在线免费观看| 欧美成人aa大片| 国产91色综合久久免费分享| 国产精品久久久久永久免费观看| youjizz久久| 香蕉影视欧美成人| 精品福利一区二区三区免费视频| 国产91丝袜在线18| 亚洲综合色网站| 日韩欧美电影一二三| 91女厕偷拍女厕偷拍高清| 亚洲欧美综合色| 制服丝袜中文字幕亚洲| 国产呦萝稀缺另类资源| 国产精品久久久久影院亚瑟| 欧美综合天天夜夜久久| 精品综合免费视频观看| 亚洲丝袜自拍清纯另类| 在线免费av一区| 狠狠色狠狠色综合日日91app| 亚洲天堂久久久久久久| 日韩午夜在线观看| 99精品桃花视频在线观看| 日韩—二三区免费观看av| 中文字幕不卡在线观看| 欧美久久久久久久久| 成人午夜看片网址| 免费日本视频一区| 亚洲男人天堂一区| 欧美va亚洲va香蕉在线| 色婷婷av一区二区三区大白胸| 捆绑紧缚一区二区三区视频| 自拍偷在线精品自拍偷无码专区| 日韩欧美国产精品| 色视频成人在线观看免| 国产米奇在线777精品观看| 亚洲已满18点击进入久久| 久久久午夜精品| 日韩午夜在线观看| 欧美综合一区二区| 99re免费视频精品全部| 国产精品69久久久久水密桃| 日韩中文字幕麻豆| 亚洲精品水蜜桃| 中文字幕精品一区二区三区精品| 日韩天堂在线观看| 欧美日韩大陆在线| 日本电影欧美片| 99久久er热在这里只有精品15| 久久99久久精品| 日本午夜精品一区二区三区电影 | 成人国产精品免费网站| 久久精品国产网站| 免费观看久久久4p| 日本中文一区二区三区| 亚洲va中文字幕| 夜夜嗨av一区二区三区| 亚洲欧美一区二区三区久本道91| 久久久天堂av| 久久精品亚洲精品国产欧美kt∨| 欧美成人a在线| 日韩精品自拍偷拍| 精品日韩在线观看| 欧美mv日韩mv国产网站| 精品美女在线播放| 久久久综合视频| 久久精品亚洲麻豆av一区二区 | 亚洲高清不卡在线观看| 玉足女爽爽91| 亚洲国产视频在线| 日韩影院在线观看| 美日韩一区二区| 国产资源精品在线观看| 激情综合网激情| 国产不卡视频在线观看| 成人福利视频在线看| fc2成人免费人成在线观看播放 | 4438成人网| 欧美一区国产二区| 精品成人一区二区三区| 国产拍欧美日韩视频二区| 国产精品高潮久久久久无| 亚洲精品视频在线观看网站| 夜夜夜精品看看| 乱一区二区av| 国产高清不卡一区二区| 99精品欧美一区二区三区小说| 欧美在线观看禁18| 日韩一区二区三区视频在线观看| 337p日本欧洲亚洲大胆色噜噜| 欧美国产综合一区二区| 一区二区日韩电影| 蜜臀av国产精品久久久久| 福利电影一区二区| 色网综合在线观看| 日韩精品在线网站| 亚洲三级小视频| 亚洲午夜精品一区二区三区他趣| 蜜桃视频在线观看一区| 国产精品18久久久久久久网站| 91麻豆成人久久精品二区三区| 欧美日韩免费视频| 国产欧美综合色| 亚洲成人动漫一区| 福利一区在线观看| 欧美精品久久99| 国产精品国产a| 精品午夜久久福利影院 | 国产精品亚洲一区二区三区妖精| 91在线观看地址| 精品美女一区二区| 亚洲综合一二三区| 国产麻豆成人精品| 91麻豆精品国产91久久久使用方法 | 懂色一区二区三区免费观看| 欧美性生交片4| 国产女人18水真多18精品一级做| 天天综合网 天天综合色| 粉嫩一区二区三区在线看| 日韩无一区二区| 亚洲成av人综合在线观看| 成人高清免费观看| 久久人人爽爽爽人久久久| 日韩制服丝袜av| 欧洲中文字幕精品| 亚洲特级片在线| 成人午夜激情视频| 2024国产精品视频| 美腿丝袜亚洲一区| 欧美日韩大陆在线| 亚洲一区在线电影| 91啪亚洲精品| 亚洲人成精品久久久久久| 国产成人精品亚洲午夜麻豆| 精品国产免费久久| 久久er精品视频| 7777精品伊人久久久大香线蕉| 亚洲综合久久久久| 在线视频一区二区三| 亚洲欧美偷拍卡通变态| 99精品一区二区| 亚洲欧美另类久久久精品2019| 成人免费高清视频在线观看| 久久久久久久免费视频了| 国产一区二区免费在线| 精品国产伦一区二区三区观看体验| 免费视频最近日韩| 欧美本精品男人aⅴ天堂| 日本不卡123| 精品日韩在线观看|