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

2D Java Discussion :

Zoom / Dézoom


Sujet :

2D Java

  1. #21
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Et ma solution de layout ne te conviens pas?

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    j'ai beau l'avoir regardée , et essayée, je pige pas le principe de la chose :s

  3. #23
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    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:

    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) {
    	}
     
    }
    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
     
            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);
    	}
    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.

    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

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    Waw , super, je me jette là dedans de suite!

    Un grand merci d avance

  5. #25
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    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?

  6. #26
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    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.

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    mmm ... bon je continue a regarder cette histoire mystique

  8. #28
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    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

  9. #29
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    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)
    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;
       }
    }
    Comme tu peux le voir, j' y ai intégré ton JPanel ROUGE pour tester le zoom, qui fonctionne très bien.

    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)

    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();
    }
    Je suis d'accord que bcp de code là dedans n est pas utile, mais ca me semble mieux de paster tout.

    Et donc par exemple , une des classes filles:

    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);
        }
    }
    Donc quand je zoom, pas de probleme, le zoom fonctionne sur le JPanel.

    Maintenant, je copie de ma Liste vers le JPanel un objet Rita:
    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);
        }
    Donc voir methode ajoutMateriel de la classe Tableau.

    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

  10. #30
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    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.

  11. #31
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    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....

  12. #32
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    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.

  13. #33
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    :s heu ...

  14. #34
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    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.

  15. #35
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    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 ?

  16. #36
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    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.

  17. #37
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    Okay, je regarde apres ca ! en tout cas merci pour le temps que tu m octroie

  18. #38
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    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à

  19. #39
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    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.

  20. #40
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Points : 66
    Points
    66
    Par défaut
    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 :

    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
        }
    Voilà pour le premier type d' objet.
    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

Discussions similaires

  1. [CSS 3] Mise en page en zoom/dézoom
    Par oieretxe dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 06/10/2014, 21h54
  2. Effet zoom / dézoom
    Par whoaloic dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 07/07/2014, 09h14
  3. Zoom/dézoom des items d'un listbox
    Par yonpo dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 20/12/2010, 12h15
  4. zoom et dézoom dans un JXImageView
    Par genamiga dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 02/06/2009, 10h14
  5. URGENT : Zoom et changement de repère
    Par poca10 dans le forum MFC
    Réponses: 5
    Dernier message: 28/05/2002, 13h32

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