Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.

Archivo del blog

viernes, 7 de diciembre de 2018

Graficando rosco del "Pasapalabra" (beta)


Desde Netbeans y en modo diseño se agrega un jFrame con la opción marcada "Grid Layout" y en propiedades activamos el check [v] undecorated. Se añade luego un jPanel, que servirá de lienzo para graficar. Algoritmo claramente mejorable de ahí que lo he puesto versión beta.


Código1 (Muro.java):

package pasapalabra;

public class Muro extends javax.swing.JFrame {
  
   public Muro() {
      initComponents();
      this.setBounds(0, 0, 512, 512);
      this.jPanel1.setBounds(0, 0, 512, 512);
      this.setLocationRelativeTo(null);
      this.repaint();
   }
                     
   private void initComponents() { ... }// Código generado automáticamente por Netbeans                      

   private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {                                    
      double grados = 0;
      Dibujar t = new Dibujar(jPanel1.getGraphics(), this.jPanel1.getWidth() / 2, this.jPanel1.getHeight() / 2, grados);
      Instrucciones(t);
   }                                   
  
   public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(() -> {
         new Muro().setVisible(true);
      });
   }
                  
   private javax.swing.JPanel jPanel1;         

   // Instrucciones tipo tortuga que dibuja
   private void Instrucciones(Dibujar t) {
      int n = 25;
      String letras = "GFEDCBAZYXVUTSRQPOÑNMLJIH";
      double x0, y0, r, grado;
     
      r = jPanel1.getWidth() / 2.5f;
     
      x0 = jPanel1.getWidth() / 2;
      y0 = jPanel1.getHeight() / 2;

      // Ángulo en radianes (importante)
      grado = (2 * Math.PI) / n;

      // Dibuja rosco pasapalabra
      t.gira(0);
      for (int i = 0; i < n; i++) {
         t.avanza(r);
         t.figura(letras.charAt(i));
         t.salta(x0, y0);
         t.gira(grado);
      }
   }
  
}


Código2 (Dibujar.java):

package pasapalabra;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;

public class Dibujar {

   double x, y, angulo;
   Graphics g;
   Graphics2D g2;
   Rectangle rect = new Rectangle();

   public Dibujar(Graphics g, double x, double y, double angulo) {
      this.x = x;
      this.y = y;
      this.angulo = angulo;
      this.g = g;

      g2 = (Graphics2D) g;
      // Filtro "antialiasing"
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
   }

   public void gira(double angulo) {
      this.angulo += angulo;
   }

   public void figura(char letra) {
      int r = 45; // Radio
      double x2 = x - (r / 2);
      double y2 = y - (r / 2);
      g.setColor(Color.BLUE);
      g.fillOval((int) x2, (int) y2, r, r);
      g.setColor(Color.WHITE);
      rect.setBounds((int) x2, (int) y2, r, r);
      centrarTexto(g, "" + letra, rect, new Font("", Font.BOLD, 26));
   }

   public void avanza(double distancia) {
      double x2 = x + distancia * Math.cos(angulo);
      double y2 = y - distancia * Math.sin(angulo);
      salta(x2, y2);
   }

   public void salta(double x, double y) {
      this.x = x;
      this.y = y;
   }

   private void centrarTexto(Graphics g, String texto, Rectangle r, Font f) {
      FontMetrics medir = g.getFontMetrics(f);
      int x = r.x + (r.width - medir.stringWidth(texto)) / 2;
      int y = r.y + ((r.height - medir.getHeight()) / 2) + medir.getAscent();
      g.setFont(f);
      g.drawString(texto, x, y);
   }

}


Resultado:




jueves, 6 de diciembre de 2018

Graficando triángulo de pascal (beta)


Desde Netbeans y en modo diseño se agrega un jFrame con la opción marcada "Grid Layout". Se añade luego un jPanel, que servirá de lienzo para graficar. Algoritmo claramente mejorable de ahí que lo he puesto versión beta.


Código1 (Muro.java):

package triangulopascal_2d;

public class Muro extends javax.swing.JFrame {

   public Muro() {
      this.setUndecorated(true);
      initComponents();
      this.setBounds(0, 0, 513, 513);
      this.jPanel1.setBounds(0, 0, 512, 512);
      this.setLocationRelativeTo(null); // Centrar pantalla  
      this.repaint();
   }
                        
   private void initComponents() { ... }         

   private void formMouseClicked(java.awt.event.MouseEvent evt) {                                 
      TrianguloPascal.Dibujar(jPanel1.getGraphics(), this.jPanel1.getWidth());
   }                                

   public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            new Muro().setVisible(true);
         }
      });
   }

   // Variables declaration - do not modify                    
   private javax.swing.JPanel jPanel1;
   // End of variables declaration                  
}


Código2 (TrianguloPascal.java):


package triangulopascal_2d;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class TrianguloPascal {

   public static void Dibujar(Graphics g, float xy) {

      Graphics2D g2 = (Graphics2D) g;

      // Inicialización variables
      int u = (int) xy / 32;
      int a = 1, b = 29, c = 29;
      int[] d1 = triangulo();
      int indice = 118;

      // Dibuja pirámide de bloques
      while (a <= b) {
         for (int i = a; i <= b; i = i + 2) {
            g2.setColor(Color.BLUE);
            g.fillRect(i * u + 1, c * u + 1, 2 * u - 1, 2 * u - 1);
            g2.setColor(Color.WHITE);
            if (indice >= 0) {
               g.drawString(String.format("%1$5s", d1[indice]), i * u, c * u + 20);
            } else {
               g.drawString(String.format("%1$5s", d1[0]), i * u, c * u + 20);
            }
            indice--;
         }
         a++;
         b--;
         c = c - 2;
      }

   }

   private static int[] triangulo() {

      int[] d1 = new int[119];
      int[][] d2 = new int[16][16];
      d2[1][1] = 1;
     
      int indice = 0;
      for (int j = 2; j < 16; j++) {
         for (int i = 1; i < 16; i++) {
            d2[j][i] = d2[j - 1][i - 1] + d2[j - 1][i];
            if (d2[j][i] != 0) {
               d1[indice] = d2[j][i];
               indice++;
            }
         }
      }

      d1[0] = 1;
      return d1;

   }

}


Resultado:







domingo, 18 de noviembre de 2018

#7 Empaquetado del proyecto.


Tríptico #7: Comandos de empaquetado:


En este apartado mostraremos como se realiza el empaquetado de la aplicación "MiPrograma" #1

    public class MiPrograma {
      public static void main(String arg[]) {
         System.out.println("Mi primer programa");
      }
    }



00- Desde símbolo del sistema verificar que el aplicativo ya ha sido compilado:


c:\proyecto> dir [enter]
18/11/2018  21:59    <DIR>          .
18/11/2018  21:59    <DIR>          ..
10/11/2018  17:38               598 MiPrograma.class
10/11/2018  17:38               598 MiPrograma.java
               2 archivos          1.196 bytes

c:\proyecto> _


01- Desde bloc de notas crear el fichero MANIFEST.MF y añadir las siguientes lineas [según los datos de la aplicación (versión, creador, clase principal, comentario)]:

Manifest-Version: 1.0
Created-By: Yo mismo
Main-Class: MiPrograma
X-COMMENT: Prueba de empaquetado



02- Guardar dentro la carpeta del proyecto.


03- Acceder al símbolo del sistema (cmd.exe):
Accedemos a la carpeta del proyecto:
 

> cd c:\proyecto [enter]
c:\proyecto> _


04- Generar fichero ejecutable a partir de la clase:

jar cvfm MiPrograma.jar manifest.mf MiPrograma.class [enter]


05- Ejecutar fichero .jar
en linea de comandos:

java -jar Miprograma.jar [enter]
Mi primer programa
> _




domingo, 11 de noviembre de 2018

#6 Comandos de Interacción (for, while, do-while)

Tríptico #6: Bucles (for, while, do-while)


    00- Nomenclatura sentencia for:

    for (inicio; termino; iteracion) {
            sentencia_1;
            sentencia_2;
            sentencia_n;
    }


    Ejemplo:

    // Contador del 0 al 9
    public class MiPrograma_Bucles1 {
      public static void main(String arg[]) {
        for (int i = 0 ; i < 10; i++) {
          System.out.println(i);
        }
      }
    }


    01- Nomenclatura sentencia while:

    while (expresionLogica) {
        sentencias;
    }


    Ejemplo:

    // Contador del 0 al 9
    public class MiPrograma_Bucles2 {
      public static void main(String arg[]) {
        byte a = 0, z = 10;
            while (a < z) {
              System.out.println(a);
              a++;
            }
      }
    }


    02- Nomenclatura sentencia do - while


    do {
            sentencias;
    } while (expresionLogica);


    Ejemplo:

    // Contador del 0 al 9
    public class MiPrograma_Bucles3 {
      public static void main(String arg[]) {
        byte a = 0, z = 10;
        do {
          System.out.println(a);
          a++;
        } while (a < z);
      }
    }



Con la tecnología de Blogger.