IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

probleme d'appel a un JPanel


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut probleme d'appel a un JPanel
    bonjour, je suis en trains de faire un petit programme permettant un lancer de dés aléatoire.

    Mon problème est assez difficile a expliquer alors je vous propose de le tester par vous même, en fait le programme permet de choisir le nombre de dés a lancer, puis affiche ces dés via une image JPG propre a chacune des faces dans un ou plusieurs JLabel(ImageIcon).
    Mais, ces images Ne s'affichent qu'après réduction puis réouverture de la JFrame ou après un click sur un des boutons permettant de choisir le nombre de dés a lancer...je subodore les "heu, tu veux dire quoi la ?".

    bref voila le code, moi j'ai retourner le probleme dans tout les sens, je vois pas comment en venir a bout, peut être avec Graphics2D en appelant redraw() ? :

    //////////////////////////////////////////////////////////////////////////////////////////////////

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package boiteade;
     
    import java.util.Random;
     
    public class MainBoiteDe {
     
     
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		Frame f = new Frame();
    	}
     
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    package boiteade;
     
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
     
    import javax.swing.ImageIcon;
     
    public class Calculs {
     
    	List<Integer> arrayDE = new ArrayList<>();
    	int nbrDE;
     
    	List<ImageIcon> arrayImg = new  ArrayList<>();
     
    	public void lancerDe(){
    		List<Integer> upArrayDE = new ArrayList<>();
    		Random rand = new Random();
    		for (int i = 0; i < nbrDE; i++) {
    			int a = rand.nextInt(7-1)+1;
    			upArrayDE.add(a);
    		}
    		arrayDE = upArrayDE;
    	}//////////   END OF lancerDE()		//////////////
     
    	public void returnImg(){
    		ImageIcon temporyImg = new ImageIcon();
    		for (int i = 0; i < arrayDE.size(); i++) {
    			switch (arrayDE.get(i)) {
    			case 1:
    				temporyImg = new ImageIcon("de_1.jpg");
    				break;
    			case 2 :
    				temporyImg = new ImageIcon("de_2.jpg");
    				break;
    			case 3 :
    				temporyImg = new ImageIcon("de_3.jpg");
    				break;
    			case 4 :
    				temporyImg = new ImageIcon("de_4.jpg");
    				break;
    			case 5 :
    				temporyImg = new ImageIcon("de_5.jpg");
    				break;
    			case 6 :
    				temporyImg = new ImageIcon("de_6.jpg");
    				break;	
    			default:
    				break;
    			}
    			arrayImg.add(temporyImg);
    		}
    		System.out.println(arrayImg);
    	}
     
    }
    ###########################################################################
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    package boiteade;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics2D;
    import java.awt.GridLayout;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.net.PasswordAuthentication;
     
    import javax.swing.BorderFactory;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    public class Frame extends JFrame {	
     
    	////	ACCES CLASSES	////
    	Calculs calc = new Calculs();
     
    	////	DIM FENETRE		////
    	int x = getToolkit().getScreenSize().width;
    	int y = getToolkit().getScreenSize().height;
    	Dimension dimEcran = new Dimension(x,y/2);
     
    	////	CONTENEUR PRINCIPALE	////
    	JPanel PanPrincipale = new JPanel();
     
    	////	CONTENEUR PANNEAUX DE	////
    	JPanel conteneurPansDE = new JPanel();
     
     
    	////	PANNEAU CHOIX NBR DE	////
    	JPanel panSelectNbrDE = new JPanel();
    		JButton boutonMoinsPanSelect = new JButton("-");			
    		JButton boutonPlusPanSelect = new JButton("+");				
    		JLabel labNbrDE = new JLabel();								
    		Dimension dimBoutonPanSelect = new Dimension(50, 50);		
     
    	////	PANNEAU BOUTON LANCER	////
    	JPanel panLancer = new JPanel();
    	JButton boutonLancer = new JButton("lancer !");
    	Dimension dimPanLancer = new Dimension(x/2, 70);
     
    	////	Affichage resultat		/////
    	JPanel contneurResult;
    	JLabel labImg;
    	ImageIcon img = new ImageIcon("de_1.jpg");
     
     
     
    	public Frame(){
    		this.setTitle("Boite a dés");
    		this.setSize(dimEcran);
     
    			panSelectNbrDE.setBackground(Color.gray);
    				boutonMoinsPanSelect.setPreferredSize(dimBoutonPanSelect);
    					boutonMoinsPanSelect.setEnabled(false);
    					boutonMoinsPanSelect.addActionListener(new  listenerBoutonsPlusMoins());
    				boutonPlusPanSelect.setPreferredSize(dimBoutonPanSelect);
    					boutonPlusPanSelect.addActionListener(new listenerBoutonsPlusMoins());
    				labNbrDE.setPreferredSize(new Dimension(80, 50));
    				labNbrDE.setBorder(BorderFactory.createLineBorder(Color.white));
    				labNbrDE.setBackground(Color.white);
    				labNbrDE.setOpaque(true);	
    			panSelectNbrDE.add(boutonMoinsPanSelect);
    			panSelectNbrDE.add(labNbrDE);
    			panSelectNbrDE.add(boutonPlusPanSelect);
     
    			panLancer.setBackground(Color.gray);
    			panLancer.setPreferredSize(dimPanLancer);	
    				boutonLancer.setPreferredSize(new Dimension(100, 50));
    				boutonLancer.addActionListener(new listenerBoutonLancer());
    			panLancer.add(boutonLancer);
     
    			conteneurPansDE.setLayout(new GridLayout(2, 1));
    			conteneurPansDE.add(panSelectNbrDE);
    			conteneurPansDE.add(boutonLancer);
     
    		PanPrincipale.add(conteneurPansDE);
    		this.setContentPane(PanPrincipale);
    		this.setVisible(true);
    	}
     
     
    	class listenerBoutonsPlusMoins implements ActionListener {
    		public void actionPerformed(ActionEvent e) {
    			// TODO ecoute boutons
    			if(e.getSource().equals(boutonMoinsPanSelect)){
    				calc.nbrDE--;
    				labNbrDE.setText(""+calc.nbrDE);
    			}else{
    				calc.nbrDE++;
    				labNbrDE.setText(""+calc.nbrDE);
    			}
     
    			if(calc.nbrDE > 0){
    				boutonMoinsPanSelect.setEnabled(true);
    			}else{
    				boutonMoinsPanSelect.setEnabled(false);
    			}
    		}
    	}//////////////		END OF CLASS	//////////
     
    	class listenerBoutonLancer implements ActionListener{
    		public void actionPerformed(ActionEvent e) {
    			// TODO Auto-generated method stub
    			calc.lancerDe();
    			calc.returnImg();
    				calc.arrayDE.clear();
    				calc.arrayImg.clear();
    		}
    	}///////////	END OF CLASS	///////////////
     
     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par llooiicc Voir le message
    Mais, ces images Ne s'affichent qu'après réduction puis réouverture de la JFrame ou après un click sur un des boutons permettant de choisir le nombre de dés a lancer...
    Oui, enfin, le code que tu nous montres ne fait même ça... la liste des ImageIcon n'est qu'une liste contenue dans la classe Calculs. Il n'y a rien qui les mets dans aucun JLabel, ni nulle part ailleurs.

    Le problème que tu indiques est dû au fait que lorsque Swing ne refait pas systématiquement l'agencement des composants, ou ne provoque pas systématiquement le redessin, en particulier sur des composants maison.

    Pour mettre les JLabel avec les images de dés, il faut déjà un container. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    conteneurPansDE.setLayout(new GridLayout(0, 1));
    conteneurPansDE.add(panSelectNbrDE);
    conteneurPansDE.add(boutonLancer);
     
    // un panel pour afficher les dés (variable panelDes déclarée en attribut de la classe)                    
    panelDes = new JPanel(new FlowLayout(FlowLayout.CENTER));
    conteneurPansDE.add(panelDes);
    Puis pour récupérer le tirage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    calc.lancerDe();
    calc.returnImg();
    panelDes.removeAll(); // on supprime tout ce qui se trouve déjà dans le panneau d'affichage des dés
    for(ImageIcon icon : calc.arrayImg) { // on parcourt les images (songer à faire une méthode lancerDe qui retourne directement une liste, en prenant en paramètre un nombre de dés, plutôt que d'accèder en direct aux attributs)
       JLabel label = new JLabel(icon); // on créé un label pour afficher l'imageicon
       label.setBorder(BorderFactory.createEmptyBorder(4, 2, 4, 2)); // pour pas que les images soit collées, une bordure
       panelDes.add(label); // on met le label dans le panneau d'affichage
    }
    conteneurPansDE.revalidate(); // pour forcer le réagencement
    // conteneurPansDE.repaint(); // dans certains cas, un redessin peut être nécessaire aussi
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Grand Probleme d'appele d'une fonction
    Par Soufyane dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/02/2006, 15h57
  2. [XSLT] [MSXML] probleme d'appel a javascript
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 16/01/2006, 14h01
  3. probleme d'appel de fonction!
    Par transistor49 dans le forum C++
    Réponses: 5
    Dernier message: 11/03/2005, 10h46
  4. Réponses: 8
    Dernier message: 13/08/2004, 12h32
  5. [Reflection] Probleme d'appel newInstance()
    Par SEMPERE Benjamin dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 17/06/2004, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo