Bonjour,
Ma question est dans le titre : comment mettre une case à cocher (JCheckBox) dans un TitledBorder ? Ou d'une manière plus générale, comment remplacer le String par un JComponent ?
Merci.
Version imprimable
Bonjour,
Ma question est dans le titre : comment mettre une case à cocher (JCheckBox) dans un TitledBorder ? Ou d'une manière plus générale, comment remplacer le String par un JComponent ?
Merci.
Voici un embryon de réponse. A toi de le rendre un peu plus générique notamment sur la taille du composant.
Je vais pas tout faire quand même :wink:
Code:
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 public class CustomTitledBorder extends TitledBorder { private JComponent component = null; public CustomTitledBorder(JComponent c_arg) { super(""); component = c_arg; component.setSize(50,10); component.setOpaque(true); } public void paintBorder(Component arg0, Graphics arg1, int x, int y, int w, int h) { super.paintBorder(arg0, arg1, x , y + (component.getSize().height / 2), w, h - component.getSize().height); component.setLocation(0, 0); component.paint(arg1); } }
OK, le principe est d'étendre un TitledBorder avec une chaîne vide (de la bonne longueur) et de dessiner par dessus mon composant. Je vois l'astuce, merci ! :D
Bon, en fait, c'est un peu plus compliqué que ça. Après quelques adaptations, le visuel rend bien comme je veux, mais la checkBox n'a aucun comportement. Donc j'aimerai abonner ma checkBox aux évènements calvier/souris de Swing, mais voilà, une JCheckBox (ou plus généralement un JComponent) n'est pas un MouseListener, KeyListener etc...
Comment ça se passe dans un JPanel quand on ajoute un JComponent ? Parcequ'il s'occupe bien d'abonner ses "composants internes" aux différents évènements ? Alors comment fait-il puisqu'un JComponent n'est pas un EventListener ? L'idéal serait de "copier" ce que fait un JPanel dans le "CustomTitledBorder", si c'est possible car un TitledBorder n'est pas un JComponent (oui, faut suivre !!!! :D ).
Pfou, c'est le bordel tout ça !! :) Mais je dois pas être le premier à vouloir faire ça ??
En fait je viens de refaire mon test et tu as raison ... :cry:
MAIS :lol: J'ai ajoute le composant aussi au panel qui à la bordure et là ça marche.
Code:
1
2
3
4
5
6
7
8
9
10 JPanel pane = new JPanel(); JCheckBox chk = new JCheckBox("Test"); pane.setBorder(new CustomTitledBorder(chk)); pane.add(chk); getContentPane().add(pane); // En reaffectant un layout ta checkBox n'est plus gérer en terme de taille et de positionnement > il disparait graphiquement du panel // Mais le panel gére toujours son affichage // Dans CustomTitledBorder si tu enlève paintComponent sa marche toujours, il faut juste continuer à gérer sa taille et son positionnement pane.setLayout(new GridBagLayout());
Je sais on dirait du bricolage mais j'ai pas mieux et ça marche !
Bon, moi, la bidouille marche pas trop car mon JPanel est géré par un GridBagLayout avec plein de contraintes de partout, et ma checkBox est toujours afichée (un peu n'importe où)...
Mais j'ai trouvé une autre bidouille qui semble bien marcher. En fait, j'ajoute la JCheckBox au JPanel, je lui laisse tout gérer (évènements + affichage), et je change juste ma checkBox de place quand je dessine la bordure (je la dessine même pas !!). Bon, ça reste du bidouillage quand même !!
Pour ceux que ça intéresse, voici le code que j'obtiens finalement :
En tout cas, merci JWillow pour ton aide !!! :wink:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public class CustomTitledBorder extends TitledBorder { private JComponent internalComponent = null; public CustomTitledBorder(JComponent component, JComponent parentComponent) { super(" "); internalComponent = component; internalComponent.setSize(internalComponent.getPreferredSize()); parentComponent.add(internalComponent); } public void paintBorder(Component component, Graphics g, int x, int y, int w, int h) { super.paintBorder(component, g, x, y, w, h); internalComponent.setLocation(10, -1); } }