Bonjour,
Je cherche actuellement comment réaliser une petite manipulation avec Java2D.
En gros, je souhaite afficher dans un JPanel (ou tout autre surface de dessin) plusieurs "post-its". Ces post-its sont en réalité des JList qui ont pour image de fond une image de post-it. (L'idée étant de pouvoir sélectionner plusieurs éléments sur chaque post-it).
Malheureusement, je n'arrive pas à afficher correctement les JList. Ils ne s'affichent dans le JPanel que si je choisi de les "add" pendant le paintComponent() du panel, mais n'importe quel appel aux fonctions de paint des JList ne peint au mieux que le fond.
Cependant, je ne suis pas très intéressé pour add les JList à mon panel, puisque je n'ai alors aucun contrôle sur l'emplacement où ils apparaissent. Et si plus tard je souhaite les déplacer sur mon panel suivant la souris, c'est coincé.
J'aimerai plutôt réussir à peindre l'image de fond et le composant JList associé, tout en gardant la possibilité de modifier ce composant à volonté (sélection de ligne, etc).
J'ai testé à peu près toutes les possibilités de super.paint(g), super.paintComponent(g) ... à tous les endroits possibles.
Pour simplifier, voici mon code pour le DrawingPane (l'ensemble des post-its est contenu dans un ArrayList postitsList, rempli lors de l'exécution du programme) :
Et le code des Post its :
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 public class DrawingPane extends JPanel { @Override protected void paintComponent(Graphics g) { g.setColor(Color.WHITE); g.fillRect(2, 2, 470, 442); for(int i = 0; i < postitsList.size(); i++) { Postit p = postitsList.get(i); p.setX(i*150); p.setY(0); Kitman.setHeight(p, 150); //méthodes de dimensionnement Kitman.setWidth(p, 150); p.setBorder(BorderFactory.createLineBorder(Color.black)); //pour visualiser les contours p.setCellRenderer(new MyCellRenderer()); //pour rendre le fond des cellules opaques p.setOpaque(false); p.draw(g); //d'après les cours développez.net; pour l'instant ça n'affiche que l'image de fond //this.add(p); //ce que je ne veux pas utiliser, car add manque de controle à mon goût } this.revalidate(); g.setColor(Color.BLACK); g.drawRect(2, 2, 469, 441); } }
Merci énormément aux personnes qui prendront un peu de temps pour m'aiguiller ! Si quelque chose n'est pas clair, dites le moi.
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 public class Postit extends JList { BufferedImage image = null; int w = 150; int h = 150; int x = 0; int y = 0; public void draw(Graphics g) { super.paintComponent(g); g.drawImage(image, x, y, w, h, null); } //avec ou sans ... ça ne change rien @Override protected void paintComponent(Graphics g) { super.paintComponent(g); } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } public int getX() { return this.x; } public int getY() { return this.y; } public Postit(String[] data) { super(data); //création de l'image de fond URL imageURL = Kitman.class.getResource("images/postit.png"); BufferedImage im = null; try { im = ImageIO.read(imageURL); } catch (IOException e) { System.out.println("Impossible d'ouvrir l'image du post it."); } //Calcul de la taille finale w = im.getWidth(null); h = im.getHeight(null); image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = image.createGraphics(); double rotation = (double)(Math.random() * 10) - 5 ; g2d.rotate(rotation/180); g2d.drawImage(im, 0, 0, w, h, 0, 0, w, h, null); } }
Partager