Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1692 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  queqtion sur image.gif

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

queqtion sur image.gif

n°2225605
pilaau
Posté le 21-04-2014 à 01:39:29  profilanswer
 

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

mood
Publicité
Posté le 21-04-2014 à 01:39:29  profilanswer
 

n°2225625
honrisse
Posté le 21-04-2014 à 11:51:00  profilanswer
 

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
n°2225636
pilaau
Posté le 21-04-2014 à 16:36:57  profilanswer
 

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

n°2225642
honrisse
Posté le 21-04-2014 à 17:26:46  profilanswer
 

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).

n°2225645
pilaau
Posté le 21-04-2014 à 17:54:27  profilanswer
 

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

n°2225646
pilaau
Posté le 21-04-2014 à 17:58:03  profilanswer
 

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

n°2225667
honrisse
Posté le 22-04-2014 à 08:11:54  profilanswer
 

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, ...).

n°2225706
pilaau
Posté le 22-04-2014 à 12:17:27  profilanswer
 

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 ?

n°2225713
honrisse
Posté le 22-04-2014 à 12:54:36  profilanswer
 

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" );


n°2225785
pilaau
Posté le 22-04-2014 à 21:11:26  profilanswer
 

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

mood
Publicité
Posté le 22-04-2014 à 21:11:26  profilanswer
 

n°2225792
pilaau
Posté le 22-04-2014 à 22:24:39  profilanswer
 

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

n°2226186
pilaau
Posté le 25-04-2014 à 02:33:22  profilanswer
 

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

n°2226193
honrisse
Posté le 25-04-2014 à 09:33:41  profilanswer
 

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
n°2226203
pilaau
Posté le 25-04-2014 à 11:19:32  profilanswer
 

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

n°2226221
honrisse
Posté le 25-04-2014 à 15:38:25  profilanswer
 

Pas de problème et bon courage.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  queqtion sur image.gif

 

Sujets relatifs
placer image sur panel depuis menu, plusieurs images, non !!!Insérer une image aulieu de courbe en JAVA
Fondu d'image avec JqueryBesoin d'aide su javascool (génération aléatoire d'image)
texte sous une image agrandieouvrir une image java.
image en surbrillance par plusieurs boutons meme pagestyle css d'un lien image
[Java] Image dans un boutonagrandissement image
Plus de sujets relatifs à : queqtion sur image.gif


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR