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

sábado, 8 de diciembre de 2018

Graficando tablero de ajedrez.


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 el tablero.
Para las figuras he instalado una fuente gratuita llamada "Chess Cases".



Código1 (Tabla.java):

package ajedrez;

public class Tabla extends javax.swing.JFrame {

   public Tabla() {
      initComponents();
      this.setBounds(0, 0, 512, 512);
      this.setLocationRelativeTo(null);
      this.jPanel1.setBounds(0, 0, 512, 512);
      this.jPanel1.setBackground(new java.awt.Color(190, 190, 190));
   }

   private void initComponents() { ... } // Código generado automáticamente por Netbeans.                     

   private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {                                    
      Dibujar t = new Dibujar(jPanel1.getGraphics(), this.jPanel1.getWidth());
   }                                   

   public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            new Tabla().setVisible(true);
         }
      });
   }
                  
   private javax.swing.JPanel jPanel1;
        
}


Código2 (Dibujar.java):

package ajedrez;

import java.awt.BasicStroke;
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;
import java.awt.Stroke;

public class Dibujar {

   Rectangle rect = new Rectangle();

   public Dibujar(Graphics g, int xy) {

      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setColor(Color.GRAY);

      // Crea tablero
      int casillas = 8;
      int radio = xy / casillas;

      for (int j = 0; j < casillas; j++) {
         for (int i = 0; i < casillas; i++) {
            if ((j % 2) != 0) {
               g2.fillRect(2 * radio * i, radio * j, radio, radio);
            }
            if ((i % 2 != 0)) {
               g2.fillRect(radio * i, 2 * radio * j, radio, radio);
            }
         }
      }

      // Remarcar contorno
      Stroke pincel = new BasicStroke(2f);
      g2.setColor(Color.BLACK);
      g2.setStroke(pincel);
      g2.drawRect(0, 0, xy - 1, xy - 1);

      // Piezas
      Font font = new Font("Chess Cases", Font.TRUETYPE_FONT, 46);
      String piezas = "tmvwlvmt";


      for (int i = 0; i < casillas; i++) {

         // Inserción piezas negras
         g.setColor(Color.BLACK);
         rect.setBounds(radio * i, 0, radio, radio);
         centrarTexto(g, piezas.charAt(i) + "", rect, font);
         rect.setBounds(radio * i, radio, radio, radio);
         centrarTexto(g, "o", rect, font);

         // Inserción piezas blancas
         g.setColor(Color.WHITE);
         rect.setBounds(radio * i, radio * 7, radio, radio);
         centrarTexto(g, piezas.charAt(i) + "", rect, font);
         rect.setBounds(radio * i, radio * 6, radio, radio);
         centrarTexto(g, "o", rect, font);

      }

   }

   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:





Con la tecnología de Blogger.