queqtion sur image.gif

queqtion sur image.gif - Divers - Programmation

Marsh Posté le 21-04-2014 à 01:39:29    

Bonjour,
 
Je souhaite reprendre la programmation d'un jeu d'échecs.
Le premier, je l'ai interrompu à une finale roi+cavalier <-->roi +cavalier, il jouait tout seul, sans s'interrompre,  en effet pas de mat pour cette finale.
Pourquoi me suis-je arrêter ?
Je programmais le dessin des pièces en utilisant les API de Windows du livre de Petzold ("Remarquable, ceci dit" ), vous voyez, c'est pas d'hier.
Mais c'est abominablement pénible de faire comme ça.
Alors, voila ma question :
Si je récupère les images des pièces d'échec en .gif ou .jpeg (je programme en java), comment les placer à un endroit précis de l'échiquier, et changer leurs dimensions, si elles sont trop grandes ou trop petites.
J'ai fait un programme qui récupère via un menu des images et les affiche, mais telles qu'elles existent, et là où le gestionnaire de positionnement choisit doit les placer,
 
auriez vous un conseil,
 
Merci,
 
Pilaau

Reply

Marsh Posté le 21-04-2014 à 01:39:29   

Reply

Marsh Posté le 21-04-2014 à 11:51:00    

pilaau a écrit :

Bonjour,
 
Je souhaite reprendre la programmation d'un jeu d'échecs.
Le premier, je l'ai interrompu à une finale roi+cavalier <-->roi +cavalier, il jouait tout seul, sans s'interrompre,  en effet pas de mat pour cette finale.
Pourquoi me suis-je arrêter ?
Je programmais le dessin des pièces en utilisant les API de Windows du livre de Petzold ("Remarquable, ceci dit" ), vous voyez, c'est pas d'hier.
Mais c'est abominablement pénible de faire comme ça.
Alors, voila ma question :
Si je récupère les images des pièces d'échec en .gif ou .jpeg (je programme en java), comment les placer à un endroit précis de l'échiquier, et changer leurs dimensions, si elles sont trop grandes ou trop petites.
J'ai fait un programme qui récupère via un menu des images et les affiche, mais telles qu'elles existent, et là où le gestionnaire de positionnement choisit doit les placer,
 
auriez vous un conseil,
 
Merci,
 
Pilaau


 
Plusieurs approches existent, par exemple un unique Canvas ou composant sur lequel on dessine les 8x8 cases et les pièces.
Mais pour moi, la solution la plus simple est d'utiliser un layout qui va gérer directement. Par exemple un GridLayout pour le damier et un JLabel pour afficher les images. L'inconvénient est que les images ne sont pas redimensionnées si on modifie la taille de la fenêtre.
 
http://reho.st/preview/self/c87f94e604d91c2c9f8e9947d733c1fb55078c55.png
 

Code :
  1. import java.awt.Container;
  2. import java.awt.Dimension;
  3. import java.awt.GridLayout;
  4. import javax.swing.ImageIcon;
  5. import javax.swing.JFrame;
  6. import javax.swing.JLabel;
  7. import javax.swing.JPanel;
  8. import javax.swing.SwingUtilities;
  9. public class Main {
  10. public static void initAndShowGui() {
  11.  JFrame f = new JFrame("Chess Game" );
  12.  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13.  f.setLayout(new GridLayout(8, 8));
  14.  JPanel[][] gridPanel = new JPanel[8][8];
  15.  for(int i = 0; i<8; i++) {
  16.   for(int j = 0; j<8; j++) {
  17.    gridPanel[i][j] = new JPanel();
  18.   }
  19.  }
  20.  ImageIcon cavalierIcon = new ImageIcon(Main.class.getResource("/img/Echec_Cavalier.png" ));
  21.  ImageIcon dameIcon = new ImageIcon(Main.class.getResource("/img/Echec_Dame.png" ));
  22.  ImageIcon fouIcon = new ImageIcon(Main.class.getResource("/img/Echec_Fou.png" ));
  23.  ImageIcon pionIcon = new ImageIcon(Main.class.getResource("/img/Echec_Pion.png" ));
  24.  ImageIcon roiIcon = new ImageIcon(Main.class.getResource("/img/Echec_Roi.png" ));
  25.  ImageIcon tourIcon = new ImageIcon(Main.class.getResource("/img/Echec_Tour.png" ));
  26.  gridPanel[0][0].add(new JLabel(tourIcon));
  27.  gridPanel[0][7].add(new JLabel(tourIcon));
  28.  gridPanel[7][0].add(new JLabel(tourIcon));
  29.  gridPanel[7][7].add(new JLabel(tourIcon));
  30.  gridPanel[0][1].add(new JLabel(cavalierIcon));
  31.  gridPanel[0][6].add(new JLabel(cavalierIcon));
  32.  gridPanel[7][1].add(new JLabel(cavalierIcon));
  33.  gridPanel[7][6].add(new JLabel(cavalierIcon));
  34.  gridPanel[0][2].add(new JLabel(fouIcon));
  35.  gridPanel[0][5].add(new JLabel(fouIcon));
  36.  gridPanel[7][2].add(new JLabel(fouIcon));
  37.  gridPanel[7][5].add(new JLabel(fouIcon));
  38.  gridPanel[0][3].add(new JLabel(dameIcon));
  39.  gridPanel[0][4].add(new JLabel(roiIcon));
  40.  gridPanel[7][3].add(new JLabel(dameIcon));
  41.  gridPanel[7][4].add(new JLabel(roiIcon));
  42.  Container c = f.getContentPane();
  43.  for(int i = 0; i<8; i++) {
  44.   for(int j = 0; j<8; j++) {
  45.    c.add(gridPanel[i][j]);
  46.   }
  47.  }
  48.  for(int i = 0; i<8; i++) {
  49.   gridPanel[1][i].add(new JLabel(pionIcon));
  50.   gridPanel[6][i].add(new JLabel(pionIcon));
  51.  }
  52.  f.setMinimumSize(new Dimension(640, 640));
  53.  f.setLocationRelativeTo(null);
  54.  f.setVisible(true);
  55. }
  56. public static void main(String[] args) {
  57.  SwingUtilities.invokeLater(new Runnable() {
  58.   @Override
  59.   public void run() {
  60.    initAndShowGui();
  61.   }
  62.  });
  63. }
  64. }


 
 
Sinon, une solution possible est de créer une classe qui hérite de JPanel et de dessiner sur le composant.
On a un GridLayout composé de 8x8 JPanel sur lesquels on dessine. Par exemple quelque chose comme le squelette suivant :

Code :
  1. public class GridCell extends JPanel {
  2. private BufferedImage image = null;
  3. private BufferedImage background = null;
  4. //code : [...]
  5. @Override
  6. public void paintComponent(Graphics g) {
  7.  super.paintComponent(g);
  8.  Graphics2D g2 = (Graphics2D) g;
  9.    
  10.  if(background != null) {
  11.      g2.drawImage(background, 0, 0, getWidth(), getHeight(), this);
  12.  }
  13.  if(image != null) {
  14. //x,y position dans le JPanel à calculer pour centrer l'image
  15. //scaleWidth, scaleHeight taille de l'image à calculer
  16.      g2.drawImage(image, x, y, scaleWidth, scaleHeight, this);
  17.  }
  18. }


 
Pas de problème de redimensionnement si l'on effectue les calculs.
http://reho.st/preview/self/0cda25677e744fd8a6593ccd303fce2c0c4a3025.png
http://reho.st/preview/self/1388363bb151d85f5cd668377206ce0d66da0264.png


Message édité par honrisse le 31-05-2014 à 01:59:19
Reply

Marsh Posté le 21-04-2014 à 16:36:57    

Bonjour,
 
Merci Honrisse,
Mais, il va me falloir un peu de temps (2, 3 jours)pour exploiter ta réponse, n'étant pas encore très familier de la programmation graphique en java.
Dans tous les cas je te tiendrais au courant.
Juste une petite question, quand tu dis  "dessiner", tu veux dire, placer une image récupérée quelque part ?
 
Merci à nouveau,  
 
Philippe

Reply

Marsh Posté le 21-04-2014 à 17:26:46    

pilaau a écrit :


Juste une petite question, quand tu dis  "dessiner", tu veux dire, placer une image récupérée quelque part ?


 
Par dessiner, je veux dire que l'on manipule directement les coordonnées pour placer les images plutôt que d'utiliser un layout par exemple, même si l'on peut faire les deux comme dans le 2e exemple (GridLayout + redéfinitition de paintComponent).

Reply

Marsh Posté le 21-04-2014 à 17:54:27    

Bonjour,
 
Merci Honrisse,
 
 
J'ai cherché à exploiter de façon "liminaire" tes réponses, j'ai écarté ta deuxième proposition, ne connaissant pas Graphics2D,
j'ai donc choisis la première proposition, j'ai cherché à la compiler en ligne de commande, j'ai imaginer que le fichier s'appelait "Main.java" ??
La compilation est bien passée,
Mais à l'exexcution,
java main, j'ai eu :
 


java Main
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 at javax.swing.ImageIcon.<init>(ImageIcon.java:205)
 at Main.initAndShowGui(Main.java:20)
 at Main$1.run(Main.java:60)
 at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
 at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
 at java.awt.EventQueue.access$200(EventQueue.java:103)
 at java.awt.EventQueue$3.run(EventQueue.java:694)
 at java.awt.EventQueue$3.run(EventQueue.java:692)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

 
 
Quelle erreur sis bien pu faire ?
Hypoyhèse :je déduis habituellement le nom des fichier depuis le nom de la classe principale, ici, je n'ai trouvé que Main.
S'il s'agit d'un piège du labyrinthe de OSX, je compterais que tu préfère te laisser du temps.
 
Merci,
 
Pilaau

Reply

Marsh Posté le 21-04-2014 à 17:58:03    

je voulais dire " je comprendrais que tu veuilles te laisser du temps"
Désolé !
 
Pilaau

Reply

Marsh Posté le 22-04-2014 à 08:11:54    

pilaau a écrit :

Bonjour,
 
Merci Honrisse,
 
 
J'ai cherché à exploiter de façon "liminaire" tes réponses, j'ai écarté ta deuxième proposition, ne connaissant pas Graphics2D,
j'ai donc choisis la première proposition, j'ai cherché à la compiler en ligne de commande, j'ai imaginer que le fichier s'appelait "Main.java" ??
La compilation est bien passée,
Mais à l'exexcution,
java main, j'ai eu :
 


java Main
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 at javax.swing.ImageIcon.<init>(ImageIcon.java:205)
 at Main.initAndShowGui(Main.java:20)
 at Main$1.run(Main.java:60)
 at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
 at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
 at java.awt.EventQueue.access$200(EventQueue.java:103)
 at java.awt.EventQueue$3.run(EventQueue.java:694)
 at java.awt.EventQueue$3.run(EventQueue.java:692)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

 
 
Quelle erreur sis bien pu faire ?
Hypoyhèse :je déduis habituellement le nom des fichier depuis le nom de la classe principale, ici, je n'ai trouvé que Main.
S'il s'agit d'un piège du labyrinthe de OSX, je compterais que tu préfère te laisser du temps.
 
Merci,
 
Pilaau


 
Cela semble être un problème de chemin d'accès des images :

Code :
  1. ImageIcon cavalierIcon = new ImageIcon("chemin vers l'image/img/Echec_Cavalier.png" );


 
J'utilise getResource http://docs.oracle.com/javase/tuto [...] /icon.html et mes images sont comme ceci :

  • src/Main.java
  • src/img/image.png


Pas très important mais je conseille l'IDE Eclipse, ça permet quelques facilités (auto complétion, soulignement des erreurs, ...).

Reply

Marsh Posté le 22-04-2014 à 12:17:27    

Bonjour,  
 
J'ai suivi ton conseil, j'utilise eclipse avec :  
Create a Hello World SWT application
 
Voici le dource que j'ai crée :
 

Code :
  1. import org.eclipse.swt.widgets.Display;
  2. import org.eclipse.swt.widgets.Shell;
  3. import java.awt.Container;
  4. import java.awt.Dimension;
  5. import java.awt.GridLayout;
  6. import javax.swing.ImageIcon;
  7. import javax.swing.JFrame;
  8. import javax.swing.JLabel;
  9. import javax.swing.JPanel;
  10. import javax.swing.SwingUtilities;
  11. public class ChessSWT {
  12. public static void initAndShowGui() {
  13. JFrame f = new JFrame("Chess Game" );
  14. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15. f.setLayout(new GridLayout(8, 8));
  16. JPanel[][] gridPanel = new JPanel[8][8];
  17. for(int i = 0; i<8; i++) {
  18.   for(int j = 0; j<8; j++) {
  19.    gridPanel[i][j] = new JPanel();
  20.   }
  21. }
  22. ImageIcon cavalierIcon = new ImageIcon(ChessSWT.class.getResource("/img/Echec_Cavalier.png" ));
  23. ImageIcon dameIcon = new ImageIcon(ChessSWT.class.getResource("/img/Echec_Dame.png" ));
  24. ImageIcon fouIcon = new ImageIcon(ChessSWT.class.getResource("/img/Echec_Fou.png" ));
  25. ImageIcon pionIcon = new ImageIcon(ChessSWT.class.getResource("/img/Echec_Pion.png" ));
  26. ImageIcon roiIcon = new ImageIcon(ChessSWT.class.getResource("/img/Echec_Roi.png" ));
  27. ImageIcon tourIcon = new ImageIcon(ChessSWT.class.getResource("/img/Echec_Tour.png" ));
  28. gridPanel[0][0].add(new JLabel(tourIcon));
  29. gridPanel[0][7].add(new JLabel(tourIcon));
  30. gridPanel[7][0].add(new JLabel(tourIcon));
  31. gridPanel[7][7].add(new JLabel(tourIcon));
  32. gridPanel[0][1].add(new JLabel(cavalierIcon));
  33. gridPanel[0][6].add(new JLabel(cavalierIcon));
  34. gridPanel[7][1].add(new JLabel(cavalierIcon));
  35. gridPanel[7][6].add(new JLabel(cavalierIcon));
  36. gridPanel[0][2].add(new JLabel(fouIcon));
  37. gridPanel[0][5].add(new JLabel(fouIcon));
  38. gridPanel[7][2].add(new JLabel(fouIcon));
  39. gridPanel[7][5].add(new JLabel(fouIcon));
  40. gridPanel[0][3].add(new JLabel(dameIcon));
  41. gridPanel[0][4].add(new JLabel(roiIcon));
  42. gridPanel[7][3].add(new JLabel(dameIcon));
  43. gridPanel[7][4].add(new JLabel(roiIcon));
  44. Container c = f.getContentPane();
  45. for(int i = 0; i<8; i++) {
  46.   for(int j = 0; j<8; j++) {
  47.    c.add(gridPanel[i][j]);
  48.   }
  49. }
  50. for(int i = 0; i<8; i++) {
  51.   gridPanel[1][i].add(new JLabel(pionIcon));
  52.   gridPanel[6][i].add(new JLabel(pionIcon));
  53. }
  54. f.setMinimumSize(new Dimension(640, 640));
  55. f.setLocationRelativeTo(null);
  56. f.setVisible(true);
  57. }
  58. public static void main(String[] args) {
  59. Display display = new Display();
  60. Shell shell = new Shell(display);
  61. shell.setText("Hello world!" );
  62. shell.open();
  63. while (!shell.isDisposed()) {
  64. if (!display.readAndDispatch()) display.sleep();
  65. }
  66. display.dispose();
  67. SwingUtilities.invokeLater(new Runnable() {
  68.   @Override
  69.   public void run() {
  70.    initAndShowGui();
  71.   }
  72. });}
  73. /**
  74.  * @param args
  75.  */


 
et j'ai droit à un panneau vide (une fenêtre sans rien,)
Je pense que tu as raison, c'est bien le probleme d'importation d'image, le chemin,
J'ai cherché sur le net pour récupérer des jeux d'images d'échecs, je n'y arrive pas et j'ai l'impression que ce que fais, c'est tout juste ça, je ne met aucune image à l'endroit indiqué par le chemin.
Si je veux faire un programme qui m'affiche une image du net dans une fenêtre, j'y arrive, je m'amuse en ce moment avec des images hypnotiques,
 
mais là, je ne sais pas faire.
 
Pilaau
 
P.S.
Dans eclipse : create a hello world SWT application n'est-il pas un mauvais choix ?

Reply

Marsh Posté le 22-04-2014 à 12:54:36    

pilaau a écrit :


et j'ai droit à un panneau vide (une fenêtre sans rien,)
Je pense que tu as raison, c'est bien le probleme d'importation d'image, le chemin,
J'ai cherché sur le net pour récupérer des jeux d'images d'échecs, je n'y arrive pas et j'ai l'impression que ce que fais, c'est tout juste ça, je ne met aucune image à l'endroit indiqué par le chemin.
Si je veux faire un programme qui m'affiche une image du net dans une fenêtre, j'y arrive, je m'amuse en ce moment avec des images hypnotiques,
 
mais là, je ne sais pas faire.
 
Pilaau
 
P.S.
Dans eclipse : create a hello world SWT application n'est-il pas un mauvais choix ?


 
J'utilise Eclipse IDE for Java Developers et ensuite New > Java Project.
Je ne connais pas SWT.
Pour les images des pièces, je les ai trouvé là : http://www.iconarchive.com/tag/chess et en plus classique il y a aussi : https://en.wikipedia.org/wiki/Chess#Rules (en cliquant sur les pièces on a les images png : https://en.wikipedia.org/wiki/File:Chess_rdt45.svg) ou sinon http://www.virtualpieces.net/icons.
 
Qu'est ce que cela donne en utilisant le chemin absolu vers les images sans getResource ?

Code :
  1. ImageIcon cavalierIcon = new ImageIcon("chemin vers l'image/img/Echec_Cavalier.png" );


Reply

Marsh Posté le 22-04-2014 à 21:11:26    

Bonjour,
Je te remercie, j'ai enfin mon échiquier, avec les pièces prise sur le site que tu m'as indiqué.
Je n'ai pas utilisé eclipse pour programmeur java, il me joue les pires des tours et à l'installation, je dois zapper l'installation de tas de fichiers qui demandent un mot de passe.
 
A la question peut-on le faire sans GetRessource, en indiquant le chemin absolue, oui.
 
Merci encore et peut-être à +, j'espère
 
Pilaau

Reply

Marsh Posté le 22-04-2014 à 21:11:26   

Reply

Marsh Posté le 22-04-2014 à 22:24:39    

Je reprend la main :  
voici donc ce code que j'ai eu tant de mal à écrire !
 

Code :
  1. import java.awt.Container;
  2. import java.awt.Dimension;
  3. import java.awt.GridLayout;
  4. import javax.swing.ImageIcon;
  5. import javax.swing.JFrame;
  6. import javax.swing.JLabel;
  7. import javax.swing.JPanel;
  8. import javax.swing.SwingUtilities;
  9. public class Main {
  10. public static void initAndShowGui() {
  11. JFrame f = new JFrame("Chess Game" );
  12. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. f.setLayout(new GridLayout(8, 8));
  14. JPanel[][] gridPanel = new JPanel[8][8];
  15. for(int i = 0; i<8; i++) {
  16.  for(int j = 0; j<8; j++) {
  17.    gridPanel[i][j] = new JPanel();
  18.  }
  19. }
  20. ImageIcon dameIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Queen-icon.png" );
  21. //ImageIcon dameIconb = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Queenb-icon.png" );
  22. ImageIcon roiIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-King-icon.png" );
  23. //ImageIcon roiIconb = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Kingb-icon.png" );
  24. ImageIcon fouIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Bishop-icon.png" );
  25. //ImageIcon fouIconb = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Echec_Fou.png" );
  26. //ImageIcon fouIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Echec_Foub.png" );
  27. //ImageIcon fouIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Echec_Foub.png" );
  28. ImageIcon pionIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Pawn-icon.png" );
  29. //ImageIcon pionIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Pawnb-icon.png" );
  30. ImageIcon tourIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Rook-icon.png" );
  31. //ImageIcon tourIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Echec_Tour.png" );
  32. //ImageIcon tourIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Echec_Tourb.png" );
  33. // ImageIcon tourIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Echec_Tourb.png" );
  34. ImageIcon cavalierIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Knight-icon.png" );
  35. gridPanel[0][0].add(new JLabel(tourIcon));
  36. gridPanel[0][7].add(new JLabel(tourIcon));
  37. gridPanel[7][0].add(new JLabel(tourIcon));
  38. gridPanel[7][7].add(new JLabel(tourIcon));
  39. gridPanel[0][1].add(new JLabel(cavalierIcon));
  40. gridPanel[0][6].add(new JLabel(cavalierIcon));
  41. gridPanel[7][1].add(new JLabel(cavalierIcon));
  42. gridPanel[7][6].add(new JLabel(cavalierIcon));
  43. gridPanel[0][2].add(new JLabel(fouIcon));
  44. gridPanel[0][5].add(new JLabel(fouIcon));
  45. gridPanel[7][2].add(new JLabel(fouIcon));
  46. gridPanel[7][5].add(new JLabel(fouIcon));
  47. gridPanel[0][3].add(new JLabel(dameIcon));
  48. gridPanel[0][4].add(new JLabel(roiIcon));
  49. gridPanel[7][3].add(new JLabel(dameIcon));
  50. gridPanel[7][4].add(new JLabel(roiIcon));
  51. Container c = f.getContentPane();
  52. for(int i = 0; i<8; i++) {
  53.  for(int j = 0; j<8; j++) {
  54.    c.add(gridPanel[i][j]);
  55.  }
  56. }
  57. for(int i = 0; i<8; i++) {
  58.  gridPanel[1][i].add(new JLabel(pionIcon));
  59.  gridPanel[6][i].add(new JLabel(pionIcon));
  60. }
  61. f.setMinimumSize(new Dimension(640, 640));
  62. f.setLocationRelativeTo(null);
  63. f.setVisible(true);
  64. }
  65. public static void main(String[] args) {
  66. SwingUtilities.invokeLater(new Runnable() {
  67.  @Override
  68.  public void run() {
  69.    initAndShowGui();
  70.  }
  71. });
  72. }
  73. }


Les commentaires intempestifs sur la définition des pièces me serviront à faire les 2 couleurs pour chaque camp.
 
Pilaau

Reply

Marsh Posté le 25-04-2014 à 02:33:22    

Rebonjour,
 
Je ne souhaitais pas te brancher à nouveau sur mon problème, mais à la lecture d'un post qui ressemblait un peu au mien, je me suis rappelé que je ny étais pas arriver :
 
Je te propose mon code,
si tu vois quelque chose de notoire, n'hésites pas en me le dire !!!
 
 

Code :
  1. import java.awt.Container;
  2. import java.awt.Dimension;
  3. import java.awt.GridLayout;
  4. import javax.swing.ImageIcon;
  5. import javax.swing.JFrame;
  6. import javax.swing.JLabel;
  7. import javax.swing.JPanel;
  8. import javax.swing.SwingUtilities;
  9. public class GridCell extends JPanel {
  10. public class Main {
  11. public static void initAndShowGui()
  12.  {
  13.  JFrame f = new JFrame("Chess Game" );
  14.  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15.  f.setLayout(new GridLayout(8, 8));
  16.  JPanel[][] gridPanel = new JPanel[8][8];
  17.  for(int i = 0; i<8; i++)
  18.   {
  19.   for(int j = 0; j<8; j++)
  20.    {
  21.    gridPanel[i][j] = new JPanel();
  22.    }
  23.   }
  24. @Override
  25. private void paintComponent(Graphics g) {
  26. Graphics2D g2 = (Graphics2D) g;
  27.  
  28. if(background != null) {
  29.      g2.drawImage(background, 0, 0, getWidth(), getHeight(), this);
  30. }
  31. if(image != null) {
  32.      g2.drawImage(image, 80, 80, scaleWidth, scaleHeight, this);
  33. }
  34. }
  35. BufferedImage image = null;
  36. BufferedImage background = null;
  37. ImageIcon dameIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Queen-icon.png" );
  38. ImageIcon dameIconb = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Queenb-icon.png" );
  39. ImageIcon roiIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-King-icon.png" );
  40. ImageIcon roiIconb = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Kingb-icon.png" );
  41. ImageIcon fouIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Bishop-icon.png" );
  42. ImageIcon fouIconb = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess_Bishopb.png" );
  43. ImageIcon pionIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Pawn-icon.png" );
  44. ImageIcon pionIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Pawnb-icon.png" );
  45. ImageIcon tourIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Rook-icon.png" );
  46. ImageIcon tourIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Rookb.png" );
  47. ImageIcon cavalierIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Knight-icon.png" );
  48. ImageIcon cavalierIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Knightb-icon.png" );
  49. gridPanel[0][0].add(new JLabel(tourIcon));
  50. gridPanel[0][7].add(new JLabel(tourIcon));
  51. gridPanel[7][0].add(new JLabel(tourIcon));
  52. gridPanel[7][7].add(new JLabel(tourIcon));
  53. gridPanel[0][1].add(new JLabel(cavalierIcon));
  54. gridPanel[0][6].add(new JLabel(cavalierIcon));
  55. gridPanel[7][1].add(new JLabel(cavalierIcon));
  56. gridPanel[7][6].add(new JLabel(cavalierIcon));
  57. gridPanel[0][2].add(new JLabel(fouIcon));
  58. gridPanel[0][5].add(new JLabel(fouIcon));
  59. gridPanel[7][2].add(new JLabel(fouIcon));
  60. gridPanel[7][5].add(new JLabel(fouIcon));
  61. gridPanel[0][3].add(new JLabel(dameIcon));
  62. gridPanel[0][4].add(new JLabel(roiIcon));
  63. gridPanel[7][3].add(new JLabel(dameIcon));
  64. gridPanel[7][4].add(new JLabel(roiIcon));
  65. Container c = f.getContentPane();
  66. for(int i = 0; i<8; i++) {
  67. for(int j = 0; j<8; j++) {
  68.    c.add(gridPanel[i][j]);
  69. }
  70. }
  71. for(int i = 0; i<8; i++) {
  72. gridPanel[1][i].add(new JLabel(pionIcon));
  73. gridPanel[6][i].add(new JLabel(pionIcon));
  74. }
  75. f.setMinimumSize(new Dimension(640, 640));
  76. f.setLocationRelativeTo(null);
  77. f.setVisible(true);
  78. }
  79. public static void main(String[] args) {
  80. SwingUtilities.invokeLater(new Runnable() {
  81. @Override
  82. void run() {
  83.    initAndShowGui();
  84. }
  85. });
  86. }}}


 
Peut-être à bientôt, merci !
 
Pilaau

Reply

Marsh Posté le 25-04-2014 à 09:33:41    

pilaau a écrit :

Rebonjour,
 
Je ne souhaitais pas te brancher à nouveau sur mon problème, mais à la lecture d'un post qui ressemblait un peu au mien, je me suis rappelé que je ny étais pas arriver :
 
Je te propose mon code,
si tu vois quelque chose de notoire, n'hésites pas en me le dire !!!
 
 

Code :
  1. import java.awt.Container;
  2. import java.awt.Dimension;
  3. import java.awt.GridLayout;
  4. import javax.swing.ImageIcon;
  5. import javax.swing.JFrame;
  6. import javax.swing.JLabel;
  7. import javax.swing.JPanel;
  8. import javax.swing.SwingUtilities;
  9. public class GridCell extends JPanel {
  10. public class Main {
  11. public static void initAndShowGui()
  12.  {
  13.  JFrame f = new JFrame("Chess Game" );
  14.  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15.  f.setLayout(new GridLayout(8, 8));
  16.  JPanel[][] gridPanel = new JPanel[8][8];
  17.  for(int i = 0; i<8; i++)
  18.   {
  19.   for(int j = 0; j<8; j++)
  20.    {
  21.    gridPanel[i][j] = new JPanel();
  22.    }
  23.   }
  24. @Override
  25. private void paintComponent(Graphics g) {
  26. super.paintComponent(g);
  27. Graphics2D g2 = (Graphics2D) g;
  28.  
  29. if(background != null) {
  30.      g2.drawImage(background, 0, 0, getWidth(), getHeight(), this);
  31. }
  32. if(image != null) {
  33.      g2.drawImage(image, 80, 80, scaleWidth, scaleHeight, this);
  34. }
  35. }
  36. BufferedImage image = null;
  37. BufferedImage background = null;
  38. ImageIcon dameIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Queen-icon.png" );
  39. ImageIcon dameIconb = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Queenb-icon.png" );
  40. ImageIcon roiIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-King-icon.png" );
  41. ImageIcon roiIconb = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Kingb-icon.png" );
  42. ImageIcon fouIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Bishop-icon.png" );
  43. ImageIcon fouIconb = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess_Bishopb.png" );
  44. ImageIcon pionIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Pawn-icon.png" );
  45. ImageIcon pionIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Pawnb-icon.png" );
  46. ImageIcon tourIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Rook-icon.png" );
  47. ImageIcon tourIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Rookb.png" );
  48. ImageIcon cavalierIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Knight-icon.png" );
  49. ImageIcon cavalierIcon = new ImageIcon("/Users/agatakozlowska/Documents/INF311/Chess-Knightb-icon.png" );
  50. gridPanel[0][0].add(new JLabel(tourIcon));
  51. gridPanel[0][7].add(new JLabel(tourIcon));
  52. gridPanel[7][0].add(new JLabel(tourIcon));
  53. gridPanel[7][7].add(new JLabel(tourIcon));
  54. gridPanel[0][1].add(new JLabel(cavalierIcon));
  55. gridPanel[0][6].add(new JLabel(cavalierIcon));
  56. gridPanel[7][1].add(new JLabel(cavalierIcon));
  57. gridPanel[7][6].add(new JLabel(cavalierIcon));
  58. gridPanel[0][2].add(new JLabel(fouIcon));
  59. gridPanel[0][5].add(new JLabel(fouIcon));
  60. gridPanel[7][2].add(new JLabel(fouIcon));
  61. gridPanel[7][5].add(new JLabel(fouIcon));
  62. gridPanel[0][3].add(new JLabel(dameIcon));
  63. gridPanel[0][4].add(new JLabel(roiIcon));
  64. gridPanel[7][3].add(new JLabel(dameIcon));
  65. gridPanel[7][4].add(new JLabel(roiIcon));
  66. Container c = f.getContentPane();
  67. for(int i = 0; i<8; i++) {
  68. for(int j = 0; j<8; j++) {
  69.    c.add(gridPanel[i][j]);
  70. }
  71. }
  72. for(int i = 0; i<8; i++) {
  73. gridPanel[1][i].add(new JLabel(pionIcon));
  74. gridPanel[6][i].add(new JLabel(pionIcon));
  75. }
  76. f.setMinimumSize(new Dimension(640, 640));
  77. f.setLocationRelativeTo(null);
  78. f.setVisible(true);
  79. }
  80. public static void main(String[] args) {
  81. SwingUtilities.invokeLater(new Runnable() {
  82. @Override
  83. void run() {
  84.    initAndShowGui();
  85. }
  86. });
  87. }}}


 
Peut-être à bientôt, merci !
 
Pilaau


 
L'agencement des classes n'est pas bon (la classe principale est ici GridCell avec une classe interne Main). Le mieux pour débuter est de garder une classe par fichier.
La méthode statique public static void main(String[] args) est le point d'entrée du programme (s'il y en a plusieurs, Eclipse demande à choisir lequel exécuter), elle ne peut pas être dans une classe interne.
La méthode private void paintComponent(Graphics g) redéfinie le comportement du "dessin" du composant et ne peut pas appartenir à la classe Main mais à GridCell qui hérite ou étend la classe JPanel qui elle-même hérite de la classe JComponent.
Comme on peut le voir ici : http://docs.oracle.com/javase/7/do [...] Panel.html, tout est basé sur le concept d'objet en Java (toutes les classes héritent d'Object, sans exceptions).

Citation :


    java.lang.Object
        java.awt.Component
            java.awt.Container
                javax.swing.JComponent
                    javax.swing.JPanel


 
J'ai essayé de mettre des commentaires :

Code :
  1. import java.awt.Container;
  2. import java.awt.Dimension;
  3. import java.awt.GridLayout;
  4. import java.io.IOException;
  5. import javax.swing.JFrame;
  6. import javax.swing.SwingUtilities;
  7. public class Window extends JFrame {
  8. //Lien vers les images des pieces sur le net pour plus de simplicite mais plus lent !
  9. //Plus rapide en sauvegardant et chargeant les images sur le disque dur
  10. private static final String TOUR_NOIR = "http://icons.iconarchive.com/icons/visualpharm/icons8-metro-style/128/Chess-Rook-icon.png";
  11. private static final String TOUR_BLANC = "http://icons.iconarchive.com/icons/visualpharm/ios7v2/128/Chess-Rook-icon.png";
  12. private static final String CAVALIER_NOIR = "http://icons.iconarchive.com/icons/visualpharm/icons8-metro-style/128/Chess-Knight-icon.png";
  13. private static final String CAVALIER_BLANC = "http://icons.iconarchive.com/icons/visualpharm/ios7v2/128/Chess-Knight-icon.png";
  14. private static final String FOU_NOIR = "http://icons.iconarchive.com/icons/visualpharm/icons8-metro-style/128/Chess-Bishop-icon.png";
  15. private static final String FOU_BLANC = "http://icons.iconarchive.com/icons/visualpharm/ios7v2/128/Chess-Bishop-icon.png";
  16. private static final String DAME_NOIR = "http://icons.iconarchive.com/icons/visualpharm/icons8-metro-style/128/Chess-Queen-icon.png";
  17. private static final String DAME_BLANC = "http://icons.iconarchive.com/icons/visualpharm/ios7v2/128/Chess-Queen-icon.png";
  18. private static final String ROI_NOIR = "http://icons.iconarchive.com/icons/visualpharm/icons8-metro-style/128/Chess-King-icon.png";
  19. private static final String ROI_BLANC = "http://icons.iconarchive.com/icons/visualpharm/ios7v2/128/Chess-King-icon.png";
  20. private static final String PION_NOIR = "http://icons.iconarchive.com/icons/visualpharm/icons8-metro-style/128/Chess-Pawn-icon.png";
  21. private static final String PION_BLANC = "http://icons.iconarchive.com/icons/visualpharm/ios7v2/128/Chess-Pawn-icon.png";
  22. public Window() {
  23.  super("Chess Game" );
  24.  //Creation de l'interface
  25.  initComponents();
  26.  setMinimumSize(new Dimension(640, 640));
  27.  setLocationRelativeTo(null);
  28.  setVisible(true);
  29. }
  30. private void initComponents() {
  31.  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32.  setLayout(new GridLayout(8, 8));
  33.  //Damier avec un tableau de cases 8x8
  34.  GridCell[][] gridPanel = new GridCell[8][8];
  35.  for(int i = 0; i<8; i++) {
  36.   for(int j = 0; j<8; j++) {
  37.    //Calcul du numero de la case
  38.    //en fonction du numero de la ligne et de la colonne
  39.    //case 1 en haut a gauche et case 64 en bas a gauche
  40.    //parcours en zig-zag pour que les cases soient alternees
  41.    int cellNumber = i%2 == 0 ? i*8+j+1 : i*8+(7-j)+1;
  42.    try {
  43.     gridPanel[i][j] = new GridCell(cellNumber);
  44.    } catch (IOException e) {
  45.     e.printStackTrace();
  46.    }
  47.   }
  48.  }
  49.  try {
  50.   //Affectation des images
  51.   gridPanel[0][0].setImageByUrl(TOUR_NOIR);
  52.   gridPanel[0][7].setImageByUrl(TOUR_NOIR);
  53.   gridPanel[7][0].setImageByUrl(TOUR_BLANC);
  54.   gridPanel[7][7].setImageByUrl(TOUR_BLANC);
  55.   gridPanel[0][1].setImageByUrl(CAVALIER_NOIR);
  56.   gridPanel[0][6].setImageByUrl(CAVALIER_NOIR);
  57.   gridPanel[7][1].setImageByUrl(CAVALIER_BLANC);
  58.   gridPanel[7][6].setImageByUrl(CAVALIER_BLANC);
  59.   gridPanel[0][2].setImageByUrl(FOU_NOIR);
  60.   gridPanel[0][5].setImageByUrl(FOU_NOIR);
  61.   gridPanel[7][2].setImageByUrl(FOU_BLANC);
  62.   gridPanel[7][5].setImageByUrl(FOU_BLANC);
  63.   gridPanel[0][3].setImageByUrl(DAME_NOIR);
  64.   gridPanel[0][4].setImageByUrl(ROI_NOIR);
  65.   gridPanel[7][3].setImageByUrl(DAME_BLANC);
  66.   gridPanel[7][4].setImageByUrl(ROI_BLANC);
  67.   for(int i = 0; i<8; i++) {
  68.    gridPanel[1][i].setImageByUrl(PION_NOIR);
  69.    gridPanel[6][i].setImageByUrl(PION_BLANC);
  70.   }
  71.  } catch (IOException e) {
  72.   e.printStackTrace();
  73.  }
  74.  Container c = getContentPane();
  75.  //Ajout des cases a la fenetre
  76.  for(int i = 0; i<8; i++) {
  77.   for(int j = 0; j<8; j++) {
  78.    c.add(gridPanel[i][j]);
  79.   }
  80.  }
  81. }
  82. public static void main(String[] args) {
  83.  //Creation de la fenetre dans le thread d'affichage (EDT)
  84.  SwingUtilities.invokeLater(new Runnable() {
  85.   @Override
  86.   public void run() {
  87.    new Window();
  88.   }
  89.  });
  90. }
  91. }


 

Code :
  1. import java.awt.Color;
  2. import java.awt.Graphics;
  3. import java.awt.Graphics2D;
  4. import java.awt.image.BufferedImage;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import java.net.MalformedURLException;
  8. import java.net.URL;
  9. import javax.imageio.ImageIO;
  10. import javax.swing.BorderFactory;
  11. import javax.swing.JPanel;
  12. public class GridCell extends JPanel {
  13. private BufferedImage image = null;
  14. private BufferedImage background = null;
  15. public GridCell(int cellNumber) throws IOException {
  16.  if(cellNumber % 2 == 0) {
  17.   //Case paire
  18.   background = ImageIO.read(new URL("https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Chess_d45.svg/200px-Chess_d45.svg.png" ));
  19.  } else {
  20.   //Case impaire
  21.   background = ImageIO.read(new URL("https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Chess_l45.svg/200px-Chess_l45.svg.png" ));
  22.  }
  23.  //Creation de la bordure de la case
  24.  this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
  25. }
  26. public void setImageByUrl(String imgUrl) throws MalformedURLException, IOException {
  27.  image = ImageIO.read(new URL(imgUrl));
  28. }
  29. public void setImageByFile(String imgPath) throws IOException {
  30.  image = ImageIO.read(new File(imgPath));
  31. }
  32. @Override
  33. public void paintComponent(Graphics g) {
  34.  super.paintComponent(g);
  35.  Graphics2D g2 = (Graphics2D) g;
  36.    
  37.  if(background != null) {
  38.   //Dessine le background en position (0,0)
  39.   //de la taille de la case
  40.      g2.drawImage(background, 0, 0, getWidth(), getHeight(), this);
  41.  }
  42.  if(image != null) {
  43.   //Taille fixe des pieces ici
  44.   //Sinon calculer le ratio des pieces
  45.   //en fonction de la taille de la case
  46.   int scaleWidth = 75;
  47.      int scaleHeight = 75;
  48.     
  49.      int width = getWidth() - 1;
  50.      int height = getHeight() - 1;
  51.      //Coordonnee centree de la piece
  52.      int x = (width - scaleWidth) / 2;
  53.      int y = (height - scaleHeight) / 2;
  54.      //Dessine la piece
  55.      g2.drawImage(image, x, y, scaleWidth, scaleHeight, this);
  56.  }
  57. }
  58. }


 
Je mets en lien un tutoriel sur Java et les gui : http://jmdoudoux.developpez.com/co [...] /index.php et http://jmdoudoux.developpez.com/co [...] artie2.php
Je ne connais pas Mac OS mais pour Windows, Eclipse est une simple archive à dézipper et il n'y a pas d'installation à faire. Eclipse est vraiment utile pour voir les erreurs de syntaxe, gérer les imports et pour avoir la documentation d'une méthode lorsqu'on laisse le curseur sur le nom d'une méthode du jdk Java par exemple.
 
Je mets aussi en lien un code qui affiche un jeu d'échec : https://stackoverflow.com/questions [...] -chess-gui en compléments des tutoriels.


Message édité par honrisse le 31-05-2014 à 02:00:48
Reply

Marsh Posté le 25-04-2014 à 11:19:32    

Merci,  
Je pensais avoir compris, au début, j'affichais les pièces, mais quand j'ai voulu les placer dans un échiquier, ça a été catastrophique.
Je vais faire attention à ta réponse, c'est plus difficile pur moi que prévu, (je suis autodidacte en java), mais avec un DUT informatique (sans java scolaire).
Je ferais en sorte de de ne te joindre que lorsque que j'aurais enfin réussi (et à comprendre tout cet ensemble).
 
Encore merci,
 
Philippe

Reply

Marsh Posté le 25-04-2014 à 15:38:25    

Pas de problème et bon courage.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed