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

Composants Java Discussion :

[JScrollPane] Recalcitrant


Sujet :

Composants Java

  1. #21
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    Voici la JFrame :
    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
     
    public class Edition extends JFrame {
    	private EditionCarte carte = null;
    	private JMenuBar barre = null;
    	private JMenu fichier = null;
    	private JMenu nouveau = null;
    	private JMenuItem nouvCarte = null;
    	private JMenuItem nouvArret = null;
    	private JMenuItem nouvDonnee = null;
    	private JMenuItem quitter = null;
     
    	public Edition() {
    		super("Edition");
    		//	pour conserver l'aspect du systeme d'exploitation :
    		try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    		} catch (Exception e) {}
    		setSize(new Dimension(800,600));
    		setPreferredSize(new Dimension(800,600));
    		setLocationRelativeTo(null);
    		setResizable(false);
    		//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		carte = new EditionCarte();
    		setContentPane(carte);
    carte.chargerCarte("Z:\\Workspace\\Donnees\\Cartes\\BRGM-map.jpg");	
    		barre = new JMenuBar();
    		setJMenuBar(barre);
     
    		fichier = new JMenu("Fichier");
    		barre.add(fichier);
    		nouveau = new JMenu("Nouveau ...");
    		fichier.add(nouveau);
    		nouvCarte = new JMenuItem("Carte ...");
    		nouveau.add(nouvCarte);
    		nouvArret = new JMenuItem("Arrêt ...");
    		nouveau.add(nouvArret);
    		nouvDonnee = new JMenuItem("Donnée ...");
    		nouveau.add(nouvDonnee);
    		quitter = new JMenuItem("Quitter");
    		quitter.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.CTRL_MASK));
    		quitter.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e)
    			{
    				quitter();
    			}
    		});
    		fichier.add(quitter);
     
    		//		 modif du listener de la fenetre
    		this.addWindowListener(new WindowListener() {
    			public void windowClosing(java.awt.event.WindowEvent evt) {
    				quitter();
    			}
    			public void windowOpened(WindowEvent arg0) {
    			}
    			public void windowClosed(WindowEvent arg0) {
    			}
    			public void windowIconified(WindowEvent arg0) {
    			}
    			public void windowDeiconified(WindowEvent arg0) {
    			}
    			public void windowActivated(WindowEvent arg0) {
    			}
    			public void windowDeactivated(WindowEvent arg0) {
    			} 
    		} );
     
    		pack();
    		setVisible(true);
    	}
     
    	private void quitter() {
    			this.dispose();
    	}
     
    	public void paintComponent(Graphics g) {
    		System.out.println("repaint");
    	}
     
    	public static void main(String[] args) {
    		new Edition();
    	}
    }
    la classe EditionCarte
    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
     
    public class EditionCarte extends JPanel {
    	private Carte carte = null;
    	private JScrollPane conteneur = null;
    	private MouseListener observateur = null;
    	private int zoom = 1;
     
    	public EditionCarte() {
    		this.setLayout(new BorderLayout());
    		observateur = new MouseListener() {
    			public void mouseClicked(MouseEvent arg0) {
    				System.out.println("CLIC :)");
    				carte.ajoutArret(arg0.getX(), arg0.getY());
    				conteneur.repaint();
    				repaint();
    			}
    			public void mousePressed(MouseEvent arg0) {
    			}
    			public void mouseReleased(MouseEvent arg0) {
    			}
    			public void mouseEntered(MouseEvent arg0) {
    			}
    			public void mouseExited(MouseEvent arg0) {
    			}
    		};
    	}
     
    	public void chargerCarte(String path) {
    		System.out.println("chargerCarte edition");
    		carte =new Carte(path);
    		conteneur = new JScrollPane(new JLabel(carte));
    		conteneur.addMouseListener(observateur);
    		this.add(conteneur);
    	}
     
    	public void paintComponent(Graphics g) {
    		System.out.println("repaint panel");
    		conteneur.repaint();
    		carte.draw(g,zoom);
    	}
    }
    la classe Carte :
    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
     
    public class Carte extends ImageIcon{
    	private String chemin = null;
    	private float echelle = 1;
    	private ArrayList listeArrets = null;
    	private int idCourant = 1;
     
    	public Carte(String path) {
    		super(path);
    		chemin = path;
    		listeArrets = new ArrayList();
    	}
     
    	/**
             * Construit un arret et l'ajoute à la liste de la carte 
             */
    	public void ajoutArret(int x, int y) {
    		Arret arretCourant = new Arret(idCourant, x, y);
    		listeArrets.add(arretCourant);
    		idCourant++;
    	}
     
    	/**
             * redefinition de la methode d'affichage
             */
    	public void draw(Graphics g, double zoom) {
    		Graphics2D g2 = (Graphics2D) g;
    		// TODO gestion du zoom !
    		g2.scale(zoom, zoom);
    		//g2.clipRect(0,0,100,100);
    		g2.drawImage(this.getImage(), new AffineTransform(), this.getImageObserver());
    		System.out.println("draw carte");
    		//affichage des arrets
    		if (!listeArrets.isEmpty()) {
    			for(int i=0 ; i<listeArrets.size(); i++) {
    				Arret temp = (Arret) listeArrets.get(i);
    				temp.draw(g2);
    			}
    		}
    	}
    }
    et enfin la classe arret :
    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
     
    public class Arret {
    	private int id;
    	private int x; //les coordonnees d'un arret sont en % de la carte support
    	private int y;
    	private ArrayList listeLiens = null;
     
    	public Arret(int ident, int X, int Y) {
    		id=ident;
    		x=X;
    		y=Y;
    		System.out.println("nouvo arret "+id);
    	}
     
    	public void draw(Graphics2D g) {
    		System.out.println("draw arret "+id);
    		g.setColor(Color.red);
    		g.drawOval(x,y,100,100);
    	}
    }
    Avec ce code, l'image s'affiche tout de suite avec les scrollbars, mon problème est que les arrets, eux, ne s'affichent pas ...

    Voila, merci d'avance à ceux qui prendront le temps d'essayer.

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    Ne manque-t-il pas un petit bout de code dans ce que tu as posté ?
    Chez moi, rien ne s'affiche dans la JFrame, et les menus semblent inopérants.

    Nicolas

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    Oui les menus ne fonctionnent pas encore, sauf quitter normalement.
    Par contre le chargement de l'image fonctionne chez moi ... en passant le chemin absolu de l'image (jpg) ...

  4. #24
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    J'ai remarqué que j'etais obligé de reconstruire mon JScrollPane au lieu de simplement lui ajouter un nouveau Label.

    en utilisant add(), le JScrollPane reste vide ...

    Je crois qu'il y a vraiment un truc que j'ai pas compris avec ces JscollPane de #!\{"~_ !

    Ou alors ils ne sont pas conçu pour ce que je veux faire ... mais là il faut que je reconstruise tout

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    OK. J'ai changé le chemin absolu dans le code : une image avec barre de défilement s'affiche au lancement de l'application.
    Ensuite, comment fait-on fonctionner les "arrêts" pour mettre en évidence le problème ?

    Nicolas

  6. #26
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    en cliquant sur la carte, des arrets sont crees mais ne s'affichent pas ...

  7. #27
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Il est toujours difficile de "rentrer" dans le code d'un autre, donc excuse-moi par avance si je dis des bêtises.

    Si la méthode draw de Carte est destinée à afficher les "Arrets", il y a un problème : elle [EDIT] ne semble jamais appelée (mets un println dedans pour voir).

    Nicolas

  8. #28
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Je vais me coucher. Je veux bien me repencher sur ton code demain matin, si personne ne t'a aidé d'ici là. Mais peux-tu me dire ce que sont censés faire les arrêts ? Comment les activer ? Comment devraient-ils être affichés ? A quoi correspondent-ils ?

    Nicolas

  9. #29
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    Nous n'avons pas les mêmes habitudes de programmation. Je n'arrivais pas à travailler sur ton code tel quel. Je l'ai donc largement reformaté selon mes propres façons de faire. Mais cela semble marcher : JScrollPane qui apparait au lancement + les "arrets" qui s'affichent.

    Principales modifications :
    - implémentation du MouseListener directement sur Carte, et non dans EditionCarte
    - création d'une classe ListeArrets
    - utilisage d'Image et non d'ImageIcon pour afficher la "carte".

    Nicolas

    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
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.Rectangle2D;
    import java.util.ArrayList;
    import javax.swing.*;
     
    class Arret {
        private int id;
        private int x; //les coordonnees d'un arret sont en % de la carte support
        private int y;
     
        public Arret(int ident, int X, int Y) {
            this.id=ident;
            this.x=X;
            this.y=Y;
            System.out.println("Création d'un nouvel arret "+id);
        }
     
        public void draw(Graphics2D g2) {
            System.out.println("draw arret "+id);
            g2.setColor(Color.red);
            g2.drawOval(x,y,100,100);
        }
    }
     
    class ListeArrets extends ArrayList<Arret> {
     
        public void addArret(Arret a) {
            this.add(a);
            System.out.println("Ajout d'un arret à la liste : n°"+this.size());
     
        }
    }
     
    class Carte extends JComponent implements MouseListener {
        private ListeArrets listeArrets = null;
        private Image image;
     
        public Carte(ListeArrets listeArrets, String path) {
            this.listeArrets = listeArrets;
            image = Toolkit.getDefaultToolkit().getImage(path);
            this.addMouseListener(this);
        }
     
        public void mouseClicked(MouseEvent arg0) {
            System.out.println("CLIC :)");
            listeArrets.addArret(new Arret(listeArrets.size()+1, arg0.getX(), arg0.getY()));
            repaint();
        }
        public void mousePressed(MouseEvent arg0) {
        }
        public void mouseReleased(MouseEvent arg0) {
        }
        public void mouseEntered(MouseEvent arg0) {
        }
        public void mouseExited(MouseEvent arg0) {
        }
     
     
        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.drawImage(image, 0, 0, this);
            Dimension dimensionImage = new Dimension(image.getWidth(this), image.getHeight(this));
            this.setPreferredSize(dimensionImage); // semble utile pour le JScrollPane
            this.setSize(dimensionImage); // semble utile pour le JScrollPane
            for (int i=0 ; i<listeArrets.size(); i++) {
                Arret temp = listeArrets.get(i);
                temp.draw(g2);
            }
        }
    }
     
    class EditionCarte extends JPanel {
     
        public EditionCarte(ListeArrets listeArrets, String imagePath) { // MODIF
            super();
            Carte carte = new Carte(listeArrets, imagePath);
            JScrollPane scroll = new JScrollPane(carte);
            this.setLayout(new BorderLayout());
            this.add(scroll);
        }
    }
     
    public class Edition extends JFrame {
        private JMenuBar barre = null;
        private JMenu fichier = null;
        private JMenu nouveau = null;
        private JMenuItem nouvCarte = null;
        private JMenuItem nouvArret = null;
        private JMenuItem nouvDonnee = null;
        private JMenuItem quitter = null;
     
        public Edition() {
            super("Edition");
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {}
            setSize(new Dimension(800,600));
            setPreferredSize(new Dimension(800,600));
            setLocationRelativeTo(null);
            setResizable(false);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            ListeArrets listeArrets = new ListeArrets();
     
            EditionCarte editionCartePanel = new EditionCarte(listeArrets, "C:\\...\\XX.jpg"); // MODIF
            this.getContentPane().add(editionCartePanel);
     
            setVisible(true);
        }
     
        public static void main(String[] args) {
            new Edition();
        }
    }

  10. #30
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    Bonjour et MERCI !

    Ton code marche tres bien !

    Tu va me trouver lourd là, surtout que t'as deja etait super cool de m'aider
    Mais il faut que je gere un zoom ...

    Encore merci

    [edit]
    Bon, le zoom fonctionne sur la carte mais les points ont du mal à suivre ... je n'arrivent pas à les "fixer" sur des coordonnées de la carte ...
    [/edit]

    [RE edit]
    En fait, ton code marche bien si on charge la carte à la création de la JFrame, mais je dois pouvoir charger une carte à tout moment, et là ca ne fonctionne plus : la JFrame reste vide
    [/RE edit]

  11. #31
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Le zoom, je n'ai jamais fait : j'espère que qqun d'autre pourra t'aider.

    En revanche, le chargement de la carte à tout moment devrait marcher.
    Quel est le code de la méthode chargerCarte ?
    A mon avis, cette méthode être dans la classe Carte, et contenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.image = Toolkit.getDefaultToolkit().getImage(path); 
    repaint();
    Tu fais bien comme ça ?

    Nicolas

  12. #32
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    Bah en fait j'utilise une methode de EditionCarte :
    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 class EditionCarte extends JPanel {
    	private Carte carte = null;
    	private JScrollPane conteneur = null;
     
    	public EditionCarte() {
    		super();
    		this.setLayout(new BorderLayout());
    	}
     
    	public void chargerCarte(String path) {
    		System.out.println("chargerCarte edition");
    		carte =new Carte(path, this.getWidth(), this.getHeight());
    		conteneur = new JScrollPane(carte);
    		this.add(conteneur);
    	}
    }
    Quand j'utilise cette methode au moment de la creation de la JFrame, pas de probleme, mais si je ne charge pas l'image de suite, et que je le fais apres a l'aide du menu, bah ca ne marche plus ...
    En fait dans EditionCarte, j'ai juste separe le constructeur du chargement...
    Et je viens de remarquer que en fait ca marchait avec une ImageIcon, et pas une Image (a la construction) ...[/code]

  13. #33
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Pour le chargement de la carte, je te suggère de la faire depuis la classe Carte, de la façon suivante :

    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
    class Carte extends JComponent implements MouseListener { 
        private ListeArrets listeArrets = null; 
        private Image image; 
     
        public Carte(ListeArrets listeArrets, String path) { 
            this.listeArrets = listeArrets; 
            this.chargerCarte(path);
            this.addMouseListener(this); 
        } 
     
        public void chargerCarte(String path) {
            this.image = Toolkit.getDefaultToolkit().getImage(path); 
            repaint();
        }
     
        // ...
     
    }
    Regarde si cela marche mieux.

    Nicolas

  14. #34
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    Je ne peux pas faire comme ca.
    Quand ma fenetre est créée, elle est vide. L'objet carte n'existe pas donc je peux pas appeler une methode. Je peux juste le construire...

  15. #35
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Restons confiants...
    Ci-dessous un code. Pour simuler les changements de carte,
    - j'ai rentré le chemin vers deux images (carte1 et carte2 au début de la classe Edition) ;
    - je provoque le chargement de carte1 ou carte2 par le simple appui sur A ou B (le code à la fin du constructeur de Edition).
    L'application démarre bien sans carte chargée.
    Cela semble marcher !

    Nicolas

    EDIT : cela ne marche que si un objet Carte peut recevoir plusieurs images. Mais ce n'est peut-être pas ta philosophie. Pour toi : une instance de Carte = une seule image ?

    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;
    import javax.swing.*;
     
    class Arret {
        private int id;
        private int x; //les coordonnees d'un arret sont en % de la carte support
        private int y;
     
        public Arret(int ident, int X, int Y) {
            this.id=ident;
            this.x=X;
            this.y=Y;
            System.out.println("Création d'un nouvel arret "+id);
        }
     
        public void draw(Graphics2D g2) {
            System.out.println("draw arret "+id);
            g2.setColor(Color.red);
            g2.drawOval(x,y,100,100);
        }
    }
     
    class ListeArrets extends ArrayList<Arret> {
     
        public void addArret(Arret a) {
            this.add(a);
            System.out.println("Ajout d'un arret à la liste : n°"+this.size());
     
        }
    }
     
    class Carte extends JComponent implements MouseListener {
        private ListeArrets listeArrets = null;
        private Image image = null;
     
        public Carte(ListeArrets listeArrets) {
            this.listeArrets = listeArrets;
            this.addMouseListener(this);
        }
     
        public void chargerCarte(String path) {
            this.image = Toolkit.getDefaultToolkit().getImage(path);
            repaint();
        }
     
        public void mouseClicked(MouseEvent arg0) {
            System.out.println("CLIC :)");
            listeArrets.addArret(new Arret(listeArrets.size()+1, arg0.getX(), arg0.getY()));
            repaint();
        }
        public void mousePressed(MouseEvent arg0) {
        }
        public void mouseReleased(MouseEvent arg0) {
        }
        public void mouseEntered(MouseEvent arg0) {
        }
        public void mouseExited(MouseEvent arg0) {
        }
     
     
        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            if (image != null) {
                g2.drawImage(image, 0, 0, this);
                Dimension dimensionImage = new Dimension(image.getWidth(this), image.getHeight(this));
                this.setPreferredSize(dimensionImage); // semble utile pour le JScrollPane
                this.setSize(dimensionImage); // semble utile pour le JScrollPane
            }
            for (int i=0 ; i<listeArrets.size(); i++) {
                Arret temp = listeArrets.get(i);
                temp.draw(g2);
            }
        }
    }
     
    class EditionCarte extends JPanel {
     
        Carte carte;
     
        public EditionCarte(ListeArrets listeArrets) { // MODIF
            super();
            carte = new Carte(listeArrets);
            JScrollPane scroll = new JScrollPane(carte);
            this.setLayout(new BorderLayout());
            this.add(scroll);
        }
     
        public Carte getCarte() {
            return carte;
        }
    }
     
    public class Edition extends JFrame {
        private JMenuBar barre = null;
        private JMenu fichier = null;
        private JMenu nouveau = null;
        private JMenuItem nouvCarte = null;
        private JMenuItem nouvArret = null;
        private JMenuItem nouvDonnee = null;
        private JMenuItem quitter = null;
     
        String carte1 = "C:\\...\\XX1.JPG";
        String carte2 = "C:\\...\\XX2.JPG";
     
        public Edition() {
     
            super("Edition");
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {}
            setSize(new Dimension(800,600));
            setPreferredSize(new Dimension(800,600));
            setLocationRelativeTo(null);
            setResizable(false);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            ListeArrets listeArrets = new ListeArrets();
     
            final EditionCarte editionCartePanel = new EditionCarte(listeArrets);
     
            this.getContentPane().add(editionCartePanel);
     
            this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("A"), "action A");
            this.getRootPane().getActionMap().put("action A", new AbstractAction() {
                public void actionPerformed(ActionEvent ae) {
                    System.out.println("A pressé");
                    editionCartePanel.getCarte().chargerCarte(carte1);
                }
            }
            );
            this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("B"), "action B");
            this.getRootPane().getActionMap().put("action B", new AbstractAction() {
                public void actionPerformed(ActionEvent ae) {
                    System.out.println("B pressé");
                    editionCartePanel.getCarte().chargerCarte(carte2);
                }
            }
            );
     
            setVisible(true);
        }
     
        public static void main(String[] args) {
            new Edition();
        }
    }

  16. #36
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    J'ai reussi a faire marcher mon code : voir les modifs ...
    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    public Edition(String esp) {
    		setSize(new Dimension(800,600));
    		setPreferredSize(new Dimension(800,600));
    		setLocationRelativeTo(null);	//centrage de la fenetre BOF
    		setResizable(true);
     
    		// ajout d'une composant vide MODIF
    		carte = new EditionCarte();
    		this.getContentPane().add(carte);
     
    		barre = new JMenuBar();
    		setJMenuBar(barre);
    		fichier = new JMenu("Fichier");
    		barre.add(fichier);
    		nouveau = new JMenu("Nouveau ...");
    		fichier.add(nouveau);
    		nouvCarte = new JMenuItem("Carte ...");
    		nouvCarte.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e)
    			{
    				getContentPane().remove(carte); //MODIF
    			        carte = new EditionCarte();
    			        carte.chargerCarte(fich);
    			        getContentPane().add(carte);
    			        validate();
    			}
    		});
    		nouveau.add(nouvCarte);
    		nouvArret = new JMenuItem("Arrêt ...");
    		nouveau.add(nouvArret);
    		nouvDonnee = new JMenuItem("Donnée ...");
    		nouveau.add(nouvDonnee);
    		quitter = new JMenuItem("Quitter");
    		quitter.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.CTRL_MASK));
    		quitter.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e)
    			{
    				quitter();
    			}
    		});
    		fichier.add(quitter);
     
    		pack();
    		setVisible(true);
    	}
     
    public class EditionCarte extends JPanel {
    	private Carte carte = null;
    	private JScrollPane conteneur = null;
    	public EditionCarte() {
    		super();
    		this.setLayout(new BorderLayout());
    	}
    	public void chargerCarte(String path) {
    		carte =new Carte(path);
    		conteneur = new JScrollPane(carte);
    		this.add(conteneur);
    	}
    }
     
    public class Carte extends JComponent {
    	private String chemin = null;
    	private ArrayList listeArrets = null;
    	private int idCourant = 1;
    	private ImageIcon image = null; //MODIF
    	private double zoom = 1;
     
    	/**
             * Constructeur
             * @param path
             */
    	public Carte(String path) {
    		image = new ImageIcon(path); // MODIF
    		chemin = path;
    		listeArrets = new ArrayList();
     
    		this.addMouseListener(new MouseListener() {
    			public void mouseClicked(MouseEvent arg0) {
    				ajoutArret(arg0.getX(), arg0.getY());
    				repaint();
    			}
    			public void mousePressed(MouseEvent arg0) {
    				// TODO Auto-generated method stub
    			}
    			public void mouseReleased(MouseEvent arg0) {
    				// TODO Auto-generated method stub
    			}
    			public void mouseEntered(MouseEvent arg0) {
    				// TODO Auto-generated method stub
    			}
    			public void mouseExited(MouseEvent arg0) {
    				// TODO Auto-generated method stub	
    			}
    		});
    		this.addMouseWheelListener(new MouseWheelListener() {
    			public void mouseWheelMoved(MouseWheelEvent arg0) {
    				// TODO Auto-generated method stub
    				double facteurTemp = zoom - arg0.getWheelRotation()*0.05;
    				if ((facteurTemp>0.2)&&(facteurTemp<5)) {
    					zoom = facteurTemp;	
    				} else {
    					//butées du zoom
    					if (arg0.getWheelRotation()>0) {
    						zoom = 0.2;
    					} else {
    						zoom = 5;
    					}
    				}
    				repaint();
    			}
    		});
    	}
     
    	/**
             * Construit un arret et l'ajoute à la liste de la carte 
             * @param x
             * @param y
             */
    	public void ajoutArret(int x, int y) {
    		Arret arretCourant = new Arret(idCourant, x, y);
    		listeArrets.add(arretCourant);
    		idCourant++;
    	}
     
    	/**
             * redefinition de la methode d'affichage
             * @param g
             * @param zoom
             */
    	public void paint(Graphics g) {
    		Graphics2D g2 = (Graphics2D) g;
    		g2.scale(zoom, zoom);
    		g2.drawImage(image.getImage(), 0, 0, this); 
    		int larg = (int) (image.getIconWidth()*zoom);
    		int haut = (int) (image.getIconHeight()*zoom);
    		Dimension dimensionImage = new Dimension(larg,haut);
    		this.setPreferredSize(dimensionImage);
    		this.setSize(dimensionImage);
     
    		//affichage des arrets
    		if (!listeArrets.isEmpty()) {
    			for(int i=0 ; i<listeArrets.size(); i++) {
    				Arret temp = (Arret) listeArrets.get(i);
    				temp.draw(g2, zoom);
    			}
    		}
    	}
    }
    En fait, j'enleve du contenPane l'ancien JPanel car sinon le systeme s'emmele les pinceaux et les 2 images clignotes l'une apres l'autre ...
    J'utilise une ImageIcon parce qu'avec une Image, le chargement met pres de 10 sec

  17. #37
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    (suite du message précédent)
    Si, pour toi, une instance de Carte = une image = une liste d'arrêts, tu peux faire comme ci-dessous.

    Même principe que dans mon mél. précédent pour tester :
    - remplir les 2 string avec le chemin vers 2 images ;
    - appuyer sur A, puis B, puis A, pour changer la carte.

    Nicolas

    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
    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;
    import javax.swing.*;
     
    class Arret {
        private int id;
        private int x; //les coordonnees d'un arret sont en % de la carte support
        private int y;
     
        public Arret(int ident, int X, int Y) {
            this.id=ident;
            this.x=X;
            this.y=Y;
            System.out.println("Création d'un nouvel arret "+id);
        }
     
        public void draw(Graphics2D g2) {
            System.out.println("draw arret "+id);
            g2.setColor(Color.red);
            g2.drawOval(x,y,100,100);
        }
    }
     
    class ListeArrets extends ArrayList<Arret> {
     
        public void addArret(Arret a) {
            this.add(a);
            System.out.println("Ajout d'un arret à la liste : n°"+this.size());
     
        }
    }
     
    class Carte extends JComponent implements MouseListener {
        private ListeArrets listeArrets = new ListeArrets();
        private Image image;
     
        public Carte(String path) {
            this.addMouseListener(this);
            this.image = Toolkit.getDefaultToolkit().getImage(path);
            repaint();
        }
     
        public void mouseClicked(MouseEvent arg0) {
            System.out.println("CLIC :)");
            listeArrets.addArret(new Arret(listeArrets.size()+1, arg0.getX(), arg0.getY()));
            repaint();
        }
        public void mousePressed(MouseEvent arg0) {
        }
        public void mouseReleased(MouseEvent arg0) {
        }
        public void mouseEntered(MouseEvent arg0) {
        }
        public void mouseExited(MouseEvent arg0) {
        }
     
        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.drawImage(image, 0, 0, this);
            Dimension dimensionImage = new Dimension(image.getWidth(this), image.getHeight(this));
            this.setPreferredSize(dimensionImage); // semble utile pour le JScrollPane
            this.setSize(dimensionImage); // semble utile pour le JScrollPane
            for (int i=0 ; i<listeArrets.size(); i++) {
                Arret temp = listeArrets.get(i);
                temp.draw(g2);
            }
        }
    }
     
    class EditionCarte extends JPanel {
     
        JScrollPane scroll = null;
     
        public void chargerCarte(String path) {
            if (scroll != null) {
                this.remove(scroll);
            }
            scroll = new JScrollPane(new Carte(path));
            this.setLayout(new BorderLayout());
            this.add(scroll);
            this.revalidate(); this.repaint();
        }
    }
     
    public class Edition extends JFrame {
        private JMenuBar barre = null;
        private JMenu fichier = null;
        private JMenu nouveau = null;
        private JMenuItem nouvCarte = null;
        private JMenuItem nouvArret = null;
        private JMenuItem nouvDonnee = null;
        private JMenuItem quitter = null;
     
        String carte1 = "C:\\PHOTOS V et N\\DSC00051.JPG";
        String carte2 = "C:\\PHOTOS V et N\\DSC00052.JPG";
     
        public Edition() {
     
            super("Edition");
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {}
            setSize(new Dimension(800,600));
            setPreferredSize(new Dimension(800,600));
            setLocationRelativeTo(null);
            setResizable(false);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            ListeArrets listeArrets = new ListeArrets();
     
            final EditionCarte editionCartePanel = new EditionCarte();
     
            this.getContentPane().add(editionCartePanel);
     
            this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("A"), "action A");
            this.getRootPane().getActionMap().put("action A", new AbstractAction() {
                public void actionPerformed(ActionEvent ae) {
                    System.out.println("A pressé");
                    editionCartePanel.chargerCarte(carte1);
                }
            }
            );
            this.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("B"), "action B");
            this.getRootPane().getActionMap().put("action B", new AbstractAction() {
                public void actionPerformed(ActionEvent ae) {
                    System.out.println("B pressé");
                    editionCartePanel.chargerCarte(carte2);
                }
            }
            );
     
            setVisible(true);
        }
     
        public static void main(String[] args) {
            new Edition();
        }
    }

  18. #38
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    Le chargement d'image marche tres bien, mais j'ai un probleme d'affichage : lorsque avec le zoom je retrecie l'image, et qu'elle devient plus petite que le JScrollPane, j'ai des bugs d'affichage qd j'affiche d'autre fenetres... Je crois que c'est du à la zone grise qui apparait autour de l'image, qui est en fait du vide, que le systeme ne sait pas gerer correctement visiblement ...

    Y'a-t-il moyen d'adapter en continu la taille du ScrollPane à son contenu ?
    Ou l'inverse ?
    J'essaye depuis plusieurs jours sans resultat ...

    Encore une fois, merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [JFrame][JScrollPane] rafraichissement
    Par iuz dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 14/05/2004, 11h08
  2. [JSCROLLPANE][JTABLE] Probleme de raf...
    Par thibaud dans le forum Composants
    Réponses: 5
    Dernier message: 04/05/2004, 11h26
  3. [JScrollPane]Comment savoir quand une scrollbar apparait ?
    Par FrigoAcide dans le forum Composants
    Réponses: 4
    Dernier message: 29/04/2004, 10h10
  4. [JScrollPane] élargir la taille
    Par nyny_p dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 03/05/2003, 10h54
  5. [VB6] enabled récalcitrant
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 04/12/2002, 10h09

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