Afficher image au clic - debutant

Fermé
MalonTails Messages postés 86 Date d'inscription mercredi 26 avril 2017 Statut Membre Dernière intervention 26 avril 2021 - 6 avril 2018 à 11:07
MalonTails Messages postés 86 Date d'inscription mercredi 26 avril 2017 Statut Membre Dernière intervention 26 avril 2021 - 9 avril 2018 à 10:05
Bonjour,



Bonjour à toutes et à tous,

Je recherche a faire un programme java, sur celui-ci il y aura beaucoup de boutons et en fonction du clic sur un bouton une image différente apparaitra.

Cependant, je suis débutante et je ne sais le faire qu'en faisant des panels différents. Je fais que quand on clic une fenetre s'ouvre affichant l'image.

Mais il va y avoir une cinquantaine d'images et je suppose qu'il existe un autre moyen que de créer 50 fenetres différentes mais je ne sais pas du tout comment faire.



J'ai pensé a faire une variable image dans le deuxieme pane, et en fonction du clic changer le chemin mais je n'y arrive pas

ça c'est pour le deuxieme pane, les boutons se trouvent dans le premier. Et je voudrai dire "si clic sur bouton1 alors la variable image = xxx.xxx "

Voici ma pane2 ( celle qui affichera l'image lorsque l'on clique )

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

 
public class Pane2 extends JPanel {
	String image="";
	
	



	public void paintComponent(Graphics g){
		super.paintComponent(g);
	
		
		
	try
	{
		BufferedImage map=ImageIO.read(getClass().getClassLoader().getResource(image));
		g.drawImage(map,0,0,getWidth(), getHeight(), this);

	
}
	
	 
	catch (IOException e) {
	e.printStackTrace();
	
	}
}
}


et voici la fonction d'action de ma fenetre 1 ( celle ou il y a les boutons )
public void actionPerformed(ActionEvent e) {
	// TODO Auto-generated method stub
	Pane2 jp2= new Pane2();
	if((JButton)e.getSource()==bouton) 
	{
	
		jp2.image = "image/dresseur.jpg";
		NouvelFenetre frame = new NouvelFenetre();
		frame.setVisible(true);
	
}
	
	if((JButton)e.getSource()==bouton2) 
	{
		NouvelFenetre frame = new NouvelFenetre();
		frame.setVisible(true);
}
	
}



Merci à tous ceux qui pourront m'aider !
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 avril 2018 à 19:40
Bonjour,

Afficher une nouvelle fenêtre pour chaque image n'est pas forcément une mauvaise idée, c'est ce que fait Gimp par exemple, personnellement je trouverais plus habile d'avoir un système d'onglets à l'intérieur de ta fenêtre principale.
https://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html

Remarque : je ne suis pas fan du concept d'avoir un bouton par image à afficher, cela dépend bien sûr de ce que tu veux faire, mais une liste déroulante permettant de choisir quelle image doit s'ouvrir pourrait être bien.
https://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html

Attention : dans ton code tu fais ImageIO.read() dans le paintComponent, c'est une très mauvaise idée.
Java va automatiquement appeler cette méthode plusieurs fois, autant qu'il veut.
En particulier lors d'un redimensionnement de la fenêtre (le cas qui t'intéresse) il y aura un appel pour chaque nouvelle taille (potentiellement des dizaines à la suite), il est donc maladroit d'aller lire le fichier à chaque fois.
Tu devrais plutôt remplacer ton String image par le BufferedImage map et l'initialiser dans le constructeur, comme ça tu charges le fichier une seule fois au début.

Attention :
if((JButton)e.getSource()==bouton)
pourrait provoquer une ClassCastException si e.getSource() n'est pas un JButton. Tu pourrais par contre faire
if(e.getSource()==bouton)
sans cast.
Remarque : personnellement je conseillerais plutôt d'avoir un ActionListener par bouton et de faire directement bouton.addActionListener(actionListener1) et bouton2.addActionListener(actionListener2), alors qu'ici tu as probablement fait un frame.addActionListener(actionListener) avec une frame omnisciente qui gère absolument tout ce qu'il se passe, alors que l'on pourrait déléguer les actions, ce qui donne un code plus compréhensible.

Remarque : avec un code complet pour tester ton programme ce serait plus simple de te suivre et te proposer des exemples de code qui correspondraient exactement à ce que tu fais.
0
MalonTails Messages postés 86 Date d'inscription mercredi 26 avril 2017 Statut Membre Dernière intervention 26 avril 2021
9 avril 2018 à 10:05
Oups j'ai pas eu mon ordinateur du week end :s
Merci beaucoup d'avoir pris le temps de me répondre, je vais de suite mettre en pratique tes infos. Merci énormément ça va m'aider à progresser.
Pour le coup oui les boutons sont demandés par la personne x).
0