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.