Je travaille sur une interface graphique pour un jeu d'échecs et je me demandais s'il y avait un moyen de vérifier une série de clics, par exemple: l'utilisateur clique sur jPanel ALORS clics utilisateur sur un autre jPanel qui existe dans un tableau de déplacement valide. Je sais que je pourrais utiliser une variable pour stocker un type d'état comme "isSquareClicked = true" ou quelque chose mais je ne préférerais pas que ce soit la seule façon ...Vérification d'une série de clics dans java swing GUI
Répondre
Je ne vois rien de mal à utiliser JPanels. Voici mon implémentation:
D'abord un ChessSquare, cela représente une cellule sur la carte:
public class ChessSquare extends JPanel{
int x,y;
public ChessSquare(int x, int y){
super();
this.setPreferredSize(new Dimension(50,50));
this.setBorder(BorderFactory.createLineBorder(Color.black));
this.x = x;
this.y = y;
}
}
Maintenant, le panneau principal du conseil d'administration:
public class ChessPanel extends JPanel{
JPanel positions[][] = new JPanel[8][8];
ChessSquare move[] = new ChessSquare[2];
public ChessPanel(){
initComponents();
}
private void initComponents(){
setLayout(new GridLayout(8,8));
for(int i=0;i<positions.length;i++){
for(int j=0;j<positions[i].length;j++){
ChessSquare square = new ChessSquare(i,j);
square.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent me) {
ChessSquare cs = (ChessSquare)me.getComponent();
if(isValidMove(cs)){
System.out.println("Valid move!");
System.out.println("x1: "+move[0].x+" y1: "+move[0].y);
System.out.println("x2: "+move[1].x+" y2: "+move[1].y);
System.out.println("");
resetMove();
}
}
//Other mouse events
});
positions[i][j] = square;
add(square);
}
}
}
private boolean isValidMove(ChessSquare square){
//here you would check if the move is valid.
if(move[0] == null){
move[0] = square;
return false; //first click
}else{
move[1] = square;
}
//Other chess rules go here...
return true;
}
private void resetMove(){
move = new ChessSquare[2];
}
}
Nous gardons une matrice JPanel pour représenter le conseil d'administration, et tableau ChessSquare pour représenter le mouvement en cours. Dans isValidMove()
nous vérifions pour voir si le mouvement en cours est complet (les deux carrés ont été cliqués, ainsi le tableau de mouvement a déjà un élément). Une fois qu'un mouvement est terminé, nous réinitialisons le mouvement et recommençons.
Comme je sais, il n'y a pas de telles choses en Java .
Mais:
1) Si je comprends bien, vous utilisez le champ de 8x8 JPanels pour créer le terrain pour le jeu? À mon humble avis c'est mauvais. Si j'étais vous, j'utiliserais un panneau pour créer un champ - en y peignant tout (cellules, figures, etc.). C'est plus simple, plus rapide à créer, plus facile à travailler.
2) Revenons à votre question. Si vous avez un panneau pour le champ - vous devez seulement vous souvenir de deux paires de coordonnées: où était le premier clic, et où était le second. Dans votre cas - 2 pointeurs sur les panneaux sur lesquels vous avez cliqué suffiront. ;)
Hope this aide :)
+1 pour une idée simple. –
Je suis d'accord avec diablotin - Vous voulez sans doute d'avoir un seul JPanel et d'en tirer tout ce un panneau.
Cela dit, si quelqu'un avait déjà mis en place un jeu d'échecs avec JPanels 8x8 et m'a dit de l'utiliser, je pourrais essayer de mettre les 8x8 JPanels dans un JLayeredPane puis mettre un seul JPanel transparent au-dessus de tout pour gérer tous les clics de souris. Encore, cette approche vous demandera de faire l'arithmétique de Point pour savoir sur quelle cellule on clique, et je suppose que l'utilisation de 8x8 JPanels était que vous vouliez éviter de faire ce genre d'arithmétique dans le première place.
Je préférerais également des composants individuels pour les carrés car cela simplifie le code de manipulation des clics. Ce que cela rend un peu plus difficile, ce sont les animations entre les carrés. –
Pour l'animation entre les carrés, consultez le GlassPane. Une vitre est comme une feuille de verre qui se trouve au sommet de votre cadre, vous pouvez l'utiliser pour peindre des animations personnalisées entre les composants, dans ce cas, vos carrés individuels. – Cesar