some image

Author juangomez

Creación de dibujo simple con el método paintComponent

Etiquetas: , , , , , Blog, Programación 1 comment

Captura de pantalla 2015-06-18 00.15.24

 

Puede que la creación de dibujos simples en JAVA no sea muy útil en el campo laboral de un programador promedio, aún así es un buen ejercicio aprender algo nuevo sobre la interfaz gráfica de usuario (GUI) y de paso poder profundizar mas en el uso de los ciclos repetitivos while (ya verán porque).

Además de todo lo anterior es de gran ayuda entender como funciona el sistema de coordenadas y como se puede ubicar un punto en el contenedor del programa.

Para empezar hay que tener en cuenta que el sistema de coordenadas empieza desde la esquina superior izquierda donde las parejas ordenadas vendrían siendo (0,0) y finaliza en el último punto de la pantalla de la esquina inferior derecha donde las parejas ordenadas son el tamaño de ancho y alto de la aplicación.

Basado en lo dicho anteriormente se puede escoger el punto inicial y final de nuestro dibujo, sin embargo puedes preguntarte… Que pasaría si cambias el tamaño de la ventana de tu aplicación?.

La respuesta es que tu dibujo no se re-acomodaría al nuevo tamaño de la pantalla y posiblemente quede volando o sobrando según sea el caso. Por ese motivo se deben de crear dos variables que puedan traer el ancho y alto de la aplicación y después de esto con la formula porcentual puedes escoger el inicio y final de tu dibujo.

Teniendo claro esto ya se puede entrar a jugar con los ciclos repetitivos while y crear la figura o dibujo que se desea, yo decidí hacer una c dentro de dos etiquetas (mayor que y menor que ) que vendría siendo un sencillo logo de codes and tags, acá les va el código…

Clase que crea el panel

 

package codesdraw;
import javax.swing.JPanel;
import java.awt.Graphics;

//Clase CodesPanel hereda todos los componentes de la clase JPanel
public class CodesPanel extends JPanel{
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        //Se obtiene el ancho y alto de la aplicación
        int anchura = getWidth();
        int altura = getHeight();
        //Se definen los puntos X y Y que eventualmente serán cambiados según sea el caso
        int puntoInicioX =  (anchura / 100) * 15;
        int puntoInicioY =  (altura / 100) * 60;
        //la variable recorrido es el espacio que habrá entre cada nuevo caracter del dibujo
        int recorrido =  (anchura / 100) * 2;
        //Los limites son utilizados para determinar el final del dibujo
        int limite1 = (anchura / 100) * 50;
        int limite2 = (anchura / 100) * 60;
        int limite3 = (altura / 100) * 45 ;
        int limite4 = (altura / 100) * 77 ;
        int limite5 = (anchura / 100) * 45 ;
        int limite6 = (anchura / 100) * 65 ;
        //Variables tipo String que contienen el caracter que tendrán las imagenes
        String caracter1 = "*";
        String caracter2 = "+";


        //Ciclos while que crean la figura de la etiqueta
        while(puntoInicioX < limite1){
            g.drawString(caracter1, puntoInicioX, puntoInicioY);
            puntoInicioX += recorrido;
            puntoInicioY -= recorrido;
        }

        puntoInicioX =  (anchura / 100) * 15;
        puntoInicioY =  (altura / 100) * 60;

        while(puntoInicioX < limite1){             g.drawString(caracter1, puntoInicioX, puntoInicioY);             puntoInicioX += recorrido;             puntoInicioY += recorrido;         }         puntoInicioX =  (anchura / 100) * 95;         puntoInicioY =  (altura / 100) * 60;         while(puntoInicioX >= limite2){
            g.drawString(caracter1, puntoInicioX, puntoInicioY);
            puntoInicioX -= recorrido;
            puntoInicioY -= recorrido;

        }

        puntoInicioX =  (anchura / 100) * 95;
        puntoInicioY =  (altura / 100) * 60;

        while(puntoInicioX >= limite2){
            g.drawString(caracter1, puntoInicioX, puntoInicioY);
            puntoInicioX -= recorrido;
            puntoInicioY += recorrido;

        }

        //Ciclos while que dibujan la C dentro de las etiquetas < >

        puntoInicioX =  (anchura / 100) * 65;
        puntoInicioY =  (altura / 100) * 50;
        while(puntoInicioY > limite3){
            g.drawString(caracter2, puntoInicioX, puntoInicioY);
            puntoInicioY -= recorrido;

        }



        puntoInicioX =  (anchura / 100) * 65;
        puntoInicioY =  (altura / 100) * 45;
        while(puntoInicioX > limite5){
            g.drawString(caracter2, puntoInicioX, puntoInicioY);
            puntoInicioX -= recorrido;
        }



        puntoInicioX =  (anchura / 100) * 47;
        puntoInicioY =  (altura / 100) * 45;
        while(puntoInicioY < limite4){
            g.drawString(caracter2, puntoInicioX, puntoInicioY);
            puntoInicioY += recorrido;

        }

        puntoInicioX =  (anchura / 100) * 47;
        puntoInicioY =  (altura / 100) * 77;
        while(puntoInicioX < limite6){
            g.drawString(caracter2, puntoInicioX, puntoInicioY);
            puntoInicioX += recorrido;

        }


    }
}

Clase principal

package codesdraw;


import javax.swing.*;
import java.awt.*;

public class CodeDraw {
    public static void main(String args[]){
        //Se instancia la clase CodePanel
        CodesPanel panel = new CodesPanel();
        JFrame aplicacion = new JFrame();
        //Se agrega el panel dentro del JFrame
        aplicacion.add(panel);
        //Cambio color del fondo y la letra
        panel.setBackground(Color.black);
        panel.setForeground(Color.green);
        aplicacion.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //tamaño de la ventana
        aplicacion.setSize(350,350);
        aplicacion.setVisible(true);

    }
}

Acá puedes descargar el proyecto desde mi repositorio en GITHUB —> paintComponent

 

Para terminar me gustaría compartir otro ejemplo algo mas complejo del uso que se le puede dar al método paintComponent.

Captura de pantalla 2015-06-18 00.23.48

Creando un JFrame desde cero

Etiquetas: , , Blog, Programación No comments

 

Captura de pantalla 2015-06-04 22.56.35

Si estás comenzando en el gran mundo de JAVA (como yo), alguna ves te habrás preguntado como hacer gráfico e interactivo tu programa… Quizás habrás visto algunos vídeos en Youtube donde muestran como fácilmente  y con unos cuantos clicks haces una interfaz gráfica usando la opción de crear un nuevo JFrame Form que traen algunos IDE’s (Yo lo hice).

El punto es que cuando revisas el código e intentas entenderlo puede ser algo complejo para ti (Si es que ahora estás comenzando). Por esa razón tome la decisión de investigar como rayos se puede hacer un Frame desde cero y aquí les va.

/**
* Programa: TuJFrame.java
* Autor: Juan Gómez
* Blog: Codes and Tags
* Fecha: 05/06/2015
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class TuJFrame extends JFrame{
    //Se declaran atributos
    private Container contenedor;
    private JLabel titulo, juan, edwin, nombreJuan, nombreEdwin;
    private ImageIcon imagen1, imagen2;
    private JButton boton;
    public TuJFrame() {
        //Se creal el contenedor del panel que tendra todos los elementos
        contenedor = getContentPane();
        contenedor.setBackground(Color.white); //Se le asigna el color blanco al fondo del contenedor;
        titulo = new JLabel("Codes and Tags");
        titulo.setFont(new Font("Arial", Font.BOLD, 28)); // Cambio en el tipo de fuente
        imagen1 = new ImageIcon("images/edwin.png"); // Se crea un nuevo objeto tipo icono que contendra la imagen ubicada en la dirección "images/edwin.jpg"
        edwin = new JLabel(imagen1);// El JLabel "edwin" tendrá como contenido el ImageIcon "imagen1"
        imagen2 = new ImageIcon("images/juan.png");
        juan = new JLabel(imagen2);
        nombreEdwin = new JLabel("Edwin Torres");
        nombreEdwin.setFont(new Font("Arial", Font.ITALIC, 16));
        nombreEdwin.setVisible(false); // Por el momento no es visible el contenido del JLabel "nombreEdwin"
        nombreJuan = new JLabel("Juan Gomez");
        nombreJuan.setFont(new Font("Arial", Font.ITALIC, 16));
        nombreJuan.setVisible(false);
        boton = new JButton("Pulsame!");
        //Se define como nulo el Layout
        contenedor.setLayout(null);
        //Se le agregan los objetos al contenedor y luego se le asignas las posiciones a estos.
        contenedor.add(titulo).setBounds(250,10, 250, 40);
        contenedor.add(edwin).setBounds(42, 80, 287, 286);
        contenedor.add(juan).setBounds(359, 80, 287, 288);
        contenedor.add(nombreEdwin).setBounds(135, 386, 100, 20);
        contenedor.add(nombreJuan).setBounds(452, 386, 100, 20);
        contenedor.add(boton).setBounds(288, 430, 100, 20);

        //Evento para cuando se haga click sobre el boton cambie el estado del setVisible a "true" de los objetos nombreEdwin y nombreJuan
        // y al final muestre un mensaje en un JOption.
        boton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nombreEdwin.setVisible(true);
                nombreJuan.setVisible(true);
                JOptionPane.showMessageDialog(null, "Ves lo fácil que es crer tu propio JFrame..");
            }
        });

    }
    public static void main(String args[]){
        //Se instancia la clase
        TuJFrame mostrar = new TuJFrame();
        //Se asigna un tamaño al JFrame
        mostrar.setSize(680,530);
        //Se muestra el JFrame
        mostrar.setVisible(true);
        //Activa la opción de cerrar la ejecución del programa con la (X)
        mostrar.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }
}

Y después de hacer click en el botón…VOILÀ!

Captura de pantalla 2015-06-04 23.36.19

Puedes descargar el proyecto desde mi repositorio — > JFrame desde cero

Convertir Numeros a Letras (C++)

Etiquetas: , , , , Blog, Programación No comments

ciento_uno

 

Ha de esperarse que en algún momento de la carrera (y esto va para los que están estudiando ingeniería de sistemas), el profesor de programación les pida un programa donde se puedan convertir los números a su equivalente en letras. Normalmente requieren de 1-100(uno a cien), ó de 1-1000(uno a mil), pero si eres mi profesor de programación sabras que quisiste poner en aprietos a todos los estudiantes y lo pediste de 1-10000(uno a diez mil).

Lo primero que pensé fue que este programa sería un hueso duro de roer porque no hay mucho conocimiento ni experiencia cuando solo has visto la asignatura de algoritmos, pero al llegar a la solución me di cuenta de que no es una cosa del otro mundo y que se puede solucionar fácilmente si tienes buenas bases de programación.

Acá se los explico:

Lo primero que hay que hacer es desglosar el número desde su decenas de mil hasta sus unidades (esto va para el caso de los números de 1-10000), con una simple formula matemática.

Ejemplo:

Si tenemos el número 9834 haremos lo siguiente.

  • Verificar si tiene decenas de mil

9834 / 10000 = 0  (Si lo haces en una calculadora te dará algo como 0.9834, pero como es una división entre enteros los números después del punto no cuentan).

  • Unidades de mil

(9834 / 1000) % 10 = 9 (Para los que no están enterados, el % (porcentaje) representa el símbolo MOD, donde este hace la división pero en ves de arrojar el cociente muestra el residuo, que en este caso es nueve).

  • Centenas

(9834 / 100) % 10 = 8

  • Decenas

(9834 / 10) % 10 =  3

  • Unidades

(9834 %10) = 4

Lo anterior fue lo “dificil” del problema, ahora lo que sigue es lo sencillo y no creo que sea necesario explicar todas las sentencias if/else if/else ya que el código es muy diciente, por eso después de tanta palabrería acá les va el código.

 

#include <cstdlib>
#include <iostream>

/*
* Programa: Numeros_letras.cpp
* Autor: Juan Gómez
* Blog: Codes and Tags
* Fecha: 03/06/2015
*/

using namespace std;

int main() {

   int numero, n1, n2, n3, n4, n5;
   cout<<"Escribe un numero de uno a diez mil (numeros): "; cin>>numero;
   n1 = numero / 10000; 
   n2 = (numero / 1000) % 10;
   n3 = (numero / 100) % 10;
   n4 = (numero / 10) % 10;
   n5 = (numero % 10);

   cout<<"\n"<<n1<<" -> Decenas de mil"<<endl;
   cout<<n2<<" -> Unidades de mil"<<endl;
   cout<<n3<<" -> Centenas"<<endl;
   cout<<n4<<" -> Decenas"<<endl;
   cout<<n5<<" -> Unidades \n"<<endl;  
   if(numero > 10000){
      cout<<"El numero ingresado excede el rango de valores";
   }else{
      if(n1 == 1){
      cout<<"Diez mil"; 
      }
      //Sentencia para determinar los miles
      if(n2 == 1){
         cout<<"MIL ";
      }else if(n2 == 2){ 
         cout<<"DOS MIL "; 
      }else if(n2 == 3){
         cout<<"TRES MIL "; 
      }else if(n2 == 4){
         cout<<"CUATRO MIL "; 
      }else if(n2 == 5){
         cout<<"CINCO MIL "; 
      }else if(n2 == 6){
        cout<<"SEIS MIL "; 
      }else if(n2 == 7){
         cout<<"SIETE MIL "; 
      }else if(n2 == 8){
         cout<<"OCHO MIL "; 
      }else if(n2 == 9){
         cout<<"NUEVE MIL "; 
      }
      //Setencia para determinar los cientos
      if(n3 == 1 && n4 == 0 && n5 == 0){
         cout<<"CIEN";
      }else if(n3 == 1){
         cout<<"CIENTO ";
      }else if(n3 == 2){
         cout<<"DOSCIENTOS "; 
      }else if(n3 == 3){
         cout<<"TRESCIENTOS "; 
      }else if(n3 == 4){
         cout<<"CUATROCIENTOS "; 
      }else if(n3 == 5){
         cout<<"QUINIENTOS "; 
      }else if(n3 == 6){
         cout<<"SEISCIENTOS "; 
      }else if(n3 == 7){
         cout<<"SETECIENTOS "; 
      }else if(n3 == 8){
         cout<<"OCHOCIENTOS "; 
      }else if(n3 == 9){
         cout<<"NOVECIENTOS "; 
      }
      //Setencia para determinar las decenas
      if(n4 == 1 && n5 == 0){
         cout<<"Diez";
      }else if(n4 == 1 && n5 == 1){
         cout<<"ONCE";
      }else if(n4 == 1 && n5 == 2){
         cout<<"DOCE";
      }else if(n4 == 1 && n5 == 3){
         cout<<"TRECE";
      }else if(n4 == 1 && n5 == 4){
         cout<<"CATORCE";
      }else if(n4 == 1 && n5 == 5){
         cout<<"QUINCE";
      }else if(n4 == 1){
         cout<<"DIECI";
      }
      if(n4 == 2 && n5 == 0){
         cout<<"VEINTE";
      }else if(n4 == 2){
         cout<<"VEINTI"; 
      }else if(n4 == 3 && n5 == 0){
         cout<<"TREINTA";
      }else if(n4 == 3){
         cout<<"TREINTA Y "; 
      }else if(n4 == 4 && n5 == 0){
         cout<<"CUARENTA";
      }else if(n4 == 4){
         cout<<"CUARENTA Y "; 
      }else if(n4 == 5 && n5 == 0){
         cout<<"CINCUENTA";
      }else if(n4 == 5){
         cout<<"CINCUENTA Y "; 
      }else if(n4 == 6 && n5 == 0){
         cout<<"SESENTA";
      }else if(n4 == 6){
         cout<<"SESENTA Y "; 
      }else if(n4 == 7 && n5 == 0){
         cout<<"SETENTA";
      }else if(n4 == 7){
         cout<<"SETENTA Y "; 
      }else if(n4 == 8 && n5 == 0){
         cout<<"OCHENTA";
      }else if(n4 == 8){
         cout<<"OCHENTA Y "; 
      }else if(n4 == 9 && n5 == 0){
         cout<<"NOVENTA";
      }
      else if(n4 == 9){
         cout<<"NOVENTA Y ";
      } 
      //Sentencia para determinar las unidades  
      if(n5 == 1 && n4 > 1){
         cout<<"UNO"; 
      }else if(n5 == 1 && n4 == 0){
         cout<<"UNO";  
      }else if(n5 == 2 && n4 > 1){
         cout<<"DOS"; 
      }else if(n5 == 2 && n4 == 0){
         cout<<"DOS"; 
      }else if(n5 == 3 && n4 > 1){
         cout<<"TRES"; 
      }else if(n5 == 3 && n4 == 0){
         cout<<"TRES";  
      }else if(n5 == 4 && n4 > 1){
         cout<<"CUATRO"; 
      }else if(n5 == 4 && n4 == 0){
         cout<<"CUATRO";  
      }else if(n5 == 5 && n4 > 1){
         cout<<"CINCO"; 
      }else if(n5 == 5 && n4 == 0){
         cout<<"CINCO"; 
      }else if(n5 == 6){
         cout<<"SEIS"; 
      }else if(n5 == 7){
         cout<<"SIETE"; 
      }else if(n5 == 8){
         cout<<"OCHO"; 
      }else if(n5 == 9){
         cout<<"NUEVE"; 
      }
   } 
}

Resultado numeros letras