Ajouter une images dans une panel

cs_joumana07 Messages postés 10 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 16 juin 2010 - 14 juin 2010 à 20:41
cs_joumana07 Messages postés 10 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 16 juin 2010 - 15 juin 2010 à 19:14
slt;
j'ai deux classes :Appel,FrameA
FrameA :ajoute une image aves le critere cliquable
Appel :fais appel de la classe FrameA lors du choix du menuItemPc
mon probleme est que l'image ne s'insere pas dans la panel du classe Appel mais s'insere dans une nouvelle frame,voila mon code:
public class Appel extends JFrame implements ActionListener
{

String choisi="";
JPanel c = new JPanel();
Panel p1;
MenuItem pc;
MenuItem routeur;
MenuItem switcheur;
Appel(String s)
{
super(s);


setSize(600,600);
MenuBar b= new MenuBar();
Menu n=new Menu("Nouveau");

Menu commande=new Menu("les commande");
pc=new MenuItem("pc");
routeur=new MenuItem("routeur");
switcheur=new MenuItem("switch");

n.add(pc);
n.add(routeur);
n.add(switcheur);
b.add(n);



setMenuBar(b);
c.setSize(400,400);
pc.addActionListener(this);
routeur.addActionListener(this);
switcheur.addActionListener(this);
}
private int id=0;
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == pc)
{
try{
Thread iu=new Thread(new FrameA(id));
id++;
iu.start();
//c. add(iu);
}
catch(Exception ee){}


}
}

public void mouseMoved(MouseEvent e){}

public static void main(String args[])
{

Appel f=new Appel("Mon parc informatique");


f.setVisible(true);
}
}
public class FrameA extends JFrame implements Runnable {

private static final long serialVersionUID = 4983727800375272097L;
int g=0;
int id=0;
BufferedImage img = null;
public FrameA(int id) {
this.id=id;
System.out.println(id);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);



}
public void run()
{
try {
img = ImageIO.read(new File("c:/pc.jpeg"));
} catch (IOException e) {
e.printStackTrace();
}
setContentPane(new MyCanvas(img));
setVisible(true);
}
public static void main(String[] args) {
new FrameA(9). setVisible(true);
}

private class MyCanvas extends JComponent implements MouseListener {

private static final long serialVersionUID = 8845913940083986438L;

private BufferedImage buff = null;

private Raster data = null;

public MyCanvas(BufferedImage img) {
this.addMouseListener(this);
this.buff = img;
this.data = img.getData();
}

public void paintComponent(Graphics g) {

g.drawImage(buff, 0, 0, buff.getWidth(), buff.getHeight(), this);
}

private void testLocation(Point mouse, String text) {

if(data.getBounds().contains(mouse))
{
//Thread po=new Thread(new Interfacepc(id));
System.out.println("image"+id);
//po.start();
g++;
//po.setVisible(true);
}


}

public void mouseClicked(MouseEvent e) {

Point p = e.getPoint();
testLocation(p, "mouseClicked");
}

public void mousePressed(MouseEvent e) {

Point p = e.getPoint();
testLocation(p, "mousePressed");
}
public void mouseReleased(MouseEvent e) {

Point p = e.getPoint();
testLocation(p, "mouseReleased");
}

public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }

}
}
merci de m'aider

10 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
14 juin 2010 à 20:48
Salut,

Erreur archie classique : tu crée une nouvelle instancce à chaque fois, donc forcmément, ca te crée une nouvelle fenêtre à chaque fois :
Thread iu=new Thread(new FrameA(id)); // il faut travailler avec la même fenêtre à chaque fois au lieu d'en créer une nouvelle
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
cs_joumana07 Messages postés 10 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 16 juin 2010
14 juin 2010 à 20:57
salut,
merci de me repondre
pouvez vous m'expliquez plus car je suis encore debutante en java,
pouvez vous me corriger mon programme s'il vous plait!!
0
cs_joumana07 Messages postés 10 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 16 juin 2010
14 juin 2010 à 21:39
s'il vous plait explique moi que voulez vous dire avec"il faut travailler avec la même fenêtre à chaque fois au lieu d'en créer une nouvelle "?????
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
14 juin 2010 à 22:18
Salut,

Lorsque tu fais : new FrameA(id), ca te crée une nouvelle instance de ta classe FrameA (ca te fait une nouvelle variable si tu préfère), d'où la nouvelle fenêtre qui s'affiche à chaque fois.

Pour éviter cà, il faut toujours travailler avec la même instance (la même variable).

Du coup, il te faut déclarer une variable de type FrameA dans ta classe Appel :

public class Appel extends JFrame implements ActionListener 
{
FrameA frameA;
// reste du code


Et pour ton événement de clic :
public void actionPerformed(ActionEvent e) 
{ 
if(e.getSource() == pc) // évite cà : donne plutôt un nom à ton contrôle, et teste sa propriété name, ce sera plus prudent
{ 
try{ 
if (frameA == null) { // on ne crée qu'une seule fois la fenêtre
  frameA = new FrameA(id);
}
new Thread(frameA).start(); 
id++; 
} 
catch(Exception ee){
// TOUJOURS AFFICHER QUELQUE CHOSE SINON TU NE VERRAS PAS LES ERREURS
ee.printStackTrace();
} 


} 

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0

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

Posez votre question
cs_joumana07 Messages postés 10 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 16 juin 2010
14 juin 2010 à 22:34
merci de m'aider
mais dsl,tjs le meme probleme,l'image s'insere dans une nouvelle frame!!!
0
cs_joumana07 Messages postés 10 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 16 juin 2010
14 juin 2010 à 22:37
if(e.getSource() == pc) // évite cà : donne plutôt un nom à ton contrôle, et teste sa propriété name, ce sera plus prudent
je ne peux pas l'eviter car j'ai d'autre menuItem comment je peux faire la difference!!
j'ai pas compris votre idée
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
14 juin 2010 à 22:47
Salut,

Comme je l'ai mis en commentaire, il te suffit de rajouter un nom : lors de l'instanciation de ton menuitem :
pc=new MenuItem("pc");
pc.setName("pc");

Et ainsi après dans ton listener, tu peux tester le nom du composant qui a déclenché l'événement :
if("pc".equals(((JComponent)e.getSource()).getName())

Ainsi même si tu perd ta variable pc (par une nouvelle instanciation qui écrase l'ancienne variable par exemple), tu gardes toujours le même nom, et tu peux quand même gérer l'événement.

l'image s'insere dans une nouvelle frame

Où est-ce que tu veux afficher ton image au juste ? Car dans ton code, tu l'affiche forcément dans une nouvelle frame : la FrameA... qui est la seule à contenir une instance de ta classe MyCanvas.

Y'aurait beaucoup de chose à changer dans ton code : pourquoi mettre des threads partout alors qu'ils sont lancés par l'EDT ? Des fuites mémoires à cause de tes créations d'instance à chaque clic sur ton menuItem.

Bref, je te conseille vivement de lire des tutoriaux sur la programmation SWING, car sinon tu risques t'arracher beaucoup de cheveux avant d'arriver à faire ce que tu cherches à faire.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
cs_joumana07 Messages postés 10 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 16 juin 2010
14 juin 2010 à 23:02
je vous explique:
je veux lorsque je fais le choix du menuitem pc j'aurai une image d'un ordinateur qui s'insere dans le panel c du classe Appel c ts!!
j'ai utilisé des threads car chaque image represente un ordinateur dans mon projet et chaqueordinateur a des caracteres c'est pour cela moi j'ai utilisé des threads pour faire differenciés entre les images et lui donné chacune un identifiant
merci pour vous de m'aider car mm la nouvelle solution ne resoud pas le probleme
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
15 juin 2010 à 07:49
Salut,

j'ai utilisé des threads car chaque image represente un ordinateur dans mon projet et chaqueordinateur a des caracteres c'est pour cela moi j'ai utilisé des threads pour faire differenciés entre les images et lui donné chacune un identifiant


Je pense que tu n'as pas compris à quoi serve les threads : un thread est une classe qui permet de lancer des bouts de codes en parallèle : tu peux ainsi lancer 2 fonctions en même temps, sans que tu sois obligé d'attendre qu'un bout de code soit terminé pour en exécuter un autre. Il n'y a aucun rapport avec l'attribution d'un id à chaque de tes images...

Tu veux afficher l'image dans un panel de la classe Appel, ok, mais lequel ? Car dans ton code, je ne vois qu'un seul panel dans ta classe Appel : le panel "c", qui ne te sers absolument à rien vu qu'il n'est pas ajouté à ta fenêtre...

Vraiment, va lire un tutoriel sur SWING.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
cs_joumana07 Messages postés 10 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 16 juin 2010
15 juin 2010 à 19:14
slt,
oui je veux que mon image s'insere dans le panel "c" !!!
0
Rejoignez-nous