Source de l'article : Passionné d'informatique Auteur : Zhang Jian
Vous souvenez-vous encore de la Minicooper qui circulait dans le trafic hollywoodien comme un elfe dans "Le Dernier Jour" ? Mark Wahlberg et Sally Theron l'ont conduit pour transporter de l'or valant des dizaines de millions sous le nez de leurs ennemis. Cependant, si un corps de Minicooper qui ne peut pas courir rapidement était placé devant vous maintenant, que penseriez-vous de lui ? Est-ce toujours l'elfe errant ? Aujourd'hui, assemblons pièce par pièce les pièces de cette Minicooper et laissons fonctionner.
Préface
A partir de ce numéro, nous vous fournissons le code source complet du jeu (cliquez pour télécharger). Java Cafe préconise que tout le monde accorde la même attention à la théorie et à la pratique. Nous vous présenterons les technologies clés et les idées de mise en œuvre dans la série. Les amis peuvent lire le code source en conjonction avec l'article, tout comme lire un journal et boire du café en même temps. C'est là que le parfum de Didi ne s'épuise pas.
disposition du jeu
"Lianliankan" est un jeu d'échecs en deux dimensions. Si vous souhaitez concevoir un jeu d'échecs, GridLayout devrait être le meilleur choix. Jetons maintenant un œil au constructeur de GridLayout :
・GridLayout() : par défaut, la zone de mise en page est divisée en taille 1*1
・GridLayout(int rows, int cols) : spécifie le nombre de grilles horizontales et verticales dans la zone de mise en page.
・GridLayout (int rows, int cols, int hgap, int vgap) : identique à ci-dessus, et spécifie également l'espacement horizontal hgap et l'espacement vertical vgap entre chaque grille.
Ne laissez pas ces trois constructeurs vous effrayer. En fait, tant que vous l'aimez, vous pouvez utiliser n'importe lequel d'entre eux en toute confiance. Même si vous utilisez accidentellement le « mauvais », il existe des moyens de l'ajuster à l'avenir. La seule chose à noter est que lors de l'ajout de contrôles à GridLayout, l'ordre par défaut va du coin supérieur gauche au coin inférieur droit.
Déterminons maintenant le nombre de grilles pour le jeu. Combien de grilles sont appropriées ? Trop peu rendra le jeu moins difficile, trop entraînera un impact visuel. Par conséquent, nous devrions l'exprimer à travers une paire de constantes. Même si nous voulons le modifier à l'avenir, ce sera un jeu d'enfant.
En Java, la définition des constantes doit être écrite sous forme de statique finale publique. Si l'on stipule que le plateau de jeu comporte 8 grilles horizontalement et 8 grilles verticalement, alors nous devons le définir comme ceci :
public final static int ROW = 8 ;
public final static int COLONNE = 8 ;
Ensuite, nous utilisons le deuxième constructeur de GridLayout pour créer la mise en page :
GridLayout gridLayout = new GridLayout(ROW, COLUMN);
Enfin, nous devons également modifier la disposition de la zone de jeu (contentPanel) par la disposition ci-dessus :
contentPanel.setLayout(gridLayout);
Si vous compilez et exécutez le programme à ce moment-là, vous vous demandez peut-être : pourquoi n'y a-t-il eu aucun changement dans l'interface ? Bien que nous ayons spécifié la disposition, aucun contrôle n'a été ajouté, donc bien sûr aucun changement n'est visible. Ajoutons maintenant des boutons à la mise en page :
pour (int i = 0; i < LIGNE * COLONNE; i++) {
Bouton JButton = nouveau JButton("Kyodai");
contentPanel.add(bouton);
}
Essayez à nouveau d'exécuter le programme. Est-ce le même que le mien (voir Figure 1) ?
Utilisation intelligente de JButton pour faire des histoires
JButton est un contrôle de bouton. C'est également un contrôle extrêmement courant dans Swing. Cependant, nous devons encore faire un petit effort pour le comprendre et l'utiliser, car lorsque vous serez capable d'utiliser JButton avec compétence, vous trouverez d'autres contrôles Swing. aussi si semblable.
Si vous exécutez le programme que vous venez d'écrire, vous constaterez que les boutons de la zone de jeu sont toujours pleins, ce qui est très gênant pour le fonctionnement réel du jeu. Nous devons donc trouver un moyen de libérer certaines grilles. La mise en page GridLayout est bonne, mais vous ne pouvez pas ignorer une certaine grille lors de l'ajout de contrôles. Que dois-je faire maintenant ?
En fait, ce n'est pas difficile. Puisque GridLayout ne permet pas de sauter, si nous intégrons les contrôles ajoutés dans une certaine grille avec l'arrière-plan de la mise en page GridLayout, nous obtiendrons un effet visuel cohérent. De plus, si quelqu'un d'autre clique accidentellement sur cette grille, le bouton sera toujours exposé. Nous devons trouver un moyen d'empêcher le clic sur le bouton, ce qui nécessite l'utilisation de la méthode setEnabled() de JButton. Enfin, pour les boutons cliquables, lorsqu'on clique sur eux, il faut distinguer sur quel bouton on a cliqué.
Lorsque nous avons implémenté la fonction « À propos » la dernière fois, nous avons utilisé la méthode e.getSource() pour déterminer la source de l'événement de clic de souris. Cependant, cela n'était efficace que pour les contrôles nommés. Ici, utiliser un tableau pour représenter les boutons est sans aucun doute la meilleure façon. Tout d’abord, modifions le code ci-dessus :
JButton[] points = nouveau JButton[ROW * COLUMN];
pour (int i = 0; i < LIGNE * COLONNE; i++) {
points[i] = new JButton("Kyodai");
points[i].setActionCommand("" + i);
contentPanel.add(points[i]);
points[i].addActionListener(this);
}
N'oubliez pas d'écrire dots[i] = new JButton("Kyodai") dans le corps de la boucle. Bien que le numéro de groupe de points ait été défini et utilisé précédemment, cela indique uniquement au programme que nous devons utiliser certains JButtons, mais ceux-ci. Les JButtons ne sont toujours pas initialisés. Dans le même temps, nous utilisons non seulement setActionCommand() pour spécifier les noms d'événements pour les boutons, mais nous utilisons également la méthode addActionListener() pour ajouter un traitement de réponse d'événement à chaque bouton.
Concernant le code de réponse à l'événement, nous pouvons l'ajouter après le code d'événement actionPerformed() d'origine :
if (e.getSource() instance de JButton) {
Bouton JButton = (JButton) e.getSource();
int offset = Integer.parseInt(button.getActionCommand());
int rangée, col;
rangée = Math.round(décalage / COLONNE);
col = décalage - ligne * COLONNE ;
JOptionPane.showMessageDialog(this, "ROW="+row+", COL="
+ col, "Bouton", JOptionPane.INFORMATION_MESSAGE);
}
Dans le code ci-dessus, l'instance e.getSource() de JButton est utilisée pour déterminer si l'événement généré est généré par un contrôle de type JButton, puis effectue une conversion de classe forcée sur le contrôle qui génère la source d'événement, puis utilise Integer.parseInt( bouton La méthode .getActionCommand()) convertit le nom d'événement obtenu en un entier et le code suivant restaure cet entier en informations de ligne et de colonne.
D'accord, maintenant exécutez le programme et cliquez sur chaque bouton pour voir si une boîte de dialogue comme celle de droite apparaîtra ?
Notez que nos indices commencent à 0. Le code source du programme de ce numéro (cliquez pour télécharger).
Utiliser des images dans Swing
À l'heure actuelle, nous avons résolu le problème de fonctionnement de l'utilisateur. Afin de rendre l'interface belle, nous devons utiliser des images au lieu du texte. Les amis qui ont du temps et de la patience peuvent créer eux-mêmes des photos personnalisées, mais veillez à ce que la taille de chaque image soit cohérente, sinon elle sera trop moche. Si vous souhaitez éviter des ennuis, vous pouvez également utiliser directement les images fournies dans le package de téléchargement.
Dans Swing, vous pouvez utiliser la méthode setIcon(Image image) pour définir une image pour un JButton. Le paramètre image est l'objet image que nous voulons définir. Il existe de nombreuses façons d'obtenir cet objet :
・Utilisez la classe Toolkit pour obtenir :
image = Toolkit.getDefaultToolkit().getImage(url);
・Utilisez la méthode getImage() de la classe ImageIcon pour obtenir :
image = new ImageIcon(getClass().getResource(filename)).getImage();
Nous choisissons ici la première méthode. Afin de faciliter l'obtention à nouveau de l'objet Image dans le futur, nous pouvons écrire ceci sous forme de fonction :
Image getImage (nom de fichier de chaîne) {
URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
URL URL = nulle ;
Image image = nulle ;
url = urlLoader.findResource (nom de fichier);
image = Toolkit.getDefaultToolkit().getImage(url);
renvoyer l'image ;
}
Avec cette fonction, il sera beaucoup plus pratique d'utiliser des images à l'avenir, n'est-ce pas ?
Maintenant que l'image est disponible, nous pouvons exprimer les informations cartographiques dans Map.Java dans le package de code source sous la forme d'une image. Puisque ce code concerne le code algorithmique du jeu, je ne listerai plus le code. Expliquons brièvement comment cela se fait ici ! Dans Map.Java, nous utilisons un tableau bidimensionnel map[][] pour enregistrer les informations sur l'image. En même temps, nous utilisons également un tableau unidimensionnel images[] pour enregistrer chaque objet image. une valeur.Cette valeur indique non seulement la valeur correspondant au bouton dans l'interface du jeu, mais indique également le numéro de l'image dans le tableau images[] utilisé par ce bouton. L'interface d'exécution du programme sera beaucoup plus belle.
résumé
Aujourd'hui, nous avons présenté le contrôle JButton dans Swing. Pour la plupart des contrôles Swing, l'utilisation de JButton peut être copiée. Ne sous-estimez pas ce JButton. Lorsque vous parviendrez à bien le maîtriser, vos compétences Swing auront été améliorées à un niveau supérieur. De plus, nous avons également appris deux méthodes de chargement de fichiers image en Java. Enfin, nous avons combiné les deux parties ci-dessus pour créer une belle interface de jeu. Bien que je n'aie pas écrit le code complet ici, je pense que tout le monde pourra atteindre cet objectif en se référant à mon programme source et grâce à vos propres efforts. Si vous rencontrez un problème qui ne peut pas être résolu, vous pouvez me contacter via [email protected].
Je ne sais pas si vous êtes satisfait du contenu d’aujourd’hui ? L'excitation est encore à venir, tout le monde devrait continuer à fréquenter notre café !