Déjà essayer et même résultat :aie:
Version imprimable
Déjà essayer et même résultat :aie:
tu ai sur que l'appel a jMenuItem1ActionPerformed marche bien ?
met System.out.println(" action détecté sur mon menu ");
dans jMenuItem1ActionPerformed
et voir si il aura affichage dans la console
Alors j'ai saisie ceci sous netbeans
ce qui épate c'est que ça compile sans erreur:calim2: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
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 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * Form1.java * * Created on 8 août 2009, 10:21:26 */ package Application; import javax.swing.ImageIcon; import javax.swing.JLabel; /** * * @author */ public class Form1 extends javax.swing.JFrame { /** Creates new form Form1 */ public Form1() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jTabbedPane1 = new javax.swing.JTabbedPane(); jPanel1 = new javax.swing.JPanel(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenuItem1 = new javax.swing.JMenuItem(); jMenu2 = new javax.swing.JMenu(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 395, Short.MAX_VALUE) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 251, Short.MAX_VALUE) ); jTabbedPane1.addTab("Carte", jPanel1); jMenu1.setText("Fichier"); jMenuItem1.setText("Charger"); jMenuItem1.setToolTipText("Charger une carte"); jMenuItem1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem1ActionPerformed(evt); } }); jMenu1.add(jMenuItem1); jMenuBar1.add(jMenu1); jMenu2.setText("Edit"); jMenuBar1.add(jMenu2); setJMenuBar(jMenuBar1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE) ); pack(); }// </editor-fold> //Si un clic survient sur Charger du menu Fichier private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { String urlImage = "D:/A surveiller/plan-vierge.png"; //L'endroit ou est stocker l'image ImageIcon imageCarte = new ImageIcon(urlImage); //Crée une image dans le tampon JLabel imageInComponent = new JLabel(imageCarte); //Instancie le JLabel qui contiendra l'image jPanel1.add(imageInComponent); //Assigne au jPanel le JLabel avec l'image jPanel1.revalidate(); //Reconstruit le jPanel1 //ImageIcon icon = new ImageIcon("yoda.gif"); //JLabel img = new JLabel(icon); //monPanel.add(img); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Form1().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JPanel jPanel1; private javax.swing.JTabbedPane jTabbedPane1; // End of variables declaration }
:mouarf:
il te manque
Code:imageInComponent.setBounds(0,0,100,100);
Toujours pas d'image
Comment changer de layout depuis netBeans ?Code:
1
2
3
4
5
6
7
8
9private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { String urlImage = "D:/A surveiller/plan-vierge.png"; //L'endroit ou est stocker l'image ImageIcon imageCarte = new ImageIcon(urlImage); //Crée une image dans le tampon JLabel imageInComponent = new JLabel(imageCarte); //Instancie le JLabel qui contiendra l'image jPanel1.setBounds(0, 0, 100, 100); //Place la taille de l'image jPanel1.add(imageInComponent); //Assigne au jPanel le JLabel avec l'image jPanel1.revalidate(); //Reconstruit le jPanel1 }
Et bien, j'ai toujours la même chose :calim2:
a tu remarqué ? j'ai édité mon message .
Oui j'ai remarqué.
Par contre je n'ai pas mis de scroll encore!
essaye avec une petite image ,le scroll si ton image est plus grand que ton panneau.
chez moi ,ton code marche bien
voila
si sa marche pas encore ,alors change ton image et vérifie le chemin et l'extensionCode:
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 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * Form1.java * * Created on 8 août 2009, 10:21:26 */ import javax.swing.ImageIcon; import javax.swing.JLabel; /** * * @author */ public class Form1 extends javax.swing.JFrame { /** Creates new form Form1 */ public Form1() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jTabbedPane1 = new javax.swing.JTabbedPane(); jPanel1 = new javax.swing.JPanel(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenuItem1 = new javax.swing.JMenuItem(); jMenu2 = new javax.swing.JMenu(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 395, Short.MAX_VALUE) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 251, Short.MAX_VALUE) ); jTabbedPane1.addTab("Carte", jPanel1); jMenu1.setText("Fichier"); jMenuItem1.setText("Charger"); jMenuItem1.setToolTipText("Charger une carte"); jMenuItem1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem1ActionPerformed(evt); } }); jMenu1.add(jMenuItem1); jMenuBar1.add(jMenu1); jMenu2.setText("Edit"); jMenuBar1.add(jMenu2); setJMenuBar(jMenuBar1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE) ); pack(); }// </editor-fold> //Si un clic survient sur Charger du menu Fichier private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { String urlImage = "D:\\A surveiller\\plan-vierge.png"; //L'endroit ou est stocker l'image ImageIcon imageCarte = new ImageIcon(urlImage); //Crée une image dans le tampon JLabel imageInComponent = new JLabel(imageCarte); //Instancie le JLabel qui contiendra l'image imageInComponent.setBounds(0,0,100,100); jPanel1.add(imageInComponent); //Assigne au jPanel le JLabel avec l'image jPanel1.repaint(); //Reconstruit le jPanel1 //ImageIcon icon = new ImageIcon("yoda.gif"); //JLabel img = new JLabel(icon); //monPanel.add(img); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Form1().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JPanel jPanel1; private javax.swing.JTabbedPane jTabbedPane1; // End of variables declaration }
. bonne journée
ajoute
en haut pour le code que je t'ais donné.Code:
1
2package Application;
bonne chance
Ca y est j'y suis arrivé :ccool:
Par contre je ne voie que 100x100 suremet due au setBounds()
Ceci dit, je tente maintenant de mettre un scroll ;)
Je ne sait pas vraiment. J'ai tout re coder à la main et maintenant ça fonctionne parfaitement.
Je me suis permis de faire une petite retouche de rien du tout:
De façon à faire directement la valeur width et height. Par contre je pense que le scroll devrais être automatique. A moins que le JLabel est une propriété autorisant le scrolling ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 //Si un clic survient sur Charger du menu Fichier private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { String urlImage = "D:\\A surveiller\\plan-vierge.png"; //L'endroit ou est stocker l'image ImageIcon imageCarte = new ImageIcon(urlImage); //Crée une image dans le tampon JLabel imageInComponent = new JLabel(imageCarte); //Instancie le JLabel qui contiendra l'image int imgWidth = imageCarte.getIconWidth(); int imgHeight = imageCarte.getIconHeight(); imageInComponent.setBounds(0,0,imgWidth,imgHeight); jPanel1.add(imageInComponent); //Assigne au jPanel le JLabel avec l'image jPanel1.repaint(); //Reconstruit le jPanel1 //JOptionPane.showMessageDialog(null, "Ok", "Message", JOptionPane.INFORMATION_MESSAGE); //jPanel1.revalidate(); //Reconstruit le jPanel1 }
Bonjour,
Je reprend ce matin le code que nous avons réalisé hier, de façon a l'étoffé un peu.
Comment je pourrait créer un scroll à l'image, si elle est trop grande ?
Comment je pourrait passé depuis ce bout de code au buffered en vue d'y appliqué les points cliquable ?
Ensuite je passerais à l'étape classe :ccool:
Cordialement.
Afin de tenter de répondre à la première question, j'ai tout refait à 0!
Cette fois-ci, j'ouvre un onglet ou je crée des composants plutot que de les avoirs de façon ferme. Cela me permettra, plus tard, d'avoir une plus grande souplesse.
Voila donc ce que je viens de coder. Et ça fonctionne en partie.
En fait quand je dit en partie... J'ai bien un sans-blanc d'image en fond mais au dessus j'ai une sorte de carré gris. J'imagine que j'ai du me tromper quelque par :aie: mais ou ? :roll: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 //Ouvre une carte private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { String urlImage = "D:/A surveiller/plan-vierge.png"; //L'endroit ou est stocker l'image ImageIcon carte = new ImageIcon(urlImage); //Crée une image dans le tampon int imgWidth = carte.getIconWidth(); //Récupère la largeur en pixel de l'image int imgHeight = carte.getIconHeight(); //Récupère la hauteur en pixel de l'image JScrollPane scroll = new JScrollPane(); //Crée un scroll JPanel panel = new JPanel(); //Crée un panel JLabel label = new JLabel(carte); //Crée un JLabel panel.add(label); panel.setBounds(0, 0, imgWidth, imgHeight); scroll.add(panel); //Assigne au scroll le panel scroll.setBounds(0, 0, imgWidth, imgHeight); //Taille du scroll jTabbedPane1.add("Carte", scroll); jTabbedPane1.repaint(); }
Voila du reste une image illustrant le résultat de mon code théorique ;)
Cordialement
Bonjour,
Je suis toujours bloqué avec ce problème de carré gris et je ne voie aucun scroll apparaitre.
Soit je n'ai aucun scroll donc il ne s'affiche pas,
Soit quelque chose écrit au dessus et il n'apparait pas non plus
Quelqu'un aurais un élément de réponse pour sauver ce bout de code, ou faut-il tout reprendre à 0 ?
Cordialement.
ton scroll est vide , tu la simplement placé dans le tabbed pane ,donc ,tu doit ajouter ton panneau au Scroll avec
faut que la taille( préféré) du panneau "ton_panneau" soit plus grande que celle du tabbedPane si ton Layout est BorderLayoutCode:
1
2
3 tonScroll.setViewportView(ton_panneau);
Pour cette partie du problème, je te propose te tout reprendre de zéro. Autant faire simple mais efficace.
Voici très simplement un scroll sur une image dans un onglet :
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
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 import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; public class Carte extends JPanel { public static void main( String[] arg ) throws IOException { JFrame frame = new JFrame(); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); Carte carte = new Carte( new File( "grand.jpg" ) ); JTabbedPane tabbed = new JTabbedPane(); tabbed.add( "premier", new JScrollPane( carte ) ); frame.getContentPane().add( tabbed ); frame.setSize( 640, 480 ); frame.setVisible( true ); } private static final long serialVersionUID = 1L; private BufferedImage fond; public Carte( File fichierCarte ) throws IOException { fond = ImageIO.read( fichierCarte ); } @Override public void paintComponent( Graphics g ) { g.drawImage( fond, 0, 0, this ); } @Override public Dimension getPreferredSize() { return new Dimension( getWidth(), getHeight() ); } @Override public int getHeight() { return fond.getHeight(); } @Override public int getWidth() { return fond.getWidth(); } }
Effectivement ça fonctionne avec le code de Slim :ccool:
Quand à la solution de dino, je ne la retient pas, pour le moment, n'étant déjà pas très à l'aise avec la gestion graphique.
Voila ce que j'ai ajouté, par contre je ne sait pas traduire en commentaire l'ajout de la ligne "scroll.setViewportView(panel);", si quelqu'un a une idée, je suis preneur.
Le code complet:
Il me fraudais maintenant que je puisse éventuellement afficher mes points dessus et que je puisse la déplacé avec la souris si je touche une zone vierge de point.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
26 //Ouvre une carte private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { String urlImage = "D:/A surveiller/plan-vierge.png"; //L'endroit ou est stocker l'image ImageIcon carte = new ImageIcon(urlImage); //Crée une image dans le tampon int imgWidth = carte.getIconWidth(); //Récupère la largeur en pixel de l'image int imgHeight = carte.getIconHeight(); //Récupère la hauteur en pixel de l'image JScrollPane scroll = new JScrollPane(); //Crée un scroll JPanel panel = new JPanel(); //Crée un panel JLabel label = new JLabel(carte); //Crée un JLabel avec l'objet carte panel.add(label); //Place dans le panel le label panel.setBounds(0, 0, imgWidth, imgHeight); scroll.add(panel); //Assigne au scroll le panel scroll.setBounds(0, 0, imgWidth, imgHeight); //Taille du scroll scroll.setViewportView(panel); jTabbedPane1.add("Carte", scroll); jTabbedPane1.repaint(); }
Commençons par les points. Comment faut-il que je face pour ajouter des points au dessus de la carte et qu'ils soit liée?
Cordialement.
Je me permet d'insister avec ma solution. Elle est plus simple et ne modifie pas dynamiquement l'interface graphique en créant les Component.
Bouton souris gauche : ajouter un message sur le point cliqué
Bouton souris droit : déplacer l'image.
L'image contenant les points cliqué est l'objet "points". Tu peux la modifier à loisir. Un "repaint" affiche les modifications.
Voici le code minimal :
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
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 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; public class Carte extends JPanel implements MouseListener, MouseMotionListener { public static void main( String[] arg ) throws IOException { JFrame frame = new JFrame(); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); Carte carte = new Carte( new File( "grand.jpg" ) ); JTabbedPane tabbed = new JTabbedPane(); tabbed.add( "premier", carte.getJScrollPane() ); frame.getContentPane().add( tabbed ); frame.setSize( 640, 480 ); frame.setVisible( true ); } private static final long serialVersionUID = 1L; private BufferedImage fond; private BufferedImage points; private Point deplaceSouris = null; private JScrollPane scroll; public Carte( File fichierCarte ) throws IOException { fond = ImageIO.read( fichierCarte ); points = new BufferedImage( fond.getWidth(), fond.getHeight(), BufferedImage.TYPE_INT_ARGB ); addMouseListener( this ); addMouseMotionListener( this ); scroll = new JScrollPane( this ); } public JScrollPane getJScrollPane() { return scroll; } @Override public void paintComponent( Graphics g ) { g.drawImage( fond, 0, 0, this ); g.drawImage( points, 0, 0, this ); } @Override public Dimension getPreferredSize() { return new Dimension( getWidth(), getHeight() ); } @Override public int getHeight() { return fond.getHeight(); } @Override public int getWidth() { return fond.getWidth(); } @Override public void mouseReleased( MouseEvent e ) { if( e.getButton() == MouseEvent.BUTTON1 ) { Graphics g = points.createGraphics(); g.setColor( Color.BLACK ); g.drawString( "(" + e.getX() + ", " + e.getY() + ")", e.getX(), e.getY() ); g.dispose(); repaint(); } else { deplaceSouris = null; } } @Override public void mousePressed( MouseEvent e ) { if( e.getButton() == MouseEvent.BUTTON3 ) { deplaceSouris = new Point( e.getX(), e.getY() ); } } @Override public void mouseDragged( MouseEvent e ) { if( deplaceSouris != null ) { Point viewPoint = scroll.getViewport().getViewPosition(); viewPoint.translate( deplaceSouris.x - e.getX(), deplaceSouris.y - e.getY() ); //ne pas deplacer l'image en dehors de la vue en horizontal if( viewPoint.x < 0 ) { viewPoint.x = 0; } else if( viewPoint.x > this.getWidth() - scroll.getViewport().getWidth() ) { viewPoint.x = this.getWidth() - scroll.getViewport().getWidth(); } //ne pas deplacer l'image en dehors de la vue en vertical if( viewPoint.y < 0 ) { viewPoint.y = 0; } else if( viewPoint.y > this.getHeight() - scroll.getViewport().getHeight() ) { viewPoint.y = this.getHeight() - scroll.getViewport().getHeight(); } scroll.getViewport().setViewPosition( viewPoint ); } } @Override public void mouseClicked( final MouseEvent e ){} @Override public void mouseEntered( MouseEvent e ){} @Override public void mouseExited( MouseEvent e ){} @Override public void mouseMoved( MouseEvent e ){} }
Bon, faisons le point.
Je ne suis pas assez qualifié pour comprendre le source de dinobogan, ce que je trouve dommage et d'un autre cotés, j'aimerais essayer d'aller vers cette solution.
La seule chose que j'ai pu comprendre c'est que c'est une extension d'un composant. Oui mais alors comment il s'initialise, comment il peut être utilisé depuis le programme principal?
Je pense qu'un exemple, plus simple, avant de coder une autre solution sera la bienvenue.
Cordialement.
Tu regardes de quel composant il hérite (ici JPanel).
Normalement il y a un constructeur de défini, donc ça fonctionne comme pour n'importe quel composant.
Tu peux utiliser toutes les méthodes du composant père (qui seront soit celles du composant père, soit celle du fils si elles ont été redéfinies dans la classe - par exemple paintComponent() ou getPreferredSize() ici - le choix sera fait par la machine virtuelle)
Ah ! Excuse-moi. Je n'avais pas compris que tu n'avais pas compris :roll:
Citation:
La seule chose que j'ai pu comprendre c'est que c'est une extension d'un composant. Oui mais alors comment il s'initialise, comment il peut être utilisé depuis le programme principal?
Je pense qu'un exemple, plus simple, avant de coder une autre solution sera la bienvenue.
Cordialement.
Faire plus simple, ça ne va pas être facile. Je préfère tenter de t'expliquer mon programme, libre à toi de poser des questions supplémentaires ;)
La classe Carte, qui s'utilise exactement comme un JPanel. Mais puisqu'elle étend cette classe, on va pouvoir ajouter/modifier/supprimer certains comportements et fonctionnalités de JPanel. La classe Carte va notamment gérer elle-même les méthodes de gestion de souris.Code:
1
2 public class Carte extends JPanel implements MouseListener, MouseMotionListener {
La méthode "main". Comme tu peux voir, l'objet Carte est utilisé comme un JPanel classique à la différence près que le JScrollPane est une donnée membre de Carte. En effet, Carte a besoin de controler le JScrollPane. Une autre solution aurait été de donner une instance d'un JScrollPane dans le constructeur de Carte.Code:
1
2
3
4
5
6
7
8
9
10
11
12 public static void main( String[] arg ) throws IOException { JFrame frame = new JFrame(); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); Carte carte = new Carte( new File( "grand.jpg" ) ); JTabbedPane tabbed = new JTabbedPane(); tabbed.add( "premier", carte.getJScrollPane() ); frame.getContentPane().add( tabbed ); frame.setSize( 640, 480 ); frame.setVisible( true ); }
Les données membres.Code:
1
2
3
4
5
6
7 private static final long serialVersionUID = 1L; private BufferedImage fond; //l'image de fond private BufferedImage points; //l'image qu'on va modifier au runtime private Point deplaceSouris = null; //mémoriser la souris au premier clic private JScrollPane scroll; //le scroll pane à controler
Le constructeur de Carte : en paramètre le fichier contenant l'image qui ne bougera pas. On construit l'image fixe (fond) et l'image qui sera modifiée (points). On ajoute les différents listeners et on créé le JScrollPane. Notre Carte (qui peut être considérée comme un JPanel) dont l'instance est atteinte par le mot clé "this" est placée dans le JScrollPane.Code:
1
2
3
4
5
6
7
8
9 public Carte( File fichierCarte ) throws IOException { fond = ImageIO.read( fichierCarte ); points = new BufferedImage( fond.getWidth(), fond.getHeight(), BufferedImage.TYPE_INT_ARGB ); //création image transparente addMouseListener( this ); //controler les boutons de souris et la position du curseur addMouseMotionListener( this ); //controler les mouvements de curseur scroll = new JScrollPane( this ); }
Accéder au JScrollPane qui contient la Carte. Permet de placer le JScrollPane avec sa Carte dans une JFrame par exemple, ce qui est effectué dans du code externe (ici, la méthode main).Code:
1
2
3
4
5
6 public JScrollPane getJScrollPane() { return scroll; }
Ici, probablement la méthode la plus importante : elle permet de modifier complètement l'apparence graphique du JPanel surchargé. Une instance de Graphics est donnée en paramètre, il suffit de l'utiliser pour dessiner tout ce que l'on souhaite. Ici, on dessine l'image de fond, puis l'image "points" qui contient principalement des zone transparentes, permettant de voir "fond".Code:
1
2
3
4
5
6
7 @Override public void paintComponent( Graphics g ) { g.drawImage( fond, 0, 0, this ); g.drawImage( points, 0, 0, this ); }
Surcharge de la méthode pour calculer nous même la taille du composant. On va utiliser les méthodes surchargée ci-dessous :Code:
1
2
3
4
5
6 @Override public Dimension getPreferredSize() { return new Dimension( getWidth(), getHeight() ); }
Surcharge des méthodes pour connaitre la longueur et la largeur du composant. Il va prendre la taille de l'image "fond", construite à partir du paramètre transmis au constructeur.Code:
1
2
3
4
5
6
7
8
9
10
11
12 @Override public int getHeight() { return fond.getHeight(); } @Override public int getWidth() { return fond.getWidth(); }
Le code suivant permet deux choses : afficher du texte lors d'un clic gauche et déplacer l'image en restant appuyé sur le bouton droit. Ces méthodes sont appelées automatiquement par les listeners :
Appelée chaque fois qu'un bouton de souris est relaché.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 @Override public void mouseReleased( MouseEvent e ) { if( e.getButton() == MouseEvent.BUTTON1 ) { Graphics g = points.createGraphics(); g.setColor( Color.BLACK ); g.drawString( "(" + e.getX() + ", " + e.getY() + ")", e.getX(), e.getY() ); g.dispose(); repaint(); } else { deplaceSouris = null; } }
Si c'est le gauche, on affiche du texte sur l'image "points" à l'endroit du curseur puis on demande de repeindre le composant.
Si c'est le droit, on termine le déplacement en mettant notre objet de sauvegarde de position à null.
Appelée chaque fois qu'un bouton souris est appuyé.Code:
1
2
3
4
5
6
7
8
9 @Override public void mousePressed( MouseEvent e ) { if( e.getButton() == MouseEvent.BUTTON3 ) { deplaceSouris = new Point( e.getX(), e.getY() ); } }
Si c'est le droit, on mémorise la position du curseur.
Appelée chaque fois que le curseur se déplace avec un bouton appuyé. Attention à faire du code très léger ou créer un Thread, sinon ça va ramer un maximum !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
26
27
28
29
30
31
32 @Override public void mouseDragged( MouseEvent e ) { if( deplaceSouris != null ) { Point viewPoint = scroll.getViewport().getViewPosition(); viewPoint.translate( deplaceSouris.x - e.getX(), deplaceSouris.y - e.getY() ); //ne pas deplacer l'image en dehors de la vue en horizontal if( viewPoint.x < 0 ) { viewPoint.x = 0; } else if( viewPoint.x > this.getWidth() - scroll.getViewport().getWidth() ) { viewPoint.x = this.getWidth() - scroll.getViewport().getWidth(); } //ne pas deplacer l'image en dehors de la vue en vertical if( viewPoint.y < 0 ) { viewPoint.y = 0; } else if( viewPoint.y > this.getHeight() - scroll.getViewport().getHeight() ) { viewPoint.y = this.getHeight() - scroll.getViewport().getHeight(); } scroll.getViewport().setViewPosition( viewPoint ); } }
On va modifier la position du composant se trouvant dans le JScrollPane. On va aussi calculer la position pour ne pas faire "sortir" le composant de la vue du JScrollPane.
Ces méthodes ne sont pas utiles pour cet exemple mais on est obligé de les déclarer car elles font parties des interfaces implémentées par la classe Carte.Code:
1
2
3
4
5
6
7
8
9
10
11 @Override public void mouseClicked( final MouseEvent e ){} @Override public void mouseEntered( MouseEvent e ){} @Override public void mouseExited( MouseEvent e ){} @Override public void mouseMoved( MouseEvent e ){} }
Bon courage ;)
Effectivement, expliqué comme cela, ça fait moins peur. :ccool:
Si je reprend un peu, car je pense faire par étape. En admettant que j'utilise cette méthode qui ma l'air bien complète, il faudrait que je face comment depuis le programme principal pour affiche quelque chose?
J'entends par là que si je ne fait qu'écrire carte(); ca ne suffira pas. Il faudra bien que je transmette l'url de l'image, et chaque points ainsi que chaque texte de points. D'où ma nouvelle question. Comment on y accède ?
Désolé d'être aussi noob mais je découvre totalement le graphisme en java. Et jamais fait de code orienté graphisme avant :calim2:
Bref ca me passionne.
Cordialement.
Tu reprends la méthode "main" et tu analyses chaque ligne. Je ne connais pas ton code. Un objet "Carte" s'utilise comme un composant ordinaire.
Tu fournis le chemin de l'image au constructeur de "Carte". Si c'est une URL, alors tu dois adapter le code pour utiliser une java.net.URL.Citation:
J'entends par là que si je ne fait qu'écrire carte(); ca ne suffira pas. Il faudra bien que je transmette l'url de l'image
Je n'ai pas écrit le code pour faire ça. Pour le moment, c'est le composant lui-même qui gère les points et les textes en interne. Libre à toi d'ajouter une méthode public sur l'objet pour ajouter un texte à un endroit précis sur l'image "points". Tu peux t'inspirer de la méthode "mouseReleased".Citation:
, et chaque points ainsi que chaque texte de points. D'où ma nouvelle question. Comment on y accède ?