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

Composants Java Discussion :

JButton add JLabel


Sujet :

Composants Java

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut JButton add JLabel
    Bonjour à tous!

    J'ai un bouton dans lequel je veux pouvoir ajouter x JLabel pour avoir un affichage sur plusieurs lignes.

    Ca, je sais le faire. Le problème c'est que pour les besoins de mon projet j'ai dû surdéfinir la méthode paintComponent de mon JButton et depuis là mes labels ne s'affichent plus.

    Une idée?

    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
    public class MonBouton extends JButton {
    	private static final long serialVersionUID = 1L;
    	private String texte = "";
    	private Font font = new Font("Dialog", 0, 15);
     
    	public MonBouton(){
    		this("");
    	}
     
    	public MonBouton(String text){
    		this.texte = text;
     
    		if(texte.contains("<br>")){
    			setText("");
    		    setLayout(new GridLayout(0, 1));
     
    		    String[] st = texte.split("<br>");
     
    		    for (int i=0;i<st.length;i++) {
    		    	String s = st[i];
     
    		    	//temporaire, j'enlèverai ca après
    		    	s = s.replaceAll("<html>", "");
    		    	s = s.replaceAll("</html>", "");
    		    	s = s.replaceAll("<center>", "");
     
    		    	JLabel lbl = new JLabel(s, JLabel.CENTER);
    		    	System.out.println("s" + s);  //ca c'est ok
    			    lbl.setBorder(BorderFactory.createLineBorder(Color.pink));
    		    	add(lbl);
    			}
    		}else{
    			setText(text);
    		}
    		setFont(font);
    	    setFocusable(false);
            setContentAreaFilled(false);
    		setPreferredSize(new Dimension(100, 65));
    	}
     
    	public void paintComponent(Graphics g) {
    		//dans le cas ou le bouton a une icone
    		if(getIcon() != null){
    			String icnPath = getIcon().toString();
    			String debut = icnPath.substring(0, icnPath.length() - 4);
    			String ext = icnPath.substring(icnPath.length() - 4, icnPath.length());
    			String newPath = debut + Global.IMG_PRESSED + ext;
     
    			ImageIcon icn = new ImageIcon(newPath);
     
    			if(getModel().isPressed()){
    				if(icn.getIconWidth() > 0){
    					setIcon(icn);
    				}
    			}else{
    				icn = new ImageIcon(newPath.replace(Global.IMG_PRESSED, ""));
    				if(icn.getIconWidth() > 0){
    					setIcon(icn);
    				}
    			}
     
    			setBorder(null);
    			super.paintComponent(g);
    		}else{
    			Graphics2D g2 = (Graphics2D) g;
     
    			//couleur lors du clic
    	        if(getModel().isPressed()){
    	        	if(texte.contains("Abandon")){
    	        		g.setColor(Color.red.darker());
    		        }else if(texte.contains("Total")){
    	        		g.setColor(new Color(0,148,0));
    	        	}else{
    	        		g.setColor(new Color(153, 153, 153));
    	        	}
    	        }
    	        //couleur en fonctionnement normal
    	        else{
    	        	Color color1;
    	        	Color color2;
    	        	if(texte.contains("Abandon")){
    	        		g.setColor(Color.red);
    	        	}else if(texte.contains("Total")){
    	        		g.setColor(new Color(144,238,144));
    	        	}else{
    	        		color1 = new Color(242, 242, 242);
    	        		color2 = new Color(150, 150, 150);
    	        		g2.setPaint((Paint) new GradientPaint(0, 0, color1, 0, this.getHeight(), color2));
    	        	}
    	        }
     
    	        //tracement du cadre
    	        g2.fillRect(3, 3, getWidth() - 6, getHeight() - 6);
    	        super.paintComponent(g);
    	        //couleur du cadre
    	        g2.setColor(Color.black);
    	        //arrondi des angles du cadre
    	        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    		    //taille du cadre
    	        g2.setStroke(new BasicStroke(1.5f));
    	    	g2.draw(new RoundRectangle2D.Double(1, 1, (getWidth() - 3), (getHeight() - 3), 12, 8));
    	        g2.drawLine(4, getHeight() - 3, getWidth() - 4, getHeight() - 3);
    	        g2.dispose();
    		}
        }
    }
    Et si j'enlève mon paintComponent, tout fonctionne bien!?!

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Personne n'a d'idée?

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Toujours rien?

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Apparemment c'est plus compliqué que ca en a l'air... personne n'a d'idée?

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    Bonjour,

    je ne comprends pas pourquoi tu as placé des JLabel dans ton bouton Ce composant gère très bien la syntaxe HTML :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JButton bouton = new JButton();
    bouton.setText("<html>Bonjour<br>tout le monde</html>");

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Pardon je n'avais pas vu la réponse!

    Je sais que le composant gère le html, je l'ai déjà fait, mais ca ne convient pas complètement.

    Le problème est que certaines fois au refresh de l'écran, ou quand on passe d'un écran à un autre, mon bouton prend parfois une alure bizarre avec tout d'un coup le html qui prend une police de 30 au lieu de 14 normal, ce qui fait un texte immense et affiché à moitié et je n'arrive pas à trouver un moyen de corriger ca.

    J'ai vraiment besoin de trouver une solution à ca car c'est très gênant

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Aucune idée? SVP c'est vraiment important

  8. #8
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    à mon avis tu dois avoir un paintComponent sur ce bouton qui est complètement inutile. D'ailleurs à quoi sert-il dans ce cas ?

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ton paintComponent est complètement tordu et fait beaucoup de choses diverses qui n'ont pas à être là:

    1) ça appelle dispose sur le graphics -> Tu n'es pas censé toucher à ce graphics, tous les composants utilisent le même!! Résultat indéterminé
    2) ça change l'icone / le border -> tu ne devrais pas changer l'état de ton composant dans paintComponent. Changer l'état va entrainer un deuxième appel à paintComponent, qui changera l'état qui .... tu va passer ton temps à dessiner, bonjour le CPU
    3) tu dessine à la manu un Cadre -> C'est le boulot du border. Si tu veux une bordure particulière sur ton Bouton, utilise setBorder
    4) Dans certains cas, il me semble, il n'y a pas d'appeler à super.paintComponent. Mais je peux me tromper, vu que l'indentation va dans tous les sens.


    Et plus, je ne suis pas sur que JButton se comporte normalement quand on lui adjoint du contenu ^^

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    en fait ce paintcomposant je l'ai pompé sur internet vu que je n'arrivais pas à le faire

    A propos du cadre, border ne me le dessine pas comme je le souhaite, d'ou le dessin à la mano... mais voilà

    Mais si qqun peut m'aider SVP

    en gros ce que je dois faire c'est un bouton de 100x65 avec un dégradé de gris et un cadre arrondi.

    Le bouton doit pouvoir contenir du texte sur 2 lignes et selon le texte affiché (abandon, total), le bouton doit changer de couleur (rouge ou vert).

    pleeeeeaaaase je m'en sors vraiment pas avec ca

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    de 100x65:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    button.setMinimumSize(new Dimension(100,65));
    button.setPreferredSize(new Dimension(100,65));
    button.setMaximumSize(new Dimension(100,65));
    Tout simplement


    "avec un dégradé de gris"

    Surcharger paintComponent() et y mettre le code de dégradé, avant d'appeler super.paintComponent() pour qu'il affiche le texte au dessus

    "un cadre arrondi."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Border border = BorderFactory.createLineBorder(Color.RED, 1, true);
    			setBorder(border);
    "Le bouton doit pouvoir contenir du texte sur 2 lignes"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    button.setText("<html>Hello<br/>World</html>");

    " le bouton doit changer de couleur (rouge ou vert)"
    Surcharger setText() pour changer la bordure en fonction du texte.

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Malheureusement c'est pas aussi simple que ca!

    Voilà un exemple de bouton que je dois obtenir.

    Je dois avoir un cadre arrondi autour du bouton, qui est lui meme rempli de mon dégradé de gris, d'ou le RoundRectangle2D...

    Trop compliqué pour moi ca!
    Images attachées Images attachées  

  13. #13
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    Pour le dégradé essaye le code proposé ici :
    http://www.developpez.net/forums/d52...rvant-degrade/

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Yes mais ca je l'ai déjà

  15. #15
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    Essaye 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public class monBouton extends JButton
    {
        public monBouton()
        {
            setMinimumSize(new Dimension(100,65));
            setPreferredSize(new Dimension(100,65));
            setMaximumSize(new Dimension(100,65));
     
            Border border = BorderFactory.createLineBorder(Color.GRAY, 2, true);
            setBorder(border);  
            setText("<html>Autres<br/>saisies</html>");   
            setContentAreaFilled(false);
        }
     
     
        @Override
        protected void paintComponent(Graphics g)
        {
            Graphics2D g2 = (Graphics2D)g.create();
            g2.setPaint(new GradientPaint(
                    new Point(0, 0), 
                    Color.GRAY.brighter(), 
                    new Point(0, getHeight()), 
                    Color.GRAY.darker()));
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.dispose();
     
            super.paintComponent(g);       
        }
     
    }

  16. #16
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Pas mal mais c'est pas complètement ce qu'il me faut. Voici une image de ce que ca donne.

    Moi il me faudrait la cadre arrondi comme sur la première image que j'ai mise.

    Désolé on le voit pas très bien mais ici le bouton a des bords carrés alors que j'aimerai les avoir arrondis.

    Merci en tout cas
    Images attachées Images attachées  

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Vu que tu veux un contrôle total sur l'apparence de ton bouton, il est préférable que tu t'oriente vers un look and feel plutot que de faire un JButton custom. Pour ce faire, il y a une liste de look and feels, pas tout à fait à jour ici
    http://www.java2s.com/Product/Java/S...d-Feel-LaF.htm



    Je crois que le look and feel nimrod répond à tes attentes (affichage en dégradé, bord arrondis, ...)

  18. #18
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 51
    Points
    51
    Par défaut
    Yes merci je vais regarder ca de plus près

Discussions similaires

  1. JButton maintenu et affichage JLabel
    Par inferno dans le forum Interfaces Graphiques en Java
    Réponses: 10
    Dernier message: 21/02/2013, 15h41
  2. Ajout d'un JLabel via JButton
    Par Raikyn dans le forum Débuter
    Réponses: 2
    Dernier message: 22/12/2012, 14h28
  3. JButton qui met à jour un JLabel, possible ?
    Par nikwik dans le forum Débuter
    Réponses: 4
    Dernier message: 15/01/2011, 13h30
  4. Message dans un JLabel au passage de la souris sur un JButton
    Par thunderfear dans le forum Composants
    Réponses: 1
    Dernier message: 11/06/2010, 18h33
  5. Pb JButton dans un JLabel
    Par Ecco59 dans le forum Composants
    Réponses: 8
    Dernier message: 02/12/2005, 19h09

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