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 :

Problème de dessins de boutons


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut Problème de dessins de boutons
    Bonjour,



    Mon problème est simple et tordu. Je redéfinis la méthode paintComponent d'un JButton mais je ne redéfinis pas tout l'intérieur du bouton:

    J'ai une petite appli qui au final doit disposer d'un fond personnalisable (dans l'exemple bleu uni, dans l'absolu, une photo ou une texture) et sur laquelle se trouve des boutons qui ont une image en leur centre (dans l'exemple, un carré rouge).

    J'ai un problème avec le dessin des boutons. Je ne dessine pas sur tout la surface des boutons mais juste là ou j'ai besoin d'afficher une image pour avoir une "transparence". Le centre possède l'image, je peux par exemple entourer cette image de plusieurs couleurs différentes pour mettre en valeur le bouton, et sinon la marge reste non peinte.

    Maintenant y a visiblement des problèmes de dessins, et je ne vois pas d'où ca vient. Lorsqu'on survole le bouton, son "image" est corrompue par le contenu d'un autre panel, ici le bloc rouge au dessus. Dans mon cas, c'est plus exactement la barre de menu par exemple.



    après survol des boutons:



    Je vous mets donc à disposition une classe rudimentaire, très moche au niveau de code, mais qui illustre le problème:

    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Toolkit;
     
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class Test extends JFrame{
     
        public Test() {
            super("test");
            this.setLayout(new BorderLayout());
            JPanel panel = new JPanel() {
                public void paintComponent(Graphics g) {
                    g.setColor(Color.BLUE);
                    g.fillRect(0, 0, 1600, 1200);
                }
            };
            add(panel);
            JPanel panelbis = new JPanel() {
                public void paintComponent(Graphics g) {
                    g.setColor(Color.RED);
                    g.fillRect(0, 0, 1600, 1200);
                }
            };
            add(panelbis,BorderLayout.NORTH);
            setPreferredSize(new Dimension(640,480));
            panel.setLayout(new FlowLayout());
     
            JButton button1 = new JButton("toto") {
                public void paintComponent(Graphics g) {
                    g.setColor(Color.RED);
                    g.fillRect(10, 10, 50, 60);
                }
            };
            button1.setPreferredSize(new Dimension(70,80));
            button1.setFocusable(false);
            button1.setBorderPainted(false);
            panel.add(button1);
     
            JButton button2 = new JButton("toto") {
                public void paintComponent(Graphics g) {
                    g.setColor(Color.YELLOW);
                    g.fillRect(10, 10, 50, 60);
                }
            };
            button2.setPreferredSize(new Dimension(70,80));
            button2.setFocusable(false);
            button2.setBorderPainted(false);
            panel.add(button2);
     
            pack();
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            (new Test()).setVisible(true);
     
        }
     
    }
    Merci d'avance si vous etes en mesure de me dépanner

    edit: désolé pas dans la sous catégorie, j'ai mis un tag en attendant

  2. #2
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Tu souhaite manifestement jouer avec un effet de transparence. As-tu essayé avec une instruction du type setOpaque(false)

    du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
             JButton button2 = new JButton("toto") {
                public void paintComponent(Graphics g) {
                    setOpaque(false);
                    g.setColor(Color.YELLOW);
                    g.fillRect(10, 10, 50, 60);
                }
            };
    Chris

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2
    Par défaut Réinitialiser le reste du bouton
    Le problème est que tu ne réinitialise pas le reste de ton bouton alorsque la méthode paintComponent est appelée.

    Avant de réinitiliser ex :

    g.setColor(Color.RED);
    g.fillRect(0, 0, 1600, 1200);

    fait un this.repaint(); afin de réinitialiser tout le bouton.

  4. #4
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut
    Je cherchais désespérément le problème au niveau de mon bouton, il ne m'était même pas venu à l'esprit que ca pouvait tout simplement être le fond en cause

    en effet le rajout du repaint résoud mon problème dans l'exemple donné. Je vérifierai ce soir si c'est le cas aussi dans mon appli, en attendant merci beaucoup à vous deux.

    Je mets donc un p'tit résolu

  5. #5
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut
    Nouveau problème lié à la correction

    j'ai rajouté le fameux repaint à la méthode paintComponent de mon JPanel servant de fond. Ca c'est très bien, maintenant les boutons sont correctements inserés et il n'y a plus de bordure bizarre.

    Cependant si la fenetre, qui est une JFrame, perd le focus et le regagne, en particulier si une autre fenetre est déplacée devant ou si elle est recouverte totalement, la zone recouverte n'est absolument pas rafraichie en dehors de ce JPanel de fond.

    En gros Jpanel et icones sont affichés correctement. Mais le menu, barre d'état et autres ne sont absolument pas redessiné. Si je vire le repaint, tout refonctionne correctement, mais je perds alors le bénéfice de la correction suggérée

    Une idée ?


    edit: en fait je dirais même plus, le fait de rajouter le repaint provoque une consommation cpu plus qu'excessive

  6. #6
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut
    Problème résolu, j'ai rajouté un appel à super.paintComponent pour le panel, et un setOpaque(false) pour le bouton, sinon évidemment il est considéré comme plein et les éléments derrières ne sont pas rafraichis

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/06/2006, 17h00
  2. [access 2003]Problème avec argument de bouton?
    Par steeves5 dans le forum Access
    Réponses: 2
    Dernier message: 30/05/2006, 16h45
  3. [C#]Problème sur composant perso (Bouton Transparent)
    Par SLE dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/10/2005, 00h12
  4. [CSS]problème centrage texte de bouton dans une boîte
    Par Aurelius dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 06/09/2005, 16h01
  5. [FLASH MX2004] Problème pour faire un bouton play
    Par melanie075 dans le forum Flash
    Réponses: 13
    Dernier message: 16/12/2004, 22h55

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