Fuente del artículo: Entusiasta de la informática Autor: Zhang Jian
¿Todavía recuerdas al Minicooper que avanzaba como un elfo entre el tráfico de Hollywood en "El último día"? Mark Wahlberg y Sally Theron lo impulsaron para transportar oro por valor de decenas de millones ante las narices de sus enemigos. Sin embargo, si ahora se colocara frente a ti una carrocería de Minicooper que no puede correr rápidamente, ¿qué te parecería? ¿Sigue siendo el elfo errante? Hoy vamos a montar pieza por pieza las piezas de este Minicooper y dejarlo funcionar.
Prefacio
A partir de este número, le proporcionamos el código fuente completo del juego (haga clic para descargar). Java Cafe aboga por que todos presten la misma atención a la teoría y la práctica. En la serie, le presentaremos tecnologías clave e ideas de implementación. Los amigos pueden leer el código fuente junto con el artículo, como leer un periódico y tomar café al mismo tiempo. tiempo. Aquí es donde la fragancia de Didi no se agota.
diseño del juego
"Lianliankan" es un juego de ajedrez bidimensional. Si quieres diseñar un juego de ajedrez, GridLayout debería ser la mejor opción. Ahora echemos un vistazo al constructor de GridLayout:
・GridLayout(): de forma predeterminada, el área de diseño se divide en un tamaño de 1*1
・GridLayout(int rows, int cols): especifica el número de cuadrículas horizontales y verticales en el área de diseño.
・GridLayout(int rows, int cols, int hgap, int vgap): Igual que el anterior, y también especifica el espaciado horizontal hgap y el espaciado vertical vgap entre cada cuadrícula
No dejes que estos tres constructores te asusten. De hecho, siempre que te guste, puedes usar cualquiera de ellos con confianza. Incluso si accidentalmente usas el "incorrecto", hay formas de ajustarlo en el futuro. Lo único a tener en cuenta es que al agregar controles a GridLayout, el orden predeterminado es de arriba a la izquierda a abajo a la derecha.
Ahora determinemos el número de cuadrículas para el juego. ¿Cuántas rejillas son apropiadas? Demasiado poco hará que el juego sea menos difícil, demasiado causará impacto visual. Por lo tanto, debemos expresarlo a través de un par de constantes. Incluso si queremos modificarlo en el futuro, será muy sencillo.
En Java, la definición de constantes debe escribirse en forma de estática final pública. Si estipulamos que el tablero de juego tiene 8 cuadrículas horizontales y 8 cuadrículas verticales, entonces debemos definirlo así:
público final estático int FILA = 8;
public final static int COLUMNA = 8;
Luego, usamos el segundo constructor de GridLayout para crear el diseño:
GridLayout gridLayout = new GridLayout(FILA, COLUMNA);
Finalmente, también necesitamos cambiar el diseño del área del juego (contentPanel) al diseño anterior:
contentPanel.setLayout(gridLayout);
Si compila y ejecuta el programa en este momento, es posible que se pregunte: ¿Por qué no ha habido cambios en la interfaz? Aunque hemos especificado el diseño, no se han agregado controles, por lo que, por supuesto, no se pueden ver cambios. Ahora agreguemos botones al diseño:
for (int i = 0; i < FILA * COLUMNA; i++) {
Botón JButton = nuevo JButton("Kyodai");
contentPanel.add(botón);
}
Intente ejecutar el programa nuevamente. ¿Es el mismo que el mío (ver Figura 1)?
Uso inteligente de JButton para armar un escándalo
JButton es un control de botón. También es un control extremadamente común en Swing. Sin embargo, todavía necesitamos hacer un poco de esfuerzo para comprenderlo y usarlo, porque cuando puedas usar JButton con habilidad, encontrarás otros controles de Swing. también tan parecido.
Si ejecuta el programa que acaba de escribir, encontrará que los botones en el área del juego siempre están llenos, lo cual es muy inconveniente para el funcionamiento real del juego. Por lo tanto, tenemos que encontrar una manera de liberar algunas cuadrículas. El diseño de GridLayout está bien, pero no puede omitir una cuadrícula determinada al agregar controles. ¿Qué debo hacer ahora?
De hecho, esto no es difícil, dado que GridLayout no permite omitir, si integramos los controles agregados en una determinada cuadrícula con el fondo del diseño de GridLayout, lograremos un efecto visual consistente. Además, si alguien más hace clic en esta cuadrícula accidentalmente, el botón seguirá expuesto. Tenemos que encontrar una manera de evitar que se haga clic en el botón, lo que requiere el uso del método setEnabled() de JButton. Finalmente, para los botones en los que se puede hacer clic, cuando se hace clic en ellos, tenemos que distinguir en qué botón se hizo clic.
Cuando implementamos la función "Acerca de" la última vez, utilizamos el método e.getSource() para determinar el origen del evento de clic del mouse. Sin embargo, eso solo fue efectivo para los controles con nombre. Aquí, usar una matriz para representar botones es sin duda la mejor manera. Primero, modifiquemos el código anterior:
JButton[] puntos = nuevo JButton[FILA * COLUMNA];
for (int i = 0; i < FILA * COLUMNA; i++) {
puntos[i] = nuevo JButton("Kyodai");
puntos[i].setActionCommand("" + i);
contentPanel.add(puntos[i]);
puntos[i].addActionListener(este);
}
No olvide escribir puntos [i] = nuevo JButton ("Kyodai") en el cuerpo del bucle. Aunque el número del grupo de puntos se definió y usó anteriormente, esto solo le indica al programa que necesitamos usar algunos JButtons, pero estos. Los JButtons aún no están inicializados. Al mismo tiempo, no solo usamos setActionCommand() para especificar nombres de eventos para botones, sino que también usamos el método addActionListener() para agregar procesamiento de respuesta de eventos a cada botón.
Con respecto al código de respuesta del evento, podemos agregarlo después del código del evento actionPerformed() original:
if (e.getSource() instancia de JButton) {
Botón JButton = (JButton) e.getSource();
int desplazamiento = Integer.parseInt(button.getActionCommand());
en fila, columna;
fila = Math.round(desplazamiento / COLUMNA);
col = desplazamiento - fila * COLUMNA;
JOptionPane.showMessageDialog(this, "ROW="+fila+", COL="
+ columna, "Botón", JOptionPane.INFORMATION_MESSAGE);
}
En el código anterior, la instancia e.getSource() de JButton se usa para determinar si el evento generado es generado por un control de tipo JButton y luego realiza una conversión de clase forzada en el control que genera el origen del evento y luego usa Integer.parseInt( botón El método .getActionCommand()) convierte el nombre del evento obtenido en un número entero, y el siguiente código restaura este número entero en la información de filas y columnas.
Bien, ahora ejecute el programa y haga clic en cada botón para ver si aparece un cuadro de diálogo como el de la derecha.
Tenga en cuenta que nuestros subíndices comienzan desde 0. El código fuente del programa de este número (haga clic para descargar).
Usando imágenes en Swing
Actualmente, hemos resuelto el problema de operación del usuario. Para que la interfaz sea hermosa, necesitamos usar imágenes en lugar de texto. Los amigos que tengan tiempo y paciencia pueden hacer fotografías personalizadas ellos mismos, pero tengan cuidado de mantener el tamaño de cada imagen constante, de lo contrario quedarán demasiado feas. Si desea evitar problemas, también puede utilizar directamente las imágenes proporcionadas en el paquete de descarga.
En Swing, puede usar el método setIcon (imagen de imagen) para configurar una imagen para un JButton. La imagen del parámetro es el objeto de imagen que queremos configurar. Hay muchas formas de obtener este objeto.
・Utilice la clase Toolkit para obtener:
imagen = Toolkit.getDefaultToolkit().getImage(url);
・Utilice el método getImage() de la clase ImageIcon para obtener:
imagen = new ImageIcon(getClass().getResource(nombre de archivo)).getImage();
Elegimos aquí el primer método. Para facilitar la obtención del objeto Imagen nuevamente en el futuro, podemos escribir esto como una función:
Imagen getImage(nombre de archivo de cadena){
URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
URL URL = nulo;
Imagen imagen = nula;
url = urlLoader.findResource(nombre de archivo);
imagen = Toolkit.getDefaultToolkit().getImage(url);
devolver imagen;
}
Con esta función será mucho más cómodo utilizar imágenes en el futuro, ¿no?
Ahora que la imagen está disponible, podemos expresar la información del mapa en Map.Java en el paquete de código fuente en forma de imagen. Dado que este código trata sobre el código del algoritmo del juego, no enumeraré más el código. ¡Expliquemos brevemente cómo se hace aquí! En Map.Java, usamos una matriz bidimensional map[][] para guardar información de la imagen. Al mismo tiempo, también usamos una matriz unidimensional images[] para guardar cada objeto de imagen. un valor. Este valor no solo indica el valor correspondiente al botón en la interfaz del juego, sino que también indica el número de la imagen en la matriz de imágenes [] utilizada por este botón. La interfaz de ejecución del programa será mucho más hermosa.
resumen
Hoy presentamos el control JButton en Swing. Para la mayoría de los controles Swing, se puede copiar el uso de JButton. No subestimes este JButton. Cuando puedas dominarlo bien, tus habilidades de Swing habrán mejorado a un nivel superior. Además, también aprendimos dos métodos para cargar archivos de imágenes en Java. Finalmente, combinamos las dos partes anteriores para crear una hermosa interfaz de juego. Aunque no he escrito el código completo aquí, creo que todos podrán lograr el objetivo consultando mi programa fuente y con sus propios esfuerzos. Si encuentra un problema que no se puede resolver, puede contactarme a través de [email protected].
No sé si estás satisfecho con el contenido de hoy. La emoción aún está por llegar, ¡todos deberían seguir frecuentando nuestro café!