JLabel position et chemin d'image

cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012 - 16 mai 2008 à 15:49
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012 - 18 mai 2008 à 18:49
Bonjour,

j'ai un soucis de GridLayout.
j'essaie de faire une grille d'image avec des Jlabel cote à cote

QUESTION :
1° Le chargement de mes images est impec mais je n'arrive pas à les coller entre elles

2°De plus, je n'arrive pas à donner le chemin relatif (non dur) de mon image


MON CODE :

import javax.swing.*;
import java.awt.*;

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

JFrame myFrame = new JFrame();
JPanel panel = new JPanel();
GridLayout jours = new GridLayout(3, 2, 10, 50);
panel.setLayout(jours);
panel.applyComponentOrientation( ComponentOrientation.RIGHT_TO_LEFT);

for (int i=1 ; i<7 ; i++)
{
ImageIcon image = new ImageIcon("C:\\Users\\Renfield\\Documents\\NetBeansProjects\\JavaApplication8\\src\\javaapplication8\\vide.jpg");
JLabel lbl = new JLabel(image);
lbl.setPreferredSize(new Dimension(30, 30));
panel.add (lbl);
}

myFrame.setContentPane(panel);
myFrame.setTitle("Viewer by Brice");
myFrame.setBounds(0,0,300,300);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setVisible(true);

}

}



Merci de votre aide ++

25 réponses

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
16 mai 2008 à 19:51
Salut:

public class Grid extends JPanel {

    public static final int COUNT_X = 30;
   
    public static final int COUNT_Y = 15;

    public static final int WIDTH = 20;
   
    public static final int HEIGHT = 20;
   
    private JLabel[][] labels = new JLabel[COUNT_X][COUNT_Y];
   
    public Grid() {
        super(new GridLayout(COUNT_X, COUNT_Y, 1, 1));
    }
   
    public void createGrid() {
        for (int i = 0; i < COUNT_X; i++) {
            for (int j = 0; j < COUNT_Y; ++j) {
                labels[i][j] = new JLabel();
                labels[i][j].setPreferredSize(new Dimension(WIDTH, HEIGHT));
                labels[i][j].setBorder(new BevelBorder(BevelBorder.RAISED));
                add(labels[i][j]);
            }
        }
    }
}

Pour pouvoir utiliser les chemins relatifs: Une solution simpliste consiste à placer le répertoire contenant les ressources (images, ...) à la racine de ton projet
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
16 mai 2008 à 20:57
salut,

Merci
Ben j'ai mis un repertoire "img" à la racine et si je fait :

.\\img\\vide.jpg ca fonctionne pas ^o)
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
16 mai 2008 à 21:08
Re,
et si maintenant je veux attribuer une autre image à disons : mon Jlabel(25) je fais comment ?

Je suis coincé là !!??

t'as une astuce ?
faut pas heriter de la Jframe ?
Je vois pas le code à mettre ! :(
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
16 mai 2008 à 21:56
Salut:

Il faut utiliser un chemin relatif par exemple "resources/background.png" tout court sans utiliser "." ou ".."

Pour attribuer une image à un JLabel donnée, connaissant ses coordonnées (i, j) il suffit de faire:

labels[i][j].setIcon(new ImageIcon("resources/picture.png"));

Il y a plusieurs façons pour exploiter la classe Grid: Voici une solution très simpliste:

JFrame frame = new JFrame("Grid");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Grid grid = new Grid();
grid.setPreferredSize(new Dimension(600, 600));

frame.getContentPane().add("Center", grid);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);

Ou bien tu peux faire une classe qui étend la classe JFrame et utiliser ce code.

public class MyFrame extends JFrame {
    public MyFrame() {
       super("Grid");
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

       Grid grid = new Grid();
       grid.setPreferredSize(new Dimension(600, 600));

       getContentPane().add("Center", grid);
       pack();
       setResizable(false);
       setVisible(true);
    }
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
16 mai 2008 à 23:17
re,

Je te remercie, je vais tenter tous cela demain matin

Merci beaucoup, si plus de développeurs JAVA etait comme toi !

Bonne soirée

PS, si j'ai d'autre questions ce week-end tu sera dispos ?
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
16 mai 2008 à 23:47
Salut:

Je t'en prie, c'est rien.

Bonne nuit.
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
17 mai 2008 à 10:40
SAlut,

j'ai tester tout cela et avec :

//ROUTINE
public void main() {
Grid maGrille = new Grid();
maGrille.createGrid();
}


//GENERER LA GRILLE
public class Grid extends JPanel {

public static final int COUNT_X = 30;
public static final int COUNT_Y = 15;
public static final int WIDTH = 20;
public static final int HEIGHT = 20;

JFrame myFrame = new JFrame();
JPanel panel = new JPanel();

private JLabel[][] labels = new JLabel[COUNT_X][COUNT_Y];

public Grid() {
super(new GridLayout(COUNT_X, COUNT_Y, 1, 1));
}

public void createGrid() {
for (int i = 0; i < COUNT_X; i++) {
for (int j = 0; j < COUNT_Y; ++j) {
labels[i][j] = new JLabel();
labels[i][j].setPreferredSize(new Dimension(WIDTH, HEIGHT));
labels[i][j].setBorder(new BevelBorder(BevelBorder.RAISED));
add(labels[i][j]);
}
}
myFrame.setContentPane(panel);
myFrame.setTitle("Viewer");
myFrame.setBounds(0,0,906,476);
myFrame.setResizable(false);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setVisible(true);
}

// Change l'image d'une case (JLabel)
public void changeImg(int posX, int posY,String destImg){
labels[posX][posY].setIcon(new ImageIcon(destImg));
}

}


rien ne s'affiche meme pas la feuille !
J'ai du fait une erreur de déclaration ?
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
17 mai 2008 à 10:49
Ha ca frame s'affiche, fallait mettre :
JFrame myFrame = new JFrame();
JPanel panel = new JPanel();

dans le méthode createGrid CEPENDANT, les Jlabels ne s'affiche pas !

ET je n'arrive toujours pas à mettre de chemin relatif : bon projet est fait comme ceci :

Mon Projet
- build
- dist
- nbproject
- src
- Mon Projet
- toutes les classes (*.java)
- img
- toutes mes images (*.jpg)
- map
- toutes mes maps (*.txt)
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
17 mai 2008 à 12:01
Salut:

public class MyFrame extends JFrame {
    public MyFrame() {
       super("Grid");
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

       Grid grid = new Grid();
       grid.setPreferredSize(new Dimension(600, 600));

       getContentPane().add("Center", grid);
       pack();
       setResizable(false);
    }

    public static void main(String[] args) {
            MyFrame f = new MyFrame();
            f.setVisible(true);
    }
}
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
17 mai 2008 à 14:57
Heuu ca sert à quoi ca ? créer une frame ?
Je l'insere ou ?
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
17 mai 2008 à 15:00
Tout mon projet est là : http://cbprogs.free.fr/GestionGare.zip

Peux etre que les erreurs viennent d'ailleur ?
En tout cas dans NetBeans aucune erreur !!!

Je vois pas du tout le soucis mais aucun affichage
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
17 mai 2008 à 19:15
Salut:

Je travaille sous Eclipse.

C'est simple de tester les codes envoyés. Essayes même de les tester séparemment: les classe Grid et MyFrame.

Qu'est ce que ça donne?
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
17 mai 2008 à 19:21
Salut:

Une petite proposition:

Créer un nouveau projet sous Netbeans pour tester les deux classes Grid et MyFrame.

Dans ce cas MyFrame sera le point d'entrée de ton programme.

Est ce que ça va?
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
17 mai 2008 à 19:46
Pour la GRID,

public static void main(String[] args) {
// je ne vois pas comment declarer une nouvelle instance de myFrame

// pour grid :
Grid mag = new Grid();
mag.createGrid();
}

Ca ne fait rien, rien ne s'affiche !
Pourrais tu m'aiguiller ?
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
17 mai 2008 à 20:09
Salut:

Exécutes ce code: pour simplifier les choses créer un nouveau projet pour les deux classe Grid et MyFrame telle que la classe MyFrame sera le point d'entrée de ton programme.

// Grid.java
public class Grid extends JPanel {

    public static final int COUNT_X = 30;
   
    public static final int COUNT_Y = 15;

    public static final int WIDTH = 20;
   
    public static final int HEIGHT = 20;
   
    private JLabel[][] labels = new JLabel[COUNT_X][COUNT_Y];
   
    public Grid() {
        super(new GridLayout(COUNT_X, COUNT_Y, 1, 1));
    }
   
    public void createGrid() {
        for (int i = 0; i < COUNT_X; i++) {
            for (int j = 0; j < COUNT_Y; ++j) {
                labels[i][j] = new JLabel();
                labels[i][j].setPreferredSize(new Dimension(WIDTH, HEIGHT));
                labels[i][j].setBorder(new BevelBorder(BevelBorder.RAISED));
                add(labels[i][j]);
            }
        }
    }
}

// MyFrame.java
public class MyFrame extends JFrame {
    public MyFrame() {
       super("Grid");
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

       Grid grid = new Grid();
       grid.setPreferredSize(new Dimension(600, 600));

       getContentPane().add("Center", grid);
       pack();
       setResizable(false);
    }

    public static void main(String[] args) {
            MyFrame f = new MyFrame();
            f.setVisible(true);
    }
}
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
17 mai 2008 à 21:34
OK j'ai fait ca mais j'ai qu'une frame qui se lance !

Je ne vois pas ou tu veux en venir !!!

Je voulais faire un quadrillage de Jlabel et attribuer aux Jlabel une image
Et ensuite, via les labels[x][y].setIcon("monimage.jpg"); attribuer à l'image que je veux MAIS je n'y arrive pas !

Je suis blazé de JAVA :(
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
17 mai 2008 à 21:45
Haa si c'est bon, dans le code (myFrame), il manquait : grid.createGrid();
au dessous de grid.setPreferredSize(new Dimension(900, 450));

Désolé pour mon dernier post completement HS !

Mais pour le changement d'image via un : labels[i][j].setIcon(new ImageIcon("vide.jpg"));

lors de public void createGrid() {
au dessous de : labels[i][j].setPreferredSize(new Dimension(WIDTH, HEIGHT));

ca ne me change pas l'image

pourtant j'ais mis une image dans le meme repertoire de mes 2 .java
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
17 mai 2008 à 23:42
Salut:

Est ce que c'est OK?

Pour les constantes WIDTH et HEIGHT il vaut mieux qu'elles soient égales au dimensions communes des images utilisés.

Je pense qu'il faut modifier le code de cette façon:

// Grid.java
public class Grid extends JPanel {

    public static final int COUNT_X = 30;
   
    public static final int COUNT_Y = 15;

    public static final int WIDTH = 20;
   
    public static final int HEIGHT = 20;
   
    private JLabel[][] labels = new JLabel[COUNT_X][COUNT_Y];
   
    public Grid() {
        super(new GridLayout(COUNT_X, COUNT_Y, 1, 1));
        // Appeler la méthode createGrid dans le constructeur
        // Comme ça on ne risque pas d'oublier
        createGrid();
    }
   
    // Réduire la visibilité de cette méthode
    private void createGrid() {
        for (int i = 0; i < COUNT_X; i++) {
            for (int j = 0; j < COUNT_Y; ++j) {
                labels[i][j] = new JLabel();
                labels[i][j].setPreferredSize(new Dimension(WIDTH, HEIGHT));
                labels[i][j].setBorder(new BevelBorder(BevelBorder.RAISED));
                add(labels[i][j]);
            }
        }
    }
}

// MyFrame.java
public class MyFrame extends JFrame {
    public MyFrame() {
       super("Grid");
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

       Grid grid = new Grid();
       //grid.setPreferredSize(new Dimension(600, 600));

       getContentPane().add("Center", grid);
       setPreferredSize(new Dimension(600, 600));
       pack();
       setResizable(false);
    }

    public static void main(String[] args) {
            MyFrame f = new MyFrame();
            f.setVisible(true);
    }
}
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
18 mai 2008 à 00:42
Re,

Oui c'est impeccable, ma grille se fait de la bonne facon et je te remercie MAIS, le chemin relatif des images ne fonctionne pas !!!
Je suis obligé de mettre en dur et c'est immonde comme code !

Ensuite, si je suis ta logique et que je veux faire une methode qui s'execute toute les X secondes, puis je faire une classe qui herite de TimerTask ?

ex :

static class moteurSimul extends TimerTask {

private int xTrain; // horizontale
private int yTrain; // verticale

private Icon imgTmp; //image temporaire sur laquelle on va aller
private int i;

/**
* Permet d'actionner le train
*/
/*
public void run(){

while (i>0 & i<451){
if(tblMap[xTrain][yTrain] == "Gare"){
if(tblMap[xTrain + 1][yTrain] != "feu_R_OE")
{
Thread.sleep(2000);
}
...
}
...
}


et pour changer d'image, je creer une methode dans la classe Grid.

public void setImage(int x, int y, String img) {
labels[x][y].setIcon(new ImageIcon(img));
}

puis j'implemante une nouvelle instance de la classe GRid ainsi dans mon "run" de la classe ci-dessus j'aurais juste a mettre :
maGrid.setImage(monX,monY,monImg) ??

Serieusement je galère sec !

Merci de ta grande aide déjà ;)

Si tu veux que l'on aille plus vite je serais dispo tout demain (je t'envoie mon MSN en PV)
0
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012
18 mai 2008 à 11:29
Ca y est pour les images j'ai réussit,
Avec NetBeans, il faut completement sortir du repertoire scr et ce positionner dans le repertoire de base (nom du projet) !!!

J'espere que ca servira aux autres ;)
0
Rejoignez-nous