Et ma solution de layout ne te conviens pas?
Et ma solution de layout ne te conviens pas?
j'ai beau l'avoir regardée , et essayée, je pige pas le principe de la chose :s
Bon, ok, je t'ai fait une base, et je pense que ça peut fonctionner.
Voilà un exemple de Layout, au final, ça ressemble pas mal au gridLayout, mais ça dois te montrer comment adapter:
Et pour un exemple d'utilisation:
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 public class LM implements LayoutManager { private HashMap coord; private int larg; private int haut; private int sizeMin; public LM(int larg, int haut, int sizeMin) { coord = new HashMap(); this.larg = larg; // nombre de cases en largeur this.haut = haut; // nombre de cases en hauteur this.sizeMin = sizeMin; // coté minimum d'une case (cases carrée pour l'exemple) } public void addLayoutComponent(String arg0, Component arg1) { // Enregistrement des coordonnées du composant Integer i = new Integer(Integer.parseInt(arg0)); coord.put(arg1, i); } public void layoutContainer(Container arg0) { // Placement des composants un par un for (int i = 0; i < arg0.getComponentCount(); i++) { Component c = arg0.getComponent(i); int j = ((Integer)coord.get(c)).intValue(); int x = j % larg; int y = j / larg; int s = arg0.getHeight()/haut; s = Math.min(s, arg0.getWidth()/larg); c.setSize(s, s); c.setLocation(x*s, y*s); } } public Dimension minimumLayoutSize(Container arg0) { return new Dimension(sizeMin*larg,sizeMin*haut); } public Dimension preferredLayoutSize(Container arg0) { return new Dimension(sizeMin*larg,sizeMin*haut); } public void removeLayoutComponent(Component arg0) { } }
J'ai fait ça vite, mais pour ton truc, l'argument dans le add serait un objet contenant les coordonnées du coin supérieur gauche je pense.
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 public Test() { f = new JFrame(); fond = new JPanel(new LM(5,5,100)); f.getContentPane().add(new JScrollPane(fond)); JPanel p = new JPanel(); p.setBackground(Color.RED); fond.add(p, "2"); p = new JPanel(); p.setBackground(Color.GREEN); fond.add(p, "6"); JButton plus = new JButton("Zoom +"); plus.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { fond.setVisible(false); Dimension dim = fond.getPreferredSize(); fond.setPreferredSize(new Dimension(dim.width*2, dim.height*2)); fond.setVisible(true); }}); f.getContentPane().add(plus, BorderLayout.NORTH); f.pack(); f.setLocationRelativeTo(f.getParent()); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
Il est évident qu'il faudrait aussi remplir la méthode removeLayoutComponent, mais c'est juste pour l'exemple.
Hésite pas à demander plus de précision si c'est pas assez clair
Waw , super, je me jette là dedans de suite!
Un grand merci d avance
Dans le constructeur de LM tu spécifies nb cases hauteur/largeur ... mais le probleme c est que je peux mettre les images n'importe où ... donc le principe de case n'est pas vraiment approprié, si?
Non, bien sûr, j'ai pris l'exemple de cases pour faire un truc simple.
Comme je l'ai déjà suggéré, tu as intérêt à travailler avec les coordonnées dans le panel à l'échelle 1.
Après, c'est ton layout qui fera les calculs en fonction de ces coordonnées de référence et la taille du zoom.
mmm ... bon je continue a regarder cette histoire mystique
J'ai essayer pour tester , d adapter ton code au mien. Ajout de deux items ds le menu principal pour zoomIn et zoomOut (*2 ou /2 selon).
Et j'ajoute mes objets, qui sont des JPanel. He bien lorsque je zoom celui ci disparait ... mystique ...
bon si j ai question plus précise j hesiterai pas
Bon bhein je paste du code car je pige pas le comment du pourquoi, meme chose qu' avant ...
Dans un premier temps, le code du JPanel dans lequel viendra se dropper les images (classe Materiel)
Comme tu peux le voir, j' y ai intégré ton JPanel ROUGE pour tester le zoom, qui fonctionne très bien.
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 public class Tableau extends JPanel implements SimulatorListener { private Vector<Materiel> vecteur = new Vector(); private Materiel enCours; private static Tableau tableau = null; private Principal source; private Point droppedPoint; /** Creates a new instance of Tableau */ public Tableau(Principal source) { super (new LayoutZoom(5,5,100)); this.source = source; JPanel p = new JPanel(); p.setBackground(Color.RED); this.add(p, "2"); source.addListener(this); } public void zoomIn () { setVisible(false); Dimension dim = getPreferredSize(); setPreferredSize(new Dimension(dim.width*2, dim.height*2)); setVisible(true); } public void zoomOut () { setVisible(false); Dimension dim = getPreferredSize(); setPreferredSize(new Dimension(dim.width/2, dim.height/2)); setVisible(true); } public void stateChanged(ChangeEvent e) { this.repaint(); } public void ajoutMateriel (Materiel m) { m.setBackground(null); //m.setBounds(new Rectangle(m.getPosition(), m.getDimension())); this.add(m, "2"); source.stateChanged(); } public static Tableau initTableau(Principal source) { if (tableau==null) tableau = new Tableau (source); return tableau; } public static Tableau getInstance () { return tableau; } }
Maintenant la classe Materiel (classe Mere d'autres classes qui sont en fait les objets. Un exemple: Materiel brol = new Rita(); Rita ayant une image qui lui est propre)
Je suis d'accord que bcp de code là dedans n est pas utile, mais ca me semble mieux de paster tout.
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 public abstract class Materiel extends JPanel implements ActionListener { private Point position; private int width; private int height; private JPopupMenu monPopup; private JMenu liaison; private JMenuItem delete; private JMenuItem proprietes; private static int cpt = 0; private int id; private String label; /** Creates a new instance of Dessin */ public Materiel(String image) { cpt++; id = cpt; label = "RITA_"+id; ImageIcon img = new ImageIcon(image); width = img.getIconWidth()+5; height = img.getIconHeight()+5; this.add(new JLabel(img)); position = new Point(0,0); this.creerPopup(); } public Object clone() { cpt++; this.id = cpt; try { Materiel s = (Materiel) super.clone(); return s; } catch (CloneNotSupportedException e) { return this; } } public boolean equals(Object o) { return (this.id == ((Materiel)o).id); } public Point getPosition() { return position; } public int getId() { return this.id; } public String getLabel() { return this.label; } public void setPosition(Point point) { position = new Point ((point.x)-(getWidth()/2), (point.y)-(getHeight()/2)); this.setBounds(position.x, position.y, getWidth(), getHeight()); } public Dimension getDimension() { return new Dimension (width, height); } private void creerPopup() { monPopup = new JPopupMenu (); liaison = new JMenu("liaison to"); delete = new JMenuItem ("delete"); delete.addActionListener (this); proprietes = new JMenuItem ("properties"); proprietes.addActionListener (this); monPopup.add(liaison); monPopup.add(delete); monPopup.add(proprietes); } public void showPopup () { monPopup.show(this, getWidth()/2, getHeight()/2); } public void actionPerformed(ActionEvent e) { if (e.getSource() == this.delete) { int reponse = JOptionPane.showConfirmDialog(this, "Are you sure you want to delete this item ?", "Delete confirmation", JOptionPane.YES_NO_OPTION); if (reponse == JOptionPane.YES_NO_OPTION) { //Tableau.getInstance().retireMateriel(this); } } if (e.getSource() == this.proprietes) { afficheDialogue(); } } public abstract void afficheDialogue(); }
Et donc par exemple , une des classes filles:
Donc quand je zoom, pas de probleme, le zoom fonctionne sur le JPanel.
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 public class Rita extends Materiel{ private RitaDialog proprietes = null; /** Creates a new instance of Rita */ public Rita() { super ("images/rita.gif"); initDialogue(); } public void initDialogue() { SqlRequetes.initRequetes(); try { proprietes = new RitaDialog(this); } catch (SimulatorException se) {} } public void afficheDialogue() { if (proprietes.getFirst()) { proprietes.setCloseable(false); proprietes.setFirst(false); } else proprietes.setCloseable(true); proprietes.pack(); proprietes.setVisible(true); } }
Maintenant, je copie de ma Liste vers le JPanel un objet Rita:
Donc voir methode ajoutMateriel de la classe Tableau.
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 public Liste() { vecteur = new Vector(); vecteur.addElement(new Rita()); this.setListData(vecteur); this.setBorder(new LineBorder(Color.black)); this.setCellRenderer(new CustomCellRenderer()); MouseListener mouseListener = new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 1) { int index = locationToIndex(e.getPoint()); Tableau.getInstance().ajoutMateriel(vecteur.get(index)); } } }; this.addMouseListener(mouseListener); }
Et bien, quand je click sur la liste, l image se retrouve bien dans le JPanel a droite. Mais une fois que je zoom, elle disparait , le carré rouge, lui, restant bien là et se zoomant sans probleme :s:s:s
Je dois t'avouer que j'ai pas tout lu (on verra si c'est nécessaire), mais déjà, dans ton addMatériel, tu passe toujours le même paramètre ("2") quand tu l'ajoute au paneau. Ce "2" représente la place où doit se situer l'objet, et comme y'a déjà le carré rouge, je suppose qu'il doit ête dessiné par dessus le nouveau.
Essai de modifier pour voir si c'est ça.
Nop pas ca. Mais le truc c est que je passe par un setPosition avant le add.
Si je ne fais pas ce setPosition, il ne m'ajoute rien. Si par contre je met le setPosition , m.getPosition retourne un Point (0,0) , vu que Materiel venant de la liste , donc valeur Point de base, et donc il le met en haut a gauche....
Il n'est pas d'usage de faire un setPosition quand on utilise un Layout. Je pense donc plutot qu'il faudrait mettre le setPosition dans le addLayoutComponent.
Ceci dit, il me semblait que cette méthode était appelée automatiquement après.
Je la refais:
setPosition et setSize ne doivent pas être appelée sur les composants d'un container possédant un Layout, car c'est le layout qui gère ça.
pour setSize ok, mais pour setPosition je suis pas d'accord. C'est bien ma souris qui va gerer ca. On drag sur le Materiel et on Drop, je récupere le MouseEvent et je dois positionner là où ca a été droppé. Non ?
Tu te sers de la position, oui, mais en gros, voilà comment il faut faire:
- dans le listener : récupération des coordonnées de la souris -> Point p1, Component c
- calcul de la position dans le JPanel de référence (échelle 1) -> Point p2
- ajout du composant add(c, p2)
Normalement, c'est tout. Dans le Layout, tu récupères le point p2 et tu l'enregistre comme étant la position de c (par exemple avec une HashMap, comme dans mon exemple).
La seule limite de mon exemple vient du fait que je ne récupère qu'une String. Pour pouvoir récupérer un Objet quelconque (un Point dans notre cas), ton Layout doit réaliser l'interface LayoutManager2 qui contient la méthode addLayoutComponent(Component, Object) où tu pourras caster l'Object en Point.
Okay, je regarde apres ca ! en tout cas merci pour le temps que tu m octroie
BOn, au moins maintenant mon code est nickel et tourne sans probleme ... mais niveau zoom c est tjr galere ... car dans le JPanel avec mon layout perso, il peut y avoir des 'Image' , des Lignes (Graphics), pour les interconnexion , ...
Me semble bien gore c ke tu me proposes là
Je ne dit pas que c'est la meilleure solution, mais je pense qu'elle peut marcher.
A l'origine, tu n'avais parlé que de JPanel, quels autres objets as-tu?
Qu'est-ce qui ne marche pas concrètement?
Si tu restes dans cette voie, je peux essayer de t'aider.
J ai effectivement prévu de rester dans cette voie car ca doit marcher.
Dans ce JPanel il y aura:
Des images, qui sont en fait des JPanel (objet Materiel) avec un attribut Image.
Je redéfinis la methode paint de cette maniere :
Voilà pour le premier type d' objet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public void paint(Graphics g) { super.paintComponent(g); if(image != null) // Si l'image existe, ... g.drawImage(image, 0, 0, this); // ... on la dessine }
Le deuxieme type sera du Graphics (que je ne connais pas encore mais ca a l air relativement simple) , qui sera en fait une ligne, qui permettra la liaison entre des objets Materiel.
Mais je ne pense pas qu'un redimensionnement soit utile à ce niveau, un simple retracement du point A au point B (apres zoom / dezoom) suffira ... non?
Mais j'avoue que ne connaissant pas le truc de layout perso, je nage completement. J ai essayer de voir avec Layout2 comme tu me disais, mais ca me tape du nullException et tuti quanti...
Et pour le moment rien de bien concret vu que je comprend pas trop le principe
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager