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 :

bouton qui dépasse & clignotement


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut bouton qui dépasse & clignotement
    Bonjour,

    Je poste ici un bout de code très simple qui n'a aucun intérêt mais qui reflète les problèmes de base que j'ai avec Swing.
    Je veux avoir par exemple un panneau dont la largeur fait 50 % de celle de ma JFrame, même après redimensionnement. J'utilise donc un setBounds() dans paintComponent (peut-être est-ce la première erreur d'ailleurs).

    J'ajoute un JButton et un JLabel à mon panneau, qui est en BorderLayout().
    Comme celui-ci n'a pas de taille lors de sa construction, l'ajout se fait apparemment sur toute la largeur de la frame, vu que mon panneau est censé occuper tout l'espace, je présume.

    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
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class TestContPan extends JPanel implements ActionListener {
     
    	public TestContPan() {
    		setBackground(Color.blue);
    		this.setLayout(new BorderLayout());
     
    		bouton = new JButton("compte clics");
    		bouton.addActionListener(this);
    		add(bouton, "South");
     
    		haut = new JLabel("clic pair");
    		add(haut, "North");
    	}
     
    	@Override
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		setBounds(0, 0, getParent().getWidth()*50/100, getParent().getHeight());
    	}
     
    	@Override
    	public void update(Graphics g) {
    		System.out.println("Appel à update(Graphics g)");
    		if (offScreenImage == null)
    			offScreenImage = createImage(getWidth(), getHeight());
     
    		Graphics offGr = offScreenImage.getGraphics();
    		paint(offGr);
    		g.drawImage(offScreenImage, 0, 0, this);		
    	}
     
    	public void actionPerformed(ActionEvent ae) {
    		if (cliqué) {
    			haut.setText("clic pair");
    			cliqué = false;
    		}
    		else {
    			haut.setText("clic impair");
    			cliqué = true;
    		}
    	}
     
    	private Image offScreenImage = null;
    	public JLabel haut;
    	public JButton bouton;
    	private boolean cliqué;
    }
    Lorsque le panneau est repeint en revanche, les bouton et label ne s'ajustent pas... c'est sans doute normal, mais que faut(il faire pour qu'ils s'ajustent eux aussi à la taille de mon panneau ? Quand même pas faire une classe dérivant de JButton et redéfinir la méthode paintComponent(), si ?

    Deuxième question, j'ai souvent des problèmes de clignotement lors d'un rafraichissement de l'affichage. Là, typiquement, quand on clique sur le bouton pour modifier le texte du JLabel, ça clignote. J'ai cherché des trucs, et j'ai vu qu'on pouvait redéfinir la méthode update(Graphics g) qui est appelée avant (je crois) repaint(). Là ça ne marche pas du tout, elle n'est jamais appelée. Donc pourquoi ça clignote et comment l'éviter ?

    Merci d'avance pour vos réponses qui combleront je l'espère mes graaaaves lacunes en Swing

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    utilise un autre LayoutManager. À priori, le GridBagLayout, mais je te souhaite bonne chance pour tout en comprendre ^^

    Sinon, tu peux te rediriger vers d'autres bibliothèques comme le tableLayout, le formLayout, ou que-sais-je.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Citation Envoyé par marc003 Voir le message
    Bonjour,

    Je pense que tu as un conflit entre le BorderLayout et ton SetBound.

    A+
    Oui effectivement, ça me paraît une bonne explication, mais comment faut-il faire alors pour réaliser cette chose toute simple ?
    Je pense que le Layout de la JFrame intervient également, non ?
    Est-ce qu'il ne faut pas le définir à null quand on utilise des setBounds() ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Citation Envoyé par dingoth Voir le message
    utilise un autre LayoutManager. À priori, le GridBagLayout, mais je te souhaite bonne chance pour tout en comprendre ^^

    Sinon, tu peux te rediriger vers d'autres bibliothèques comme le tableLayout, le formLayout, ou que-sais-je.
    Ouais, le GridBagLayout, j'ai déjà donné, et ça m'a un peu gavé
    Je me demandais si on pouvait faire cette chose simplissime en utilisant les Layout de base...
    C'est des bibliothèques de quoi tableLayout et formLayout ? de LayoutManager justement ? C'est inclus dans Swing ou il faut les télécharger qq part ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 73
    Par défaut
    Salut,

    Essaye de t'inspirer du post suivant : http://www.developpez.net/forums/sho...t=layout+ratio

    Il utilise un ratio verticale pour afficher ces différents panels.

    A+

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Merci pour ce lien, Marc, j'ai effectivement jeté un oeil et je suis arrivé à qq chose qui marche (je colle le code ici). Je trouve pas ça hyper propre, et ça peut devenir un peu complexe avec beaucoup de composants...
    Vous en pensez quoi, c'est une bonne méthode ou pas ?

    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
     
    public class TestContPan extends JPanel implements ActionListener {
     
    	public TestContPan() {
    		setBackground(Color.blue);
    		setLayout(new CustomLayout());
    		setBounds(0, 0, 50, 50);
     
    		bouton = new JButton("compte clics");
    		bouton.addActionListener(this);
    		add(bouton);
     
    		haut = new JLabel("clic pair");
    		add(haut);
    	}
     
    	@Override
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		setBounds(0, 0, getParent().getWidth()*50/100, getParent().getHeight());
    		this.getLayout().layoutContainer(this);
    	}	
     
    	public void actionPerformed(ActionEvent ae) {
    		if (cliqué) {
    			haut.setText("clic pair");
    			cliqué = false;
    		}
    		else {
    			haut.setText("clic impair");
    			cliqué = true;
    		}
    	}
     
    	public JLabel haut;
    	public JButton bouton;
    	private boolean cliqué;
    Et puis la redéfinition de layoutContainer() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void layoutContainer(Container managedComp) {
    		// TODO Auto-generated method stub
    		composants = managedComp.getComponents();
     
    		composants[0].setBounds(0, managedComp.getHeight()-20,
    				managedComp.getWidth(),	20);
     
    		composants[1].setBounds(0, 0, managedComp.getWidth(), 20);
    	}
    Le JFrame parent est en setLayout(null) au fait.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 73
    Par défaut
    Bonjour,

    Voici un autre script :
    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
     
    /**
     *
     * @author marc003
     */
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class TestContPan extends JPanel implements ActionListener {
     
    	public TestContPan() {
                    super();
    		setBackground(Color.blue);
    		setLayout(new BorderLayout());
    		setBounds(0, 0, 50,50);
     
    		bouton = new JButton("compte clics");
    		bouton.addActionListener(this);
    		add(bouton,BorderLayout.SOUTH);
     
    		haut = new JLabel("clic pair");
    		add(haut,BorderLayout.WEST);
     
               	JPanel tmp = new JPanel();
    		add(tmp,BorderLayout.EAST);
     
    	}
     
     
    	@Override
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
                    // Redimendionne le composant 1, c'est a dire le Jlabel
                    this.getComponent(1).setBounds(0, 0, getParent().getWidth()*50/100, getParent().getHeight());
                    // Redimendionne le composant 2, c'est a dire le JPanel
                    this.getComponent(2).setBounds(getParent().getWidth()*50/100,0, getParent().getWidth()*50/100+1, getParent().getHeight());
    	}	
     
     
    	public void actionPerformed(ActionEvent ae) {
    		if (cliqué) {
    			haut.setText("clic pair");
    			cliqué = false;
    		}
    		else {
    			haut.setText("clic impair");
    			cliqué = true;
    		}
    	}
     
    	public JLabel haut;
    	public JButton bouton;
    	private boolean cliqué;
     
      /*
      *
      * @param args 
      */
     
            public static void main(String[] args){
                JFrame fen = new JFrame();
                fen.add(new TestContPan());
                fen.setVisible(true);
                fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
     
    }
    Le problème vient du fait que tu veux un panneau dont la largeur fait 50 % de celle de ma JFrame.

    Pour résoudre le problème j'ai due rajouter un Jpanel pour remplir les 50% restant.

    La nature a horreur du vide, et les Layouts aussi.

    A+

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Merci pour ta réponse, mais ton code ne fait pas ce que je veux :
    Il affiche un bouton sur toute la largeur de la JFrame alors que je voulais justement qu'il occupe toute la largeur du panneau de gauche, et pas celle de la JFrame.

    Le code que j'ai posté dans le message précédent fonctionne parfaitement, et EXIT les clignotements, d'ailleurs. Je me demandais si c'était une bonne pratique par contre...?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 73
    Par défaut
    Bonjour Pancake,

    Citation Envoyé par Pancake Voir le message
    Merci pour ta réponse, mais ton code ne fait pas ce que je veux :
    Il affiche un bouton sur toute la largeur de la JFrame alors que je voulais justement qu'il occupe toute la largeur du panneau de gauche, et pas celle de la JFrame.
    ....
    Il te suffit dans ce cas de le redimensionner dans la méthode paint.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	@Override
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
                    // Redimendionne le composant 0, c'est a dire le bouton
                    this.getComponent(0).setSize(getParent().getWidth()*50/100, 25);
                    // Redimendionne le composant 1, c'est a dire le Jlabel
                    this.getComponent(1).setBounds(0, 0, getParent().getWidth()*50/100, getParent().getHeight());
                    // Redimendionne le composant 2, c'est a dire le JPanel
                    this.getComponent(2).setBounds(getParent().getWidth()*50/100,0, getParent().getWidth()*50/100+1, getParent().getHeight());
    	}
    A+

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Effectivement, ça marche bien aussi
    Formellement, c'est la même chose que la méthode avec le LayoutManager, sauf qu'ici tu redimensionnes les composants dans paintComponent() alors que dans l'autre méthode, tu appelles le layoutManager depuis paintComponent pour les redimensionner. Il y a seulement le JPanel "bouche-trou" à gérer en moins.
    C'est quand même bon à savoir qu'on peut s'en tirer avec un BorderLayout()

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 73
    Par défaut
    Citation Envoyé par Pancake Voir le message
    ....
    C'est quand même bon à savoir qu'on peut s'en tirer avec un BorderLayout()
    Je pense que l'on peut utiliser d'autres Layouts, pour s'affranchir du problème du panel supplémentaire, mais la, je ne maitrise pas.

    A+

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    oO

    Tout ça pour ça ?

    Un gridbagLayout ou un tablelayout aurait fait ça en 2 secs...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Par défaut
    Citation Envoyé par dingoth Voir le message
    oO

    Tout ça pour ça ?

    Un gridbagLayout ou un tablelayout aurait fait ça en 2 secs...
    Oui, tout ça pour ça, le problème présenté est volontairement simplissime, mais le but est justement d'avoir un truc propre pour pouvoir l'adapter à des choses plus complexes.

    Est-ce que c'est vraiment plus simple d'utiliser le GridBagLayout que de faire son propre layout ? Dès que j'ai essayé de m'en servir pour faire des trucs compliqués, c'était du grand n'importe quoi, probablement parce que je n'ai pas compris la subtilité de la concurrence poids / taille. Si quelqu'un peut m'expliquer, je suis preneur.

    Sinon, j'ai actuellement des problèmes de panneaux qui disparaissent que je "démaximise" une fenêtre, mais bon, ça fera l'objet d'une autre discussion

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

Discussions similaires

  1. [Débutant] Comment faire un bouton qui clignote sur vb
    Par didyfatima dans le forum VB.NET
    Réponses: 3
    Dernier message: 23/09/2011, 12h37
  2. Bloc CSS qui dépasse...
    Par Silent dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/05/2005, 11h44
  3. Réponses: 10
    Dernier message: 10/06/2004, 17h20
  4. Réponses: 2
    Dernier message: 26/09/2003, 17h49

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