Mostrando las entradas con la etiqueta Java. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Java. Mostrar todas las entradas

jueves, 20 de diciembre de 2007

Efecto en Google Imágenes con Java Script

Un efecto curioso, no sé bien cómo explicarlo pero aquí van los pasos tal cual los puso Dominicano en elhacker.net:

1º Metete en google
2º Busca algo en imagenes
3º Borra las direcciones del navegador y pon esto en su lugar:

javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI= document.images; DIL=DI.length; function A(){for(i=0; i<DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5}R++}setInterval('A()',5 ); void(O)

Más explicado no pudo estar, y no me digan que no entienden esas simples instrucciones porque sí están muy mal :-(

fotnote: Hay que tener habilidado JavaScript para la página que deseemos modificar.

Una imagen de muestra:






El hecho en que se basa esto es en que los navegadores populares (IE6, IE7, FF, etc.) permiten la ejecución directa de un código JavaScript, así, si pones en la barra de direcciones y sin comillas "JavaScript:5+5" te sale un texto simple y llano:

10

Así que alguien se las apañó para indexar las imágenes y hacerlas girar con un bucle.

El enlace original es:

http://www.screencast.com/users/neroxyn/folders/Default/media/
77de4f61-c88c-4555-9cce-5fe02bc99522

pero no lo he querido incluir como principal porque lleva a un engorroso video que necesita un plig-in de windows media, lo que haría su vista imposible desde Linux.

domingo, 29 de julio de 2007

Y ahora los Layouts

He solucionado hoy mismo el problema que tenía con respecto al tamaño de un botón que creé. Bueno, no fue solo, pedí ayuda en un foro (en el de elhacker.net) y tuve una buena respuesta por parte de un usuario: los Layouts. Yo no sabía muy bien lo que eran, simplemente había leído unas notas rápidas cuando daba repasos a un tutorial de Java, no recuerdo exactamente cual, pero mis conocimientos sobre ello eran insignificantes y los tuve que reforzar hasta ahora para deshacerme del problema del botón.

Más o menos le agarré la onda: son formas de organizar una ventana y se crean usando la interfase LayoutManager, por suerte Java tiene creadas varias clases por defecto que implementan esa interfaz para hacer la vida más fácil. Los programadores de Java ya las conocerán: BorderLayout, GridLayout, CardLayout, etc.

Simplemente cambié éste trozo de mi clase (ubicado en el constructor):

setBackground(Color.CYAN);
setSize(256, 256);
setVisible(true);


Por este:

setBackground(Color.CYAN);
setSize(256, 256);
setLayout(new BorderLayout());
setVisible(true);


Y el botón se muestra del tamaño que le he mandado.

Aunque todo esto no ha quedado muy en claro: el problema se ha resuelto, pero no se ha comprendido, no me señalo with the index finger porque ya no es falta de razonamiento, sino la libertad de equivocarme que me doy. Si pongo el BorderLayout() después del setVisible(boolean) el botón aparece igual, aunque le añada un repaint(), pero no voy a batallar con eso, pues tengo la impresión de que la clave estará en controlar mejor a los Layout y saber de qué van los principales.

No me voy a presionar, he aprendido mucho tan sólo en este día: reafirmación de mis conocimientos con la creación de objetos, herencia y polimorfismo. Aprendí lo que son las interfaces y los Layouts... y los listeners y cómo implementarlos. Creo que para un solo día está muy bien.

Voy a seguir probando con esta clase Prueva a ver hasta dónde llego haciendo cositas varias como quizá otro botón, algún cuadro de texto y manipular sus eventos.

Por el momento ya tengo solucionados los problemas y lo que haré después de darle "Publicar entrada" es algo que ignoro: quizá siga programando, quizá me ponga a leer al saco, ver tele, jugar... no sé.

"Bueno chau" <--- ¿quién dice así? :-P

sábado, 28 de julio de 2007

Interfaces y Listeners en Java ;-)

¡Por fin! Esto no fue un quebradero de cabeza como los que me llevaba con el NekroEditor, lo que ocurre es que como ando saliendo de la novata del ámbito de Java aún me encuentro con conocimientos nuevos. Esta vez tuve que comprender bien cómo era eso de las clases abstractas, tuve que aprender sobre las interfaces que no es nada difícil pero tuve que arrancar de la nada y comprenderlo todo.

Lo que intenté solucionar fue el por qué mi programita de una ventana con un botón no cerraba cuando le hacía click en la tachita, lo que me costó googlear y leer durante varias horas en foros y manuales que tengo en del.icio.us. No voy a relatar toda la historia porque son tantos los lugares que vi, tantas las conclusiones que saqué que ya hasta se me olvidaron; jajaja bueno, será que se me olvidaron los sitios y el orden pero los conocimientos ya los tengo.

Una de las cosas que hice fue examinar un código que había hecho y que venía en un tutorial de Java que descargué hace años, el primero que tuve y que imprimí para leerlo en papel que fue el que me dio la introducción clave. Resulta que fue el primero al que se me ocurrió recurrir cuando me inicié verdaderamente en esto. El caso es que ahí venía un sencillo ejercicio de crear un Applet con unos cuantos elementos. Lo ejecuté y vi que la ventanita se cerraba, el código era este:


public void processEvent(AWTEvent mensaje){

        if (mensaje.getID() == Event.WINDOW_DESTROY){
              if (inAnApplet){
                     dispose();
              }
              else{
                     System.exit(0);
              }
       }

/* return super.processEvent(mensaje); */

}


Me pareció algo tonto y decidí estudiar la clase directamente de la página de la API de Sun, bueno, entré e intenté buscarla pero no apareció por el índice, no sé ni cómo di con ella pero me di cuenta que era otra de las funciones que había dejado el Java Team obsoletas. No sé si lo que hicieron con SDK 6 fue un gran salto o volver a reprogramar el lenguaje de programación porque hay más "deprecated functions/methods/fields" que cosas nuevas :-S Es por ello que me resultó muy complicado seguir con los tutoriales que encuentro en internet como el que imprimí que es de hace casi 10 años creo y me tuve que arrancar a la intuición y las googleadas partiendo de la página de la API de sun, que tuve que hacer mi mejor amiga (Google ya lo era, de hecho es mi tío).

Estaba deprecada la función, lo demás fue tirada de rollo mías. Me dijo algo que ya había leído antes: "usa processWindowEvent(WindowEvent e) si quieres ser alguien en el futuro" puesto que, aunque aún servía la clase Event, eso de usar cosas por compatibilidad con lo viejo no es lo mío. Ni modo, a aprender a usar los eventos.

Y ese compromiso fue muy difícil ya que usar processWindowEvent va también de saber usar las interfaces debido a que, para que este método sirva de algo hay que añadir donde sea que se pueda ejecutar un addWindowListener que es como un "agregarEscuchadordeEventos".

Java ya tiene uno por defecto, al igual que cada Sistema Operativo en su API, el Gestor de Eventos que se encarga de procesar los mensajes de los controles en general. Pero hay un problema con esto: las aplicaciones de Java pueden ejecutarse de dos formas: como Applets y como aplicaciones Standalone, los Applets se pueden visualizar acuñándolos en el código HTML de una págia y verlos en el navegador o con el appletviewer que incluye Java, y las Standalone desde la consola, son como los programas básicos en C que usan stdio.h. Si estamos en modo Standalone matamos una aplicación con System.exit(0); y si estamos en un applet usamos dispose(); pero Java no tiene forma de saber si la aplicación es arrancada desde una consola o desde el navegador puesto que lo único que hay es un bytecode .class, la forma en que lo queramos ejecutar es otra cosa, entonces no tiene forma de saber cómo acabar una aplicación. Y en la misma página de Sun terminé de disipar toda duda que pudiera tener (Clase Frame):

Frames are capable of generating the following types of WindowEvents:


  • WINDOW_OPENED

  • WINDOW_CLOSING:
    If the program doesn't explicitly hide or dispose the window while processing this event, the window close operation is canceled.

  • WINDOW_CLOSED

  • WINDOW_ICONIFIED

  • WINDOW_DEICONIFIED

  • WINDOW_ACTIVATED

  • WINDOW_DEACTIVATED

  • WINDOW_GAINED_FOCUS

  • WINDOW_LOST_FOCUS

  • WINDOW_STATE_CHANGED




Justamente el mensaje que necesitaba se ve bloqueado y no me queda más de otra que agregar un WindowListener. WindowListener es una interfase, y yo apenas sabía los conceptos básicos de las interfaces, en fin que estuve leyendo un par de horas ya algo hastiado pero como mi curiosidad era más grande no me quedó de otra que aguantarme, y es que cuando le llega a uno el "¿y si la solución está en el siguiente?" remuerde quedarse con la duda de si el próximo resultado, el próximo párrafo o el próximo intento serán los correctos.

Implementar una interfase fue lo más fácil, puesto que sólo tenía que declarar los métodos y ponerlos en blanco: {} salvo el que necesitaba, donde había que poner un System.exit(0);.

Pero no tenía idea de cómo usar el addWindowListener(WindowListener l), pues el tipo de datos que requería el parámetro era una interfaz y no sabía dónde tenía que implementarla: buscando códigos de ejemplo vi dos que me resultaron muy raros y que hasta ahora no entiendo del todo bien:

public static void main(String s[]) {
   JFrame frame = new JFrame("A Basic Frame");

   WindowListener l = new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
         System.exit(0);
      }
   };
   frame.addWindowListener(l);
   //BLA BLA BLA
}


Que es de esta página: Cómo Crear Frames (Ventanas Principales). Luego otro de elhacker.net:

...bueno es este: HAKIIIII!!!11eleven Es que está muy largo.


Pero no son el objeto de mi explicación estos códigos que no entiendo bien cómo usan la interfase.

Perp ya pude solucionarlo: creo una clase que implemente la interfase WindowListener, luego creo una instancia de esa clase y se lo paso a addWindowListener. Sencillo pero para mi mente poco adentrada en Java le costó algo de trabajo asimilarlo, y me siento muy orgulloso de haber logrado esto, aprendí varias cosas el día de hoy y pude solucionar un problema y prever más.

El código resultante el siguiente, el cuál es el que llevo hasta ahora, pero le seguiré modificando muchas cosas porque, como ya dije antes, sigo con el problema de que mi botón de comando se redimensiona apenas encuentra un pretexto:

import java.awt.*;
import java.awt.event.*;

public class Prueva extends Frame{

       public static void main(String args[]){

              Prueva app = new Prueva("Hols!");

       }

       public Prueva(String title){

              super(title);

              wndListener Eventos = new wndListener();
              addWindowListener(Eventos);


              /*Button button = new Button("Heisann");
              add(button);
              button.setBackground(Color.MAGENTA);
              button.setLocation(64, 64);
              button.setSize(64, 64);*/

              setBackground(Color.CYAN);
              setSize(256, 256);
              setVisible(true);

       }

       protected void processWindowEvent(WindowEvent e){

              super.processWindowEvent(e);

       }

}


class wndListener implements WindowListener{

       public void windowOpened (WindowEvent e){}

       public void windowClosing (WindowEvent e){

              System.exit(0);

       }


       public void windowClosed (WindowEvent e){}

       public void windowIconified (WindowEvent e){}
       public void windowDeiconified (WindowEvent e){}

       public void windowActivated (WindowEvent e){}
       public void windowDeactivated (WindowEvent e){}

}


Hilsener.

Un extraño pack() en Frame ??

Esto va con relación al post anterior.

Al parecer Java hace alguna especie de pack() interno, o al menos he descubierto que es el software de programación y no yo quien es responsable de que mi botón se muestre del tamaño de la ventana y no como yo lo asigno.

No voy a citar imágenes ni códigos pasados porque el presente revela lo que quiero mostrar a la luz. Para esto basta analizar este pequeño código en el constructor de una clase extends Frame:

Button button = new Button("Heisann");
button.setBackground(Color.MAGENTA);

add(button);
setBackground(Color.CYAN);
setTitle("Hols!");
setSize(256, 256);
button.setSize(64, 64);
System.out.println(button.getSize());
setVisible(true);
System.out.println(button.getSize());



y lo que me tira la consola:


[nekrobyte@localhost Prueva]$ javac Prueva.java
[nekrobyte@localhost Prueva]$ java Prueva
java.awt.Dimension[width=64,height=64]
java.awt.Dimension[width=246,height=226]
[]


Ahh, el último [] que puse es para representar al cursor cuadrado que indica dónde se va a insertar el próximo caracter, en realidad no había nada pero es que si tampoco pongo nada siento que no dejo las cosas muy en claro ;-)

Tengo que ver qué hago con eso porque no confío mucho en asignar las propiedades a todos mis controles en el futuro después de abrir el telón.

viernes, 27 de julio de 2007

EODLFEFAEP

¡Puaj! ¡Qué lastre! Ni bien acabo de escribir el post pasado y ya confirmé mis sospechas: el orden de los factores, en efecto, altera el producto.

Si usamos este código dentro de main:

Prueva app = new Prueva();

Button button = new Button("Heisann");
button.setBackground(Color.MAGENTA);
button.setSize(64, 64);

app.add(button);
app.setBackground(Color.CYAN);
app.setTitle("Hols!");
app.setSize(256, 256);
app.setVisible(true);


Obtendremos esto:



Pero si ponemos:

Prueva app = new Prueva();

Button button = new Button("Heisann");
button.setBackground(Color.MAGENTA);

app.add(button);
app.setBackground(Color.CYAN);
app.setTitle("Hols!");
app.setSize(256, 256);
app.setVisible(true);
button.setSize(64, 64);


Obtenemos:



De esto concluimos que:

El orden de los factores, en efecto, altera el producto


O lo que es más corto: EODLFEFAEP. Por cierto, "EF" significa "En Efecto", y es que me gusta más dibujar "EF" que "EE", nada personal, sólo preferencias ;-)

Progman i Java

No sé si ya lo había comentado antes, pero me inicié con la programación en Java desde hace, digamos, un par de meses... o tal vez tres, no lo sé, pero no es mucho que digamos. En este tiempo me he estado instruyendo con varios manuales que conseguí en internet y la página de la API de Java por Sun ha sido un sitio de constante visita. Por fortuna había estudiado Java cuando tenía como 13 o 14 años pero como no tenía en qué practicar y apenas sabía algo de programación fracasé, pero ya no me resultó tan difícil recobrarme ahora que volví puesto que, aunado a aquella experiencia, llegué con más noción de la programación orientada a objetos gracias a Visual Basic y las ojeadas que le daba a C++.

El punto es que ahora resulto ser programador novicio en Java, comenzando pero viendo hacia'l frente.

Los problemas ahora vienen con Java, cosa que para mí es una noticia amigable :-)

Estos liado con un código en Java. Practico la programación gráfica de Java y me empiezo por crear figuras basadas en las clases de AWT. Por ahora lo que quiero es algo muy sencillo: crear un una ventana con un botón, sólo eso. Para la ventana uso la clase Frame y para el botón la clase Button. El código es pequeño cabe en un único archivo llamado Prueva.java:

import java.awt.*;
import java.awt.event.*;

public class Prueva extends Frame{

       public static void main(String args[]){

              Prueva app = new Prueva();

              Button button = new Button("Heisann");
              button.setBackground(Color.MAGENTA);
              button.setSize(64, 64);

              app.add(button);
              app.setBackground(Color.CYAN);
              app.setTitle("Hols!");
              app.setSize(512, 512);
              app.setVisible(true);

       }

       public Prueva(){

              //

       }

       /*protected void processWindowEvent(WindowEvent e){

              if (e.getID() == e.WINDOW_CLOSING) {
                     System.exit(0);
              }

       }*/


}


Lo que consigo con esto es que se cree una ventana de unos 512 x 512 con el título "Hols!" y en ella... ahí el problema. Se supone que

Button button = new Button("Heisann");
button.setBackground(Color.MAGENTA);
button.setSize(1, 1);


Era para que creara un botón de 64 * 64 y que lo pusiera donde se le de la gana, pero no es así, por el contrario aparece uno de 512 * 512, y algo que he comprendido en este ejemplo que he programado es que, según parece, el orden de los factores altera el producto. Hay una instrucción: setVisible(boolean) de Frame que, dependiendo de dónde la coloque, hará que se pinte de Color.CYAN todo el fondo de la ventana pero que cuando redimensione (haciendo más grande la ventana) el fondo nuevo aparezca también pintado o de color gris.

Por el momento esto es lo que llevo, habrá que descubrir la solución.

El verdadero quebradero de cabeza lo explicaré más tarde pero es con los eventos de la aplicación, pero decidí corregir primero esto del tamaño del botón, es por ello que dejé como comentario lo demás.

Saludos.