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

AWT/Swing Java Discussion :

(toujours débutant) JButton


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut (toujours débutant) JButton
    Bonjour,
    je débute en Java depuis hier, et je lutte sur des problèmes vraiment idiots...

    J'ai réussi tant bien que mal à faire mon 1er bouton (JButton), et a l'afficher sur une fenetre simple. Seulement voilà, mon bouton prend systématiquement toute la taille de ma fenetre...

    J'ai essayé de nombreuses méthodes proposé par l'éditeur, et en particulier setSize(x,y), mais rien n'y fait...

    Pour tester, j'ai fait 2 boutton sur cette même fenetre, et un seul des 2 (c'est déjà pas mal^^) apparait discretement en haut a gauche a la bonne taille, et disparait sitot que je clique que le 2e boutton qui lui prend toute la frame.

    J'ai jetté d'un coup d'oeil aux Layout, mais j'avous ne pas avoir tout compris...

    le code :
    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
     
    	public page1() 
    	{
    		super("page 1");		
    		WindowListener l = new WindowAdapter() 
    		{
    			public void windowClosing(WindowEvent e)
    			{
    				System.exit(0);
    			}
    		};
    		addWindowListener(l);
     
    		//JPanel pannel = new JPannel();
    		JButton b1 = new JButton("bouton 1");
    		//b1.setLayout(new GridLayout(0,1));
    		//JButton b2 = new JButton("bouton 2");
    		//b1.setSize(100, 50);
    		//b1.setAlignmentX(20);
    		//b1.setAlignmentY(10);
    		//b2.setSize(50, 20);
    		//b2.setBounds(10, 10, 100, 50);
    		//b2.setText("plop");
    		add(b1);
    		//add(b2);
     
    		setSize(300,200);
    		setVisible(true);		
    	}
    Je laisse les commentaire inutiles qui montrent dans quel sens j'ai tatonné (sans succès).

    Mes questions sont donc :

    - suis-je complétement à coté de la plaque ? est-ce un problème lié au Layout ? Pourquoi le boutton prend toute la taille de la fenetre ?

    - est-ce là le seul moyen de créer une interface sans passer par des plugins (que je ne saurais d'ailleur encore même pas installé)

    - existe t-il une class browser dans les packages JAVA ?
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  2. #2
    Membre habitué Avatar de benjiprog
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 134
    Points
    134
    Par défaut
    Il prend toute la place car tu n'a pas de gestionnaire de mise en forme c'est ce qui dispose tes composants.
    Pour que tes boutons soient bien disposer rajoute un bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getContentPane().setLayout(new FlowLayout());
    Avec ca tu obtiendra un gestionnaire du type FlowLayout qui se chargera de disposer tes boutons par rapport au contenu de ta fenetre.

    Pour l'adapter a ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    JButton b1 = new JButton("bouton 1");
    JButton b2 = new JButton("bouton 2");
    Container contenu = getContentPane();
    contenu.setLayout(new FlowLayout());
    contenu.add(b1);     //ajout des boutons au contenu de la fenetre.
    contenu.add(b2);
    Voilà avec ca tes boutons seront automatiquement disposer dans ta fenêtre.
    Je pense que pour toi qui est débutant c'est une manière assez simple pour commencer.
    Les élèves glandeurs c'est comme le linge, quand il fait beau ca sèche.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Merci pour ta réponse.
    En effet, tes modifications me permettent d'obtenir un boutton de taille normale :p

    En revanche, je ne voudrais pas abuser de ta gentillesse, mais je me pose encore quelques questions :

    1 - j'ai pas vraiment compris ce que j'ai fait

    2 - je ne peut toujours pas modifier la taille (setSize) du boutton, ni ses coordonnées (du moins pas quand je défini mon bouton dans ma class interface)

    3 - si je rajoute dans mon main()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		JFrame frame = new page1();
    		JButton b1 = new JButton("b1");
    		b1.setSize(70, 40);
    		frame.add(b1);
    La, il se passe un truc vachement bizar, car quand le curseur de la souris passe dans le coin en haut à gauche de ma fenetre (et seulement a ce moment la), un bouton de dimension 70x40 y apparait...

    Je me sens un peu géné de poser ce genre de question d'autant qu'il doit bien y avoir des tuto qui y répondent, mais c'est assez difficile de savoir quoi chercher quand on connais pas le jargon (genre j'ai mis un p'tit moment a réaliser que Swing était ce qu'il me fallait pour faire une interface lol)

    Quoiqu'ilo en soit, merci pour vos réponses ^^
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  4. #4
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Slt,
    juste quelques petits conseils pour commencer. Tu devrais eviter de faire des classes qui herites des JComponent (ex JFrame, JPanel, etc...) sauf si tu veux modifier certaines methodes des classes JComponent.
    Ce que tu devrais plutot faire c'est faire une classe (page1 comme tu as fait) qui s'occupe de creer toute l'interface une fois pour toute.
    Pour retailler les composant utilise la methode setPreferedSize(), ca a plus de chance de marcher.
    Pour ton bouton qui apparait montre le code de ta classe page1 pour qu'on voit si il n'y a pas d'erreurs.
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    En vrac, la totalité du code :

    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
     
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    /**
     * @author steph
     *
     */
    public class page1 extends JFrame
    {
     
    	/**
             * @param args
             */
     
    	public page1() 
    	{
    		super("page 1");		
    		WindowListener l = new WindowAdapter() 
    		{
    			public void windowClosing(WindowEvent e)
    			{
    				System.exit(0);
    			}
    		};
    		addWindowListener(l);
     
    		//JPanel pannel = new JPannel();
    		JButton b1 = new JButton("bouton 1");
    		Container contenu = getContentPane();
    		contenu.setLayout(new FlowLayout());
    		//b1.setLayout(new GridLayout(0,1));
    		JButton b2 = new JButton("bouton 2");
    		b1.setSize(150, 50);
    		b1.setAlignmentX(20);
    		b1.setAlignmentY(10);
    		//b2.setSize(50, 20);
    		//b2.setBounds(10, 10, 100, 50);
    		//b2.setText("plop");
    		add(b1);
    		add(b2);
     
    		setSize(300,200);
    		setVisible(true);		
    	}
     
    	public static final long serialVersionUID = 1;
     
     
    	public static void main(String[] args) 
    	{
    		// TODO Auto-generated method stub
     
    		JFrame frame = new page1();
    		JButton b1 = new JButton("b1");
     
    		//b1.setLayout(new GridLayout(0,1));
    		//b1.add(new JLabel("xxx", JLabel.CENTER));
    		b1.setSize(70, 40);
     
    		//frame.getContentPane().setLayout(new FlowLayout());
    		//frame.getContentPane().add(b1);
    		frame.add(b1);
    		//frame.show();
     
    		//frame.addWindowListener(l);
    		//frame.setSize(200, 200);
    		System.out.println("yop");
    	}
     
    }
    ps : fumiste972 ? 972 comme la martinique ?

    - - - edit - - -

    je laisse les commentaire au cas vous vouliez voir dans quoi j'ai patogé :p
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  6. #6
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Citation Envoyé par gloubi
    ps : fumiste972 ? 972 comme la martinique ?
    Oui comme la Martinique
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

  7. #7
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    He bien en regardant ton code c'est normal que t'en trois boutons vu que tu en ajoute trois dans ta Frame (b1 bouton1 et bouton2).
    En fait je ne vois pas ce qui ne va pas. L'application fait ce que tu lui dit de faire : afficher trois boutons dans ta frame!!
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    moi <- 971 ^^

    sinon, je sais bien que c'est normal d'avoir 3 bouttons...

    Ce qui me parrait plus bizar, c'est que le 3e boutton (celui que je créé dans le main) apparaisse d'une part et contrairement aux autres avec les dimensions que j'ai spécifié, et d'autre part qu'il ne s'affiche que quand le curseur survole sa position...

    meric pour tes reponses
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  9. #9
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    cool represent les dom !!
    Pour ton pb ouais j'ai teste et j'ai vu. Comme je t'ai di ton troisieme bouton dans ton main il faut le creer et l'ajouter en meme temps que les 2 autres c-a-d dans le constructeur de page1.
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

  10. #10
    Membre habitué Avatar de benjiprog
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 134
    Points
    134
    Par défaut
    Avec la méthode que je t'ai donner tu n'a plus besoin de spécifier des dimensions pour tes boutons, le gestionnaire s'en occupe a moins que tu ne veuille, bien evidemment, donner une taille précise à tes boutons.
    Si ton 3ème boutons réagit assez bizarrement je pense que c'est parce que il ne bénéficie pas du gestionnaire de mise en forme que tu a appliqué au 2 premiers boutons.
    Quand tu applique le gestionnaire de mise en forme place le plutôt après l'instantiation de tes boutons.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    JButton b1 = new JButton("bouton 1");
    JButton b2 = new JButton("bouton 2");
    Container contenu = getContentPane();
    contenu.setLayout(new FlowLayout());
    Sinon pour répondre a ta question d'hier quand tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contenu.setLayout(new FlowLayout());
    en fait tu choisi un gestionnaire puis tu lui applique la méthode setLayout à l'objet contenu de la fenetre et tu obtient un gestionnaire de type FlowLayout. Voilà j'éspère que tu as compris.
    Une dernière chose si tu veux créer 3 boutons dans une fenetre ou plus le gestionnaire de mise en forme te sera utile, imaginons que tu veuille créer 3 boutons b1,b2 et b3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    JButton b1 = new JButton("bouton 1");
    JButton b2 = new JButton("bouton 2");
    JButton b3 = new JButton("bouton 3");
    Container contenu = getContentPane();
    contenu.setLayout(new FlowLayout());
    Avec ca tes 3 boutons seront automatiquement disposer dans ta fenetre. Et tu peux faire ca avec 4,5,6 boutons ou plus.
    Les élèves glandeurs c'est comme le linge, quand il fait beau ca sèche.

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Citation Envoyé par benjiprog
    Avec ca tes 3 boutons seront automatiquement disposer dans ta fenetre. Et tu peux faire ca avec 4,5,6 boutons ou plus.
    C'est bien mon problème, je veux pas qu'ils me les positionnent de façon automatiques, je veux pouvoir specifier moi même leur taille et leur positions...

    J'ai des notions de C++, et je comprend sans mal pourquoi le comportement est différent selon la méthode qu'on utilise pour appeler les boutons (en l'occurence, on les intègre pas dans le même objet), mais je ne comprend pas pourquoi le boutton que j'integre direct a JFrame sans passer par les Layout ne s'affiche que quand le curseur de la souris le survole...
    La notion de Layout m'échape également encore complétement...

    Je m'obstine a commencer mon apprentissage par la, car je pense que c'est indispensable de savoir s'interfacer avec son programme avant d'aller plus loin.

    En tout cas, encore merci a tous de vous pencher sur mon problème
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 845
    Points : 22 859
    Points
    22 859
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par gloubi
    C'est bien mon problème, je veux pas qu'ils me les positionnent de façon automatiques, je veux pouvoir specifier moi même leur taille et leur positions...
    Il te faut mettre le layout a null (avec setLayout(null)) apres tu peux faire ce que tu veux avec setBounds(), setSize() et setLocation() sur les composants que tu ajoutes dans ton container. Note que cette technique est en fait assez peu utilisee car peu portable (la taille des fonts varie avec les JVM suivant les systemes) et supporte mal l'internationalisation et localisation (les labels en francais sont en general 33% plus longs qu'en anglais). En regle general, c'est plus pratique d'utiliser des layouts (ne pas hesiter a tous les tester).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    Je vais ajouter ma pierre a ton edifice en te donnant quelques liens avec des tutos bien fait, car c'est mieux de comprendre ce que l'on code

    Tutoriels pour apprendre Java : http://java.developpez.com/cours/
    Le chapitre sur les composants awt et swing de Penser en Java
    La doc officielle


    Deja avec ca tu devrais arriver a mieux comprendre les differents composants et surtout pourquoi et comment ils sont mis en place par le gestionnaire.
    Science sans conscience n'est que ruine de l'âme

  14. #14
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Merci beacoup
    franchement, vous fûtes utiles ^^
    J'espere qu'un jour, c'est moi qui donnerai ce style de coup de main sur ce forum
    Si vous avez un message d'erreur, n'oubliez pas de le lire, la réponse à votre problème est surement dedans !

  15. #15
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    J'arrive un peu tard... mais il y a quelque chose qui me chiffone !

    Il y une notion très importante à prendre en compte dans le developpement d'application Swing, c'est qu'un thread (EDT : Event Dispatch Thread) a la charge de gérer l'affichage des composants et les évenement (clic de souris, etc.).

    Mais les composants Swing ne sont pas thread-safe. C'est à dire que toutes modifications ou accès aux composants DOIVENT impérativement être effectué depuis le thread de l'EDT en utilisant les méthode SwingUtilities.invokeLater() ou invokeAndWait(), par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SwingUtilities.invokeLater( new Runnable() {
           public void run() {
                  // Traitement sur les composants ICI
           }
    }
    Si tu ne passes pas par l'EDT pour modifier ton interface tu peux avoir des surprises comme celles-là ! Plus d'info : Threads et performance avec Swing par Romain Guy



    Enfin, deuxième point : lorsque tu ajoutes/supprimes des composants d'un autre composant qui est déjà visible, il faut utiliser validate() pour le forcer à prendre en compte les modifications...

    Au final, ta méthode main() devrait ressembler à cela :
    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
        public static void main(String[] args) 
        {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
     
                    JFrame frame = new page1();
     
     
                    JButton b1 = new JButton("b1");
                    b1.setSize(70, 40);
                    frame.add(b1);
                    frame.validate();
                }
            });
     
            System.out.println("yop");
        }
    a++

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

Discussions similaires

  1. Les types (toujours débutant)
    Par Pov type dans le forum Débuter
    Réponses: 7
    Dernier message: 18/09/2008, 08h37
  2. équivalent de IntToStr (encore et toujours débutant)
    Par Pov type dans le forum Débuter
    Réponses: 9
    Dernier message: 17/09/2008, 13h50
  3. [Débutant] JButton et Thread
    Par ViRouF dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 30/01/2007, 09h24
  4. Réponses: 18
    Dernier message: 06/07/2006, 18h40
  5. [débutant][swing][JButton][ActionListener]
    Par cmoa59 dans le forum Composants
    Réponses: 6
    Dernier message: 25/05/2005, 15h19

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