Des petits JPanel en mouvement sur un plus grand JPanel

Fermé
philub Messages postés 259 Date d'inscription samedi 31 mars 2007 Statut Membre Dernière intervention 28 mars 2015 - 28 mars 2015 à 04:41
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 28 mars 2015 à 19:33
Bonjour,

J'aimerais créer un grand JPanel avec comme constructeur une ImageIcon sur laquelle il y aurait des petits JPanel (aussi des ImageIcon) qui se promèneraient indépendamment les unes des autres verticalement, horizontalement ou diagonalement. Le défit est de trouver un moyen de savoir la position de chaque petits JPanel.

J'espère qu'il existe un moyen pour avoir une grille transparente (composée de carrés) de positions (x,y) où je pourrai mettre les petits JPanel et laisser des positions vides...

Si vous avez une technique ou des conseils, ça serait vraiment très apprécié.


1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
28 mars 2015 à 14:00
Bonjour,

Pourquoi tu parles de JPanel ? JPanel est une catégorie de Container, toi ce qu'il te faudrait ce sont plutôt des Component, un JLabel par exemple.

Quant à ton problème de déplacement, tu dois faire ça avec des Threads qui déplaceraient ton JLabel sur la JFrame...

Voir Defining and Starting a Thread et Doing Without a Layout Manager (Absolute Positioning).

Exemple :

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test {
    
    private static void pause(long millis) {
        try {
            Thread.sleep(millis);
        }
        catch (Exception e) {
        }
    }
    
    public static void main(String[] args) {

        final Icon iconHorz = new ImageIcon("C:/rouge.png");
        final JLabel horz = new JLabel(iconHorz);
        horz.setBounds(0, 0, iconHorz.getIconWidth(), iconHorz.getIconHeight());
        
        final Icon iconVert = new ImageIcon("C:/bleu.png");
        final JLabel vert = new JLabel(iconVert);
        vert.setBounds(0, 0, iconVert.getIconWidth(), iconVert.getIconHeight());
        
        final JFrame frame = new JFrame();
        frame.setSize(200,200);
        frame.setLayout(null);
        frame.add(horz);
        frame.add(vert);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        new Thread() {
            @Override
            public void run() {
                while (true) {
                    while (horz.getX() < frame.getContentPane().getWidth()-horz.getWidth()) {
                        horz.setLocation(horz.getX()+1, horz.getY());
                        pause(10);
                    }
                    while (horz.getX() > 0) {
                        horz.setLocation(horz.getX()-1, horz.getY());
                        pause(5);
                    }
                }
            }
        }.start();
        
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    while (vert.getY() < frame.getContentPane().getHeight()-vert.getHeight()) {
                        vert.setLocation(vert.getX(), vert.getY()+1);
                        pause(10);
                    }
                    while (vert.getY() > 0) {
                        vert.setLocation(vert.getX(), vert.getY()-1);
                        pause(5);
                    }
                }
            }
        }.start();
    }
}
0
philub Messages postés 259 Date d'inscription samedi 31 mars 2007 Statut Membre Dernière intervention 28 mars 2015 58
28 mars 2015 à 18:26
Utiliser des thread c'est nouveau pour moi. D'habitude, j'utilisais des ActionPerformed et des componentPaint sur une classe JPanel que je déclare ensuite dans une classe JFrame.

J'ai testé votre code et j'ai trouvé l'animation très intéressante. J'essaie de faire en sorte d'avoir 50 petites images bleues qui restent à l'intérieur d'un grand carré rouge fixe. Les petites images se déplaceront dans toutes les directions selon un algorithme et obtenir la liste des positions des bleus avec un système de grille, une HashMap de positions et mettre à jour cette HashMap à chaque déplacement dans la grille afin d'adapter son objectif de déplacement.

C'est vraiment compliqué, dès que je trouve j'envoie le résultat. Je crois que c'est la logique de base qu'ils ont utilisé pour faire le jeux civilization. Dessiner une carte de fond, appliquer une grille de positions et ensuite placer les éléments (ouvrier, ville, Blé, etc.) Mon objectif final est beaucoup plus simple que de faire le jeu civilization.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
28 mars 2015 à 19:33
Au final mon code est déjà assez proche de ton besoin.

Les algorithmes pour chaque case c'est la méthode run() du Thread (mon exemple est super basique). Quant à la HashMap on peut la faire comme ceci :

final Map<JLabel, Point> map = new HashMap<JLabel, Point>();

map.put(horz, horz.getLocation());
map.put(vert, vert.getLocation());

Remarque : j'ai mis tout le code dans la méthode main, mais pour faire propre il faudrait faire des classes Java, par exemple un Personnage dont un membre sera le JLabel et un autre le Thread, avec éventuellement plusieurs sous classes où chacune aurait un algorithme run() différent.

Et il n'est pas exclu de changer l'image du JLabel au fur et à mesure de son déplacement, par exemple avec un personnage qui regarde dans la direction où il va.
0