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 :

CheckBoxTitledBorder et GridLayout


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de BakaOnigiri
    Inscrit en
    Avril 2002
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 366
    Par défaut CheckBoxTitledBorder et GridLayout
    Bonjour,

    j'ai cherché à modifier une bordure (pour un JPanel) afin d'avoir un JCheckBox à la place d'un label, en cherchant sur le net je suis tombé sur ce code (que j'ai un peut modifier, pour permettre l'ajout de stateChanged(...) pour pouvoir palier à un problème de rafraichissement du checkbox lorsqu'il est modifier par le code)

    Donc voici la nouvelle classe de bordure :

    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    public class CheckBoxTitledBorder implements Border, MouseListener, ChangeListener, SwingConstants, Serializable
    {
        private int offset = 5;
     
        private JCheckBox comp = null;
        private JComponent container = null;
        private Rectangle rect = null;
        private Border border = null;
     
        public CheckBoxTitledBorder(JCheckBox comp, JComponent container, Border border)
        {
            this.comp = comp;
            this.container = container;
            this.border = border;
            this.container.addMouseListener(this);
            this.comp.addChangeListener(this);
        }
     
        @Override
        public boolean isBorderOpaque()
        {
            return true;
        }
     
        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
        {
            Insets borderInsets = border.getBorderInsets(c);
            Insets insets = getBorderInsets(c);
            int temp = (insets.top-borderInsets.top)/2;
            border.paintBorder(c, g, x, y+temp, width, height-temp);
            Dimension size = comp.getPreferredSize();
            rect = new Rectangle(offset, 0, size.width, size.height);
            SwingUtilities.paintComponent(g, comp, (Container)c, rect);
        }
     
        @Override
        public Insets getBorderInsets(Component c)
        {
            Dimension size = comp.getPreferredSize();
            Insets insets = border.getBorderInsets(c);
            insets.top = Math.max(insets.top, size.height);
            return insets;
        }
     
        private void dispatchEvent(MouseEvent me)
        {
            if(rect != null && rect.contains(me.getX(), me.getY()))
            {
                Point pt = me.getPoint();
                pt.translate(-offset, 0);
                comp.setBounds(rect);
                comp.dispatchEvent(new MouseEvent(comp, me.getID(), me.getWhen(), me.getModifiers(), pt.x, pt.y, me.getClickCount(), me.isPopupTrigger(), me.getButton()));
     
            }
     
            comp.repaint();
            container.repaint();
        }
     
        @Override
        public void mouseClicked(MouseEvent me)
        {
            dispatchEvent(me);
        }
     
        @Override
        public void mouseEntered(MouseEvent me)
        {
            dispatchEvent(me);
        }
     
        @Override
        public void mouseExited(MouseEvent me)
        {
            dispatchEvent(me);
        }
     
        @Override
        public void mousePressed(MouseEvent me)
        {
            dispatchEvent(me);
        }
     
        @Override
        public void mouseReleased(MouseEvent me)
        {
            dispatchEvent(me);
        }
     
        public Border getBorder()
        {
            return border;
        }
     
        public void setBorder(Border border)
        {
            this.border = border;
        }
     
        public Component getComp()
        {
            return comp;
        }
     
        public void setComp(JCheckBox comp)
        {
            this.comp = comp;
        }
     
        public JComponent getContainer()
        {
            return container;
        }
     
        public void setContainer(JComponent container)
        {
            this.container = container;
            this.container.addMouseListener(this);
        }
     
        public int getOffset()
        {
            return offset;
        }
     
        public void setOffset(int offset)
        {
            this.offset = offset;
        }
     
        @Override
        public void stateChanged(ChangeEvent e)
        {
            comp.repaint();
            container.repaint();
        }
    }
    J'utilise donc cette bordure comme çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CheckBoxTitledBorder componentTitledBorder_TousPaff = new CheckBoxTitledBorder(jCheckBox_TousPaff, jPanel_TousPaff, BorderFactory.createEtchedBorder());
    jPanel_TousPaff.setBorder(componentTitledBorder_TousPaff);
    Le truc c'est que mon JPanel (jPanel_TousPaff) utilise un GridLayout, et l'utilisation de la classe CheckBoxTitledBorder semble me rajout une colonne dans le GridLayout, c'est un peut embétant.

    Exemple avec le 'bug' (le jaune est là pour voir s'il n'y avais pas un composant de rajouté et invisible ) :



    Exemple sans utiliser CheckBoxTitledBorder :



    Voilà, auriez-vous une idée du problème ? je pense que çà doit venir des différentes méthodes de calcul dans CheckBoxTitledBorder, mais je ne sais pas quoi changer.

    Merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Par défaut
    Bonjour,

    Ton problème est en effet assez vicieux .

    En fait, la méthode paintComponent de SwingUtilities ajoute le Component au Container que tu passes en argument si ce n'est pas son père.

    Donc, dans ton cas, la JCheckBox est ajouté à ton JPanel, donc il se retrouve avec 2 éléments (ton JButton et ta JCheckBox) au moment du repaint.

    Pour corriger le problème, j'ai ajouté à ton CheckBoxTitledBorder un attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      private JPanel uselessPanel = new JPanel();
    Ensuite, dans ta méthode paintBorder, tu changes l'appel à paintComponent de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      SwingUtilities.paintComponent(g, comp, uselessPanel, rect);
    Si quelqu'un trouve plus propre, je suis preneur aussi

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

Discussions similaires

  1. [swing] disposition des éléments dans un GridLayout
    Par al85 dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 11/02/2005, 17h36
  2. Taille d'un GridLayout
    Par Pfeffer dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 03/01/2005, 10h30
  3. Gridlayout
    Par TheSeb dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 06/12/2004, 20h16
  4. [debutant] probleme de GridLayout
    Par wkd dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 30/05/2004, 14h33
  5. [GridLayout][GridData]
    Par Stessy dans le forum SWT/JFace
    Réponses: 13
    Dernier message: 06/08/2003, 16h22

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