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

Agents de placement/Fenêtres Java Discussion :

Récupérer un lien vers une JFrame


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 93
    Points : 90
    Points
    90
    Par défaut Récupérer un lien vers une JFrame
    Bonsoir
    Tout d'abord merci pour votre lecture.

    Je suis toujours en train d'apprendre à créer une interface swing et je bloque sur un point crucial
    Mes lectures sont :
    http://baptiste-wicht.developpez.com...?page=fenetres
    et la FAQ GUI

    D'après ce que j'ai lu il est fortement conseillé de créer un thread à chaque fois que l'on veut faire du graphique, afin de ne pas ralentir l'interface graphique

    Ma question est donc tout simple
    Je souhaite faire :
    1 - invocation d'une JFrame quasi vide (pour montrer que le programme est parti, voir je rajouterais une barre de chargement de base)
    2 - Effectuer un traitement long
    3 - Modifier ma fenêtre, ajouter par exemple des buttons
    Ma question : comment dois-je m'y prend ?

    Étant donné que je crée ma fenêtre dans un thread, il m'est ensuite impossible d'y accèder.
    Les différents codes exemple que je trouve n'utilise pas de thread et du coup la JFrame est connu par le main, sauf que là, ça ne marche pas

    Pour l'instant j'ai une classe contenant mon main qui ressemble à ceci
    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
     
    public class jeu {
    	public static void main (String [] args)throws IOException {
    	//[..]
    	Sting s = "";
    	switch (i) {
    		case 1 : s = "Morpion"; break;
    		case 2 : s = "Puissance 4"; break;
    		default : System.out.println("Erreur dans l'instancation des regles"); break;
    }
    	SwingUtilities.invokeLater(new Runnable(){
    			public void run(){
    				//On crée une nouvelle instance de notre JDialog
    				Gui fenetre = new Gui(s);
    				fenetre.setVisible(true);//On la rend visible
    			}
    	});
    	//[...] mon traitement long
    	// Ici j'aimerais modifier ma fenêtre ajouter des bouton en fonction du traitement long
    	// je présume que l'ajout se ferra via de nouveau un thread afin de séparer application et GUI
    }
    ma classe GUI
    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
    import java.awt.*;
    import javax.swing.*;
     
     
    public class Gui extends JFrame{	
     
    	private static final long serialVersionUID = 1L;
     
    	public Gui(String title){
    		super();
    		build(title);//On initialise notre fenêtre
    	}
     
    	private void build(String title){
    		setTitle(title); //On donne un titre à l'application
    		setSize(320,240); //On donne une taille à notre fenêtre
    		setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
    		setResizable(true); //On autorise la redimensionnement de la fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
    		setContentPane(buildContentPane());
    	}
     
    	private JPanel buildContentPane(){
    		JPanel panel = new JPanel();
    		panel.setLayout(new FlowLayout());
    		panel.setBackground(Color.white);
    		JLabel label = new JLabel("Match en cours");
    		panel.add(label);
    		return panel;
    	}
     
    	public JButton createButton(String loc_icon) {
    		JButton but = new JButton(loc_icon);
    		return but ;
    	}
     
    	public JButton addButton(JPanel p, JButton but){
    		p.add(but);
    		return but;
    	}
    }
    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    salut
    tu sais mon ami,je comprend vraiment pas ton problème mais voici coméme une correction de ta classe Jeu
    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
    import java.io.IOException;
    
    import javax.swing.SwingUtilities;
    
    public class jeu {
    	private static int i;
    	static String s = "";
    
    	public static void main (String [] args)throws IOException 
    	{
    	//[..]
    	
    	switch (i) {
    		case 1 : s = "Morpion"; break;
    		case 2 : s = "Puissance 4"; break;
    		default : System.out.println("Erreur dans l'instancation des regles"); break;
    }
    	SwingUtilities.invokeLater(new Runnable(){
    			public void run()
    			{
    				//On crée une nouvelle instance de notre JDialog
    				Gui fenetre = new Gui(s);
    				fenetre.setBounds(400, 100, 400, 400);
    				fenetre.setVisible(true);//On la rend visible
    			}
    	});
    	}}
    	//[...] mon traitement long
    	// Ici j'aimerais modifier ma fenêtre ajouter des bouton en fonction du traitement long
    	// je présume que l'ajout se ferra via de nouveau un thread afin de séparer application et GUI
    et de ta classe GUI
    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
     
    import java.awt.*;
    import javax.swing.*;
     
     
    public class Gui extends JFrame{	
     
    	private static final long serialVersionUID = 1L;
     
    	public Gui(String title){
    		super();
    		build(title);//On initialise notre fenêtre
    	}
     
     
    	private void build(String title){
    		setTitle(title); //On donne un titre à l'application
    		setSize(320,240); //On donne une taille à notre fenêtre
    		setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
    		setResizable(true); //On autorise la redimensionnement de la fenêtre
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit à l'application de se fermer lors du clic sur la croix
    		setContentPane(buildContentPane());
    	}
     
    	private JPanel buildContentPane(){
    		JPanel panel = new JPanel();
    		panel.setLayout(new FlowLayout());
    		panel.setBackground(Color.white);
    		JLabel label = new JLabel("Match en cours");
    		panel.add(label);
    		return panel;
    	}
     
    	public JButton createButton(String loc_icon) {
    		JButton but = new JButton(loc_icon);
    		return but ;
    	}
     
    	public JButton addButton(JPanel p, JButton but){
    		p.add(but);
    		return but;
    	}
    }
    bonne nuit.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 93
    Points : 90
    Points
    90
    Par défaut
    Bonjour
    Tout d'abord merci de ton aide

    Je n'ai pas du être clair puisque tu ne m'as pas compris, je vais essayer de reexpliquer, ce que je souhaite

    Mais tout d'abord vis à vis de ta correction
    Je ne comprends pas l'utilité de
    fenetre.setBounds(400, 100, 400, 400);
    En effet j'ai déjà défini la taille de la fenêtre dans ma classe GUI :
    setSize(320,240); //On donne une taille à notre fenêtre
    et ma fenêtre s'affiche correctement.
    A quoi sert ta correction?

    Ensuite vis à vis de mon problème, ce que je souhaite faire c'est:
    1 - Lancement de mon main.
    2 - Question de choix (morpion ou puissance4) (ceci dans la console)
    3 - Lancement d'une fenêtre vide avec en tirte le jeu
    4 - Plein de calcul et génération de variable, dont par exemple l'ensemble des coups jouable
    5 - Ajout d'autant de bouton que de coups jouable (le nombre de bouton dépend du choix du jeu)

    Donc voila de l'étape 1 à 4 aucun problème
    Le problème est l'étape 5 j'ai généré dans un thread une JFrame, sauf que je n'ai ensuite aucun pointeur dessus pour m'y adresser
    Je pourrais peut être m'en sortir en déclarant une variable JFrame static final dans ma classe principal, mais imaginons que je veuille lancer plusieurs fois mon main comment dois-je faire?

    Merci d'avance pour l'aide

  4. #4
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    Citation Envoyé par _xme_ Voir le message
    Bonjour
    Tout d'abord merci de ton aide

    Je n'ai pas du être clair puisque tu ne m'as pas compris, je vais essayer de reexpliquer, ce que je souhaite

    Mais tout d'abord vis à vis de ta correction
    Je ne comprends pas l'utilité de
    fenetre.setBounds(400, 100, 400, 400);
    En effet j'ai déjà défini la taille de la fenêtre dans ma classe GUI :
    setSize(320,240); //On donne une taille à notre fenêtre
    et ma fenêtre s'affiche correctement.
    A quoi sert ta correction?
    bonjour
    tu as raison ,je pense que j'avais assez sommeil hier soir quand j'ai lit ton post .j'ai pas vu en fait ton instruction setSize()..



    Citation Envoyé par _xme_ Voir le message
    Le problème est l'étape 5 j'ai généré dans un thread une JFrame, sauf que je n'ai ensuite aucun pointeur dessus pour m'y adresser
    par exemple si tu crée une classe tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     class  Creation_bouton
     {
    	 public Creation_bouton(JFrame fen)
    	 {
     
    	 }
     }
    ça te résout pas le problème si tu fait dans ton main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void run()
    			{
    				//On crée une nouvelle instance de notre JDialog
    				Gui fenetre = new Gui(s);
    				fenetre.setVisible(true);//On la rend visible
    				Creation_bouton instance = new Creation_bouton(fenetre);
    			}

    Citation Envoyé par _xme_ Voir le message
    mais imaginons que je veuille lancer plusieurs fois mon main comment dois-je faire?
    j'ai bien dormis et j'ai pas sommeil et malgré tout je comprend pas ce que tu veux dire !!!!

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 93
    Points : 90
    Points
    90
    Par défaut
    bonjour
    merci pour ta réponse
    Je dois vraiment pas être concis ce matin car malgré ta bonne volonté on se comprend pas

    Citation Envoyé par _xme_
    Le problème est l'étape 5 j'ai généré dans un thread une JFrame, sauf que je n'ai ensuite aucun pointeur dessus pour m'y adresser
    Je sous entends que je veux un pointeur pour pouvoir m'y adresser après dans un thread différents, invoqué après
    ton bouton étant dans le même thread, j'ai le même problème de visibilité

    Fmunch m'a fournit un très bonne exemple dans un autre sujet et du coup mes codes ont pas mal changé, j'ai à peu près ce que je veux
    Sauf que j'ai deux questions
    Est ce que la méthode utilisée est bonne? (ben oui c'était pas celle conseillé dans le tuto, donc je ne sais pas)
    Et j'ai un problème de rafraichissement, les boutons apparaissent que si je redimensionne ma fenêtre, la méthode repaint() à pas l'air de marcher et je ne comprends pas pourquoi.

    Mes codes :
    mon main
    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
    import java.util.ArrayList;
     
    import javax.swing.JButton;
     
     
    public class T {
    	public static void main(String[] args) {
            	System.out.println("Avant boucle");
    		final Gui[] fenetre = new Gui[10] ;
    		for(int i = 0 ; i < 10 ; i++) {
    			final int j = i;
    	    		final String s = "fenetre " + j;
    	    		Runnable r = new Runnable() {
    	    			public void run() {
    	    				fenetre[j] = new Gui(s);
    	    				fenetre[j].setVisible(true);//On la rend visible
    	    			}
    	    		};
    	    		Thread th = new Thread(r);
    	    		th.start();
    	   	}
          	  	System.out.println("Avant pause");
            	try{
    			Thread.currentThread().sleep(5000);
    		}
    		catch(InterruptedException ie){}
            	System.out.println("Apres pause");
    		for(int i = 0 ; i < 10 ; i++) {
    			final int j = i;
    	    		final String s = "mon bouton " + j;
    	    		Runnable r = new Runnable() {
    	    			public void run() {
    	    				JButton mon_bouton = fenetre[j].createButton(s);
    	    				fenetre[j].addButton(fenetre[j].get_panel(), mon_bouton);
    	    			}
    	    		};
    	    		Thread th = new Thread(r);
    	    		th.start();
    	    	}
            	System.out.println("Fin");
    	}
    }
    mon GUI
    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
    import java.awt.*;
    import javax.swing.*;
     
     
    public class Gui extends JFrame{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private JPanel panel;
     
    	public Gui(String title){
    		super();
     
    		build(title);//On initialise notre fenêtre
    	}
     
    	private void build(String title){
    		setTitle(title); //On donne un titre à l'application
    		setSize(320,240); //On donne une taille à notre fenêtre 
    		setLocationRelativeTo(null); //On centre la fenêtre sur l'écran
    		setResizable(true); //On autorise la redimensionnement de la fenêtre
    		setContentPane(buildContentPane());
    	}
     
    	private JPanel buildContentPane(){
    		panel = new JPanel();
    		panel.setLayout(new FlowLayout());
    		panel.setBackground(Color.white);
    		JLabel label = new JLabel("Match en cours");
    		panel.add(label);
    		return panel;
    	}
     
    	public JPanel get_panel() {
    		return panel;
    	}
     
    	public JButton createButton() {
    		JButton but = new JButton();
    		return but ;
    	}
     
    	public JButton createButton(String loc_icon) {
    		JButton but = new JButton(loc_icon);
    		return but ;
    	}
     
    	public void addButton(JPanel p, JButton but){
    		p.add(but);
    		p.repaint();
    	}
    }
    Merci d'avance

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 93
    Points : 90
    Points
    90
    Par défaut
    Arpès une bonne journée de recherche j'ai trouvé
    C'était revalidate, qu'il fallait utiliser et non repaint
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public void addButton(JPanel p, JButton but){
    		p.add(but);
    		p.revalidate();
    	}
    Merci pour tout

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Points : 7
    Points
    7
    Par défaut demande daide pr débutante en java
    bonjour tout le monde , voilà mon code lorsque je l'exécute ça me donne erreur :
    java.lang.NoClassDefFoundError: Switch/Switch
    Exception in thread "main"
    merci de m'expliquer c'est quoi le souci svp je toute débutante en java ; merci d'avance
    ------------------------------
    package Switch;

    public class Switch {

    public static void main(String[] args) {

    // afficher la valeur entrée
    System.out.println("la valeur de la tva est" + args[0]);
    int param = Integer.parseInt(args[0]);
    float montant = 2000;
    switch (param) {
    case 10: {
    montant *= 1.1;
    break;
    }
    case 20: {
    montant *= 1.2;
    break;
    }
    case 30: {
    montant *= 1.3;
    break;
    }
    default:
    montant *= 1.2;
    }

    // afficher le montant de la facture
    System.out.println("le montant ttc est :" + (int) montant);

    }
    }

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 93
    Points : 90
    Points
    90
    Par défaut
    bonsoir
    petit rappel de règle, si tu souhaites obtenir une réponse :
    1 - Utilise les balises ['code']['/code'] (enlever les ' pour les utiliser)
    2 - Ne poste pas dans un sujet marqué résolu
    3 - Créer ton propre sujet, surtout que ça n'a rien à voir

    bonne soirée

    (J'apprécierais que tu vires ton post, histoire que ce sujet garde une contenance merci)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lotus] lien vers une db lotus
    Par maketossss dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 07/11/2005, 18h24
  2. [Frames] un lien vers une page de Frames vers une page sans
    Par jamesleouf dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/09/2005, 18h25
  3. [C#] DataGrid qui contient un lien vers une page
    Par Roach dans le forum ASP.NET
    Réponses: 6
    Dernier message: 19/08/2005, 13h54
  4. [FLASH MX] Lien vers une application
    Par mzt.insat dans le forum Flash
    Réponses: 4
    Dernier message: 15/03/2005, 19h18
  5. Lien vers une variable ?
    Par drinkmilk dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 22/02/2005, 09h55

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