Top Menu

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

24 de abril de 2013

Java: Graficar funciones Matemáticas

Java nos concede una gran variedad de funciones matematicas con su clase Math. Entre estas funciones tenemos valores absolutos, seno, coseno, etc. El siguiente ejemplo muestra como graficar estas funciones en un JFrame.


Lo primero es crear una clase que extienda del JFrame. Al hacer esto se puede sobreescribir el método paint( Graphics g) el cual nos permite dibujar dentro del JFrame. El código para realizar la graficar la funcion seno es el siguiente (la descripción del código se encuentra mas abajo):


La funcion initComponents() simplemente inicializa la ventana, init2() inicializa los valores numericos de la funcion. 

Una función mas importante es la de ValorY() que nos devuelve la posición en Y en la que deberia estar un punto dado una posición X. Finalmente el método paint( Graphics g) el cual sobreescribimos del JFrame simula una serie de puntos en X con un for, obteniendo sus valores en Y con la función anterior y graficandola al dibujar varias lineas pequeñas consecutivamente. 

Para finalizar, al instanciar la clase que extiende de JFrame en el método main se llama automaticamente al metodo paint() el cual permite que se mueste la grafica de nuestra función matematica.

21 de abril de 2013

{Java} Crear Array y Matriz de Objetos

En este post realizaremos lo que es crear un Array o Matriz de Objetos aunque es sencillo a veces se tiende a cometer un pequeño. Pero comencemos:

Como sabemos una arreglo es utilizado para almacenamiento y creo que una imagen vale mas que mil palabras:
Imagen tomada de: http://commons.wikimedia.org
Esto lo podemos usar si queremos un conjunto de objeto que tienen una misma función o caracteristica. 

Por ejemplo si queremos crear un array de 5 botones debemos hacerlo de la siguiente manera.
JButton []botones = new JButton[ 5 ];
Si lo vemos de un aspecto más generalizado sería:
NombreObjeto [] nombreVariable = new NombreObjeto[ cantidad ]; 
cantidad es cualquier valor número que puede ser dado por una variable, método o un valor númerico como tal. El [ ] indica que es un arreglo.

Ahora esto lo único que hace es crear un almacenamiento, ¿cómo así? podras decir, esto es de lo que comentaba al inicio del post, lo anterior crea un lugar para almacernar, en este caso botones pero no tiene botones. Es como si crearamos una caja con divisiones dentro de ella y esos espacios que tenemos dentro de la caja se coloca lo que queremos.
Imagen tomada de: http://bimg2.mlstatic.com/
Espero que con la imagen haya quedado claro :D.

Ahora para agregar botones al array lo haremos de la siguiente manera:
botones[0] = new JButton("Boton 1");
botones[1] = new JButton("Boton 2");
botones[2] = new JButton("Boton 3");
botones[3] = new JButton("Boton 4");
botones[4] = new JButton("Boton 5");
O por medio de un for:
for(int i = 0 ; i < 5 ; i++ ){
    botones[i] = new JButton("Boton " + (i+1));
}
Para una matriz de dos dimensiones de 3x2 es muy similar a un array:
JButton [][]botones = new JButton[ 3 ][ 2 ];
Donde  el primer [ ] (el 3) son las filas y el segundo [ ] son las columnas.
Si fuese la matriz de 3 dimensiones de 5x5x5:
JButton [][][]botones = new JButton[ 5 ][ 5 ][ 5 ];
Donde  el primer [ ] son las filas y el segundo son las columnas y el tercer [ ] es la profundidad.
Imagen tomada de: http://www.wikilearning.com
Para llenar la matriz con el objeto que queremos en este caso un boton es de la siguiente manera:
Para una matriz de 5x5:
botones[0][2] = new JButton(" Boton 0,2 ");
Si lo queremos hacer por medio de un for y llenar todos los espacios con botones es de la siguiente manera:
for(int fila = 0 ; fila < 3 ; fila++ ){
    for(int columna = 0 ; columna < 2 ; columna++ ){
        botones[fila][columna] = new JButton("Boton "+ fila + "," + columna);
    }
}
Y para finalizar un ejemplo:

Lo que hace el ejemplo es que se ingresa cuantas filas y columnas se quieren y al presionar al botón crear, crea una matriz de filas x columas. Y al dar clic al botón creado cambia de color.
 
Descargar ejemplo


Y si quieren ver el código:
Espero que les sea de utilidad. Dios te bendiga.

7 de abril de 2013

Agregar elementos a un JFrame

Creo que agregar un elemento a un JFrame es algo que nos va a tocas que hacer siempre y el concepto es similar para un JPanel, JWindow y JDialog.

Y como siempre lo e dicho hay personas que somos un poco desesperados :D así que acá va el código en general y luego doy -en este mismo post- una explicación un poco más detallada:
import javax.swing.JFrame;
import javax.swing.JButton;

public class Ventana extends JFrame {
 
    public static void main( String []arg ){
        new Ventana();
    }

    public Ventana(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400,400);
        //Esto permite que la ventana aparezca al centro
        this.setLocationRelativeTo(null);
        //
        //Para que el JFrame no tenga ningún formato
        //se coloca el Layout del JFrame en null 
        //no hay que olvidarse de colocarle tamaño y posición
        //a los elementos que se agregan
        this.setLayout(null);
        //

        JButton boton = new JButton();
        boton.setText("¡Presioname!");
        //Colocamos la posición y el tamaño
        boton.setBounds(135,150,130,50);
        //Esto se útiliza para agregar el botón al JFrame
        add(boton);

        this.setVisible(true);  
    }
}
El resultado es el siguiente:
Para agregar un elemento lo único que se debe hacer es útilizar el método add que tiene el JFrame.
Por ejemplo:
JFrame frame = new JFrame();
//Esto es necesario sino quieres Layout -formato-
frame.setLayout(null);
JLabel label = new JLabel("Etiqueta");
label.setBounds(10,10,100,75);
frame.add(label)
Al JFrame le puedes agrega Paneles, Botones, Etiquetas, Tablas etc.
Nota: Siempre coloca un tamaño al objeto que quieres agregar, si te preguntas porque es que no muestrá el objeto, es porque no le has dado un tamaño al objeto que quieres agregar.
En este caso útilizo setBounds para dar la posición y tamaño. Puedes también hacerlo con setLocation para indicar la posición y con setSize le indicas el tamaño.
JFrame frame = new JFrame();
//Esto es necesario sino quieres Layout -formato-
frame.setLayout(null);
JLabel label = new JLabel("Etiqueta");
label.setLocation(10,10);
label.setSize(100,75);
frame.add(label)
Pero más que decirte que lo agregas hay una cosa que necesitas saber y es que un JFrame utiliza algo que se llaman Layout y hay Layouts que pueden ser tan simples y otros complejos. Ahora un Layout es como un formato para definirlo en pocas palabras, y lo que se pretende es darnos una ayudadita al hora de agregar elementos. Creo que esto se entenderá un poco mejor colocando como ejemplo el siguiente Layout

BorderLayout -es el que más e usado- tiene un formato como el siguiente:
Imagen tomada de http://docs.oracle.com/
Este es el Layout que tiene por defecto un JFrame. La característica que tiene este Layout es que cuando se agrega un objeto automaticamente toma un tamaño aunque nosotros le hayamos asignado un tamaño, el tamaño que toma variará al tamaño del JFrame.

Por ejemplo si a un JFrame le agrego únicamento un botón entonces el botón tendría el tamaño del JFrame -me imagino que esto ya te a pasado, a mí también me paso :D-. Si hay más objetos entonces variará el tamaño, como en el ejemplo que muestra la imagen. La otra característica es que divide al JFrame en 5 partes, Arriba -PAGE_START-, Abajo -PAGE_END-, Izquierda -LINE_START-, Derecha -LINE_END- y Centro -CENTER-.

Por ejemplo si quires agregar una etiqueta al centro lo debes hacer de la siguiente manera:
JFrame frame = new JFrame();
//Esto es necesario sino quieres Layout -formato-
frame.setLayout(null);
JLabel label = new JLabel("Etiqueta");
label.setBounds(10,10,100,75);
//Se coloca BorderLayout.CENTER para indicar 
//que se debe colocará al centro
frame.add(label, BorderLayout.CENTER);
Si quisieras agregalo a:
  • La derecha: frame.add(label, BorderLayout.LINE_END);
  • La izquierda: frame.add(label, BorderLayout.LINE_START);
  • Arriba: frame.add(label, BorderLayout.PAGE_START);
  • Abajo: frame.add(label, BorderLayout.PAGE_END);
  • Centro: frame.add(label, BorderLayout.CENTER);
Hay varios tipos de Layout así que colocaré el nombre y una imagen. Las imagenes son tomadas de la página oficial y les dejo el link donde explican como usar cada uno de ellos http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html.

BoxLayout
CardLayout
FlowLayout
GridBagLayout
GridLayout
GroupLayout
SpringLayout
Espero que te sea útil. Dios te bendiga.

6 de abril de 2013

Java: Agregar color al texto JEditorPane

Ente algunas de las limitantes que tiene el JTextArea de Java es que no solamente soporta texto plano, sin ningún tipo de modificación. Por lo que si se desea agregar color, imágenes, fonts y otros elementos resulta imposible. Por esta razón existe el componente JEditorPane el cual nos permite agregar texto en formato "text/html", "text/rtf" y texto plano. 

También tiene la funcionalidad de poder abrir páginas web directamente como se ve en la siguiente imagen:


Como se puede observar incluso puede agregar algunos los botones de la página web aunque se limita su funcionalidad. En el ejemplo se mando a llamar a la pagina http://javainutil.blogspot.com y el resultado fue la imagen anterior. El código se puede ver a continuación.

Como se menciona en el título también existe la posibilidad de cambiar el color y font del contenido. En la siguiente imagen se observa el resultado. 

Para poder realizar realizar esto es necesario indicar que el contenido es el tipo "text/html" y cada String que se agregue al texto debe ir dentro de etiquetas html que modifiquen sus propiedades. En este caso, se utiliza un font que le cambia el color y el ultimo caso el tamaño. El código se muestra a continuación.


31 de marzo de 2013

Lista enlazada en Java

Un tema interesante ya que es base para realizar un sin fin de estructuras de datos. Aunque esto se puede hacer paso a paso java tiene una librería llamada java util en la cual se encuntran Listas enlazadas listas para utilizar, colas, pilas etc. Pero en esta caso lo vamos a hacer a patita. 

Comencemos..

En mi caso me gusta tomar casos de la vida cotidiana y hacer una analogía con las cosas que quiero aprender -aunque no es siempre-.

Por esto vamos a tomar una fila de niños, no se si has oido lo de "a un brazo de distancia", pero hagamos lo siguiente:
  • Los niños van a hacer los objetos, clases o instancia como le quieras llamar :D.
  • El brazo de cada niño es su puntero "siguiente"

Aca hay algo importante a ver y es ¿que es un mendigo puntero :D? Pues en este caso es el que me indica quien es el siguiente niño -siguiente elemento- y por lo tanto guarda la información de donde esta el niño. Los punteros los podemos manejar a nuestro antojo por ejemplo si queremos que nos indique quien es el niño anterior o el niño que sigue.

Para el ejemplo de lista enlazada vamos a tener dos punteros uno llamado inicio el cual me indicará donde inicia la lista y si pierdo este puntero perdere toda la lista. El otro puntero es el puntero último esto es porque cada nuevo niño -elemento- que ingrese lo ingresaremos al final de la fila -lista-.

El algoritmo para inserción de elementos para una lista enlazada sería el siguiente:
  1. Crear un nuevo elemento
  2. Si no hay ningun elemento en la lista
    1. El nuevo elemento será el inicio de la lista
    2. El nuevo elemento será el último de la lista
  3. Si ya existen elementos
    1. Al último elemento le indicamos que el nuevo elemento será su siguiente
    2. El nuevo elemento se convertirá en el último elemento.
Siguiendo con el tema, coloco un ejemplo de lista enlazada y explicando que hace. El ejemplo se basa en lo que comentaba de los niños en la fila "a una brazo de distancia" :D
Resultado del ejemplo:

Puedes descargar el Ejemplo de Lista Enlazada

Espero que te haya servido. Dios te bendiga.

25 de marzo de 2013

Hilos -Threads- en Java

Los hilos en java son algo muy interesante ya que nos permiten realizar varias tareas "al mismo tiempo", ahora ¿por qué digo "al mismo tiempo"? Porque realmente no se da de forma paralela ya que se les asignan pequeños tiempos de ejecución a cada uno hasta que finalicen su tarea.

Imagen tomada de: escribojava.blogspot.com
Para ejemplificar esto creo que el mejor ejemplo es el siguiente:
Es como aquellos juegos de tablero que tienen dos fichas para los jugadores y un dado para ver cuantas casillas avanza y ambos tienen que llegar a la meta.

Haciendo una analogía de esto con respeto a los hilos, podemos decir que el tablero es la aplicación, las dos fichas son las dos tareas -hilos- que se están ejecutando "al mismo tiempo" y el resultado que da el dado es el tiempo que le asigna el sistema a cada hilo.

Con esto sabemos que una ficha llegará a la meta antes que la otra aunque una de ellas haya comenzado en segundo lugar. Y como esto se da en milésimas de segundo o alguna medida de tiempo muy pequeño entonces se ve como si se estuviera ejecutando en paralelo, aunque se da de manera concurrente.

Otra cosa es que un hilo no es un proceso, son conceptos diferentes.

Ahora a lo practico :D.

Ejemplo

Como sé que hay personas que ya saben un poco de hilos y les gusta ir al hueso les dejo un ejemplo. Pueden ver la demostración del ejemplo en este video solo dura 11 segundos.


Escogí este ejemplo porque por lo regular surge el problema que si tenemos una tarea que dura por ejemplo 1 minuto y esta se ejecuta al presionar un botón, este botón podrá volver a presionarse luego de finalizada la tarea es decir luego de 1 minuto, pero tal vez necesitamos presionar este botón varias veces para ejecutar más tareas. Entonces este problema se resuelve por medio de hilos.

En este ejemplo un botón es un jugador y las tareas son los balones que van por la pantalla en diferentes direcciones.

Puedes descargar el ejemplo (src) EjemploHIlo.zip
El código lo puedes ver acá: Código Ejemplo de Hilos en Java

Ahora sigamos con las explicaciones :D

¿Como creo un hilo en java?

Un hilo se puede crear de dos formas:
  • Por medio de la interfaz Runnable
  • Por medio de la clase Thread
Realmente es casi lo mismo, y en ambas se tiene que colocar un método run().

Por medio de Runnable:

La ventaja de este es que una clase puede tener varias interfaces, es decir varios implements. A diferencia de una clase extendida que únicamente puede ser heredada de una clase esto porque java no maneja herencia múltiple.

Código:
//Creación de hilo
class MiClase implements Runnable {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }
}

Para ejecutar el código que tenemos en run(), es decir para ejecutar el hilo debemos hacerlo de la siguiente manera:
MiClase claseHilo = new MiClase();
Thread hilo = new Thread( claseHilo );
hilo.start();

Ejecutando el hilo desde la misma clase:
//Creación de hilo
class MiClase implements Runnable {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }

    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        Thread hilo = new Thread( this );
        hilo.start();
    }
}

Ejecutando el hilo desde otra clase:
//Creación de hilo
class MiClase implements Runnable {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }
}

class Ejecutar {
    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        MiClase claseHilo = new MiClase();
        Thread hilo = new Thread( claseHilo );
        hilo.start();
    }
}

Por medio de Thread:

Código:
//Creación de hilo
class MiClase extends Thread {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }
}

Para ejecutar el código que tenemos en run(), es decir para ejecutar el hilo debemos hacerlo de la siguiente manera:
this.start();

Ejecutando el hilo desde la misma clase:
//Creación de hilo
class MiClase extends Thread {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }

    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        this.start();
    }
}

Ejecutando el hilo desde otra clase:
//Creación de hilo
class MiClase extends Thread {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
    }
}

class Ejecutar {
    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        MiClase claseHilo = new MiClase();
        claseHilo.start();
    }
}

¿Como parar un Hilo?

La clase Thread tiene un método para parar un hilo pero esta en desuso y no debe utilizarse. Pero también se puede parar el hilo de forma manual por ejemplo utilizando una variable booleana.

Ejemplo:
//Clase Hilo
class Hilo extends Thread {
    //Este metodo es obligatorio ya que estamos implementando -usando una interface-
    public void run(){
        //Codigo que queremos ejecutar
        //Ciclo infinito controlado
        int i = 0;
        while( seguir == true ){
            System.out.println("Valor"+i);
            i++;
        }
    }

    //Para parar el hilo unicamente cambiamos el estado 
    //De la variable de seguir a false
    public void parar(){
        seguir = false;
    }
 
    public Hilo(){
        seguir = true;
    }

    private boolean seguir;
 
}

//Clase Ejecutar
class Ejecutar {
    //Metodo para llamar a ejecutar el Hilo
    public void ejecutarHilo(){
        Hilo claseHilo = new Hilo();
        claseHilo.start();
        //Se ejecuta por 1 segundo el hilo y luego paramos el hilo
        try{ Thread.sleep(1000); }catch(Exception e){}
        claseHilo.parar();
    }

    public static void main( String[] arg ){
        new Ejecutar();
    }

    public Ejecutar(){
        ejecutarHilo();
    }
}

Espero que haya sido de utilidad. Dios te bendiga.