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

 Java Discussion :

Poignées de redimensionnement pour image


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut Poignées de redimensionnement pour image
    Bonjour, je me retrouve confronté à un petit soucis.

    Je développe une petite appli de calcul sur image.

    Le principe est simple, j'affiche une image de fond et je viens poser une autre image par au dessus.

    Le but est de pouvoir déplacer l'image du dessus, de la redimensionner et de la faire devenir transparente.

    Pour l'instant j'arrive à le faire en utilisant 4 boutons pour la redimensionner en largeur et hauteur.

    Cependant j'aimerai avoir un effet de "poignées" comme lorsqu'on sélectionne une image sous photoshop (les 4 carrés aux coins et au centre des cotés)

    Or, j'ai questionné google et les outils de recherche du forum je ne trouve rien.

    Est ce que cette fonctionnalité existe sous java ?

    Merci.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Non, rien n'est prévu "out of the box".
    A vue de nez, il faudrait faire la chose suivante :
    1) Placer l'image de fond dans un JPanel
    2) Placer l'image du dessus dans un autre JPanel non opaque
    3) Superposer les 2 JPanels
    4) ajouter des évènements souris sur le JPanel du dessus qui feront que si on clique dessus
    une bordure avec poignées (à programmer) apparaisse.

    Avantage, le redimensionnement est relativement facile à programmer
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    Merci à toi pour ta réponse.

    Du coup comme ça n'existe pas, j'ai arrêté de chercher.
    J'ai donc commencé à fabriquer une Classe de JLabel "Cliquable" intégrant le redimensionnement par poignées.

    Si j’aboutis je laisserai le code ici pour qu'il puisse servir.

    Pour l'instant ça marche pas trop mal.

    lorsque je clique, les poignées apparaissent tout bien.

    petit détail, gérer la "dé-sélection" J'aimerais que lorsque je clique ailleurs sur ma frame mon JLabelHandle (je l'ai appelé comme ça) se rende compte tout seul qu'il n'a plus le focus et fasse disparaitre les poignées.

    C'est possible de coder un évènement comme celui là ?

    Pour l'instant je contourne le problème, ma frame prévient le composant, ça fonctionne très bien, mais ce serait plus élégant si les poignées disparaissaient de manière automatique.

    Merci pour vos éclairages.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Le composant ne peut pas se rendre compte qu'il n 'est plus sélectionné.
    Tu dois créer une méthode "quelque part dans ton application" qui va contenir la référence du composant sélectionné : ce que tu as fait avec la notification en provenance de la JFrame
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    Bon, ben ça y est, ça existe "Out of the box"

    J'ai tellement piqué ou me suis inspiré de tellement de code ici que je laisse celui ci en retour, il rendra peut être service à quelqu'un.

    Le composant permet de sélectionner et de redimensionner une ImageIcon à la volée.

    Il mériterait sans doute d'être amélioré, chacun fera comme il le souhaite. En tout cas il fonctionne "clé en main"

    Petite question cependant, est il possible transformer ce composant pour l'utiliser à l'avenir en faisant un simple import JLabelHandle ?

    Je me doute que oui, mais je ne sais pas encore faire...

    Merci en tout cas pour les réponses.

    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
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
     
    import java.awt.Color;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
     
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
     
    import javax.swing.border.BevelBorder;
     
     
    public class JLabelHandle extends JLabel{
    private ImageIcon im = new ImageIcon();
    final private ImageIcon imori= new ImageIcon();
    private JLabel label;
     
    private boolean isSelected= false;
    private boolean onResize= false;
     
    private boolean nResize= false;
    private boolean sResize= false;
    private boolean eResize= false;
    private boolean wResize= false;
     
    public static int ps=3;
     
     
     
    	public JLabelHandle(ImageIcon icone){
    		super();
    		im.setImage(icone.getImage());	
    		label = new JLabel(im);
    		im.setImage(icone.getImage());		
    		imori.setImage(icone.getImage());	
    		label.setSize(im.getIconWidth(), im.getIconHeight());
    		this.add(label);
    		this.setPreferredSize(new Dimension(im.getIconWidth()+ps*2, im.getIconHeight()+ps*2));
    		label.setLocation(ps, ps);
     
     
     
    //-----------------------------------------------------------------------
    class Souris implements MouseListener{
     
    			@Override
    			public void mouseClicked(MouseEvent e) {
    				// TODO Auto-generated method stub
    				isSelected=true;
    				repaint();
    			}
     
    			@Override
    			public void mouseEntered(MouseEvent e) {
    				// TODO Auto-generated method stub
     
    			}
     
    			@Override
    			public void mouseExited(MouseEvent e) {
    				// TODO Auto-generated method stub
     
    			}
     
    			@Override
    			public void mousePressed(MouseEvent e) {
    				// TODO Auto-generated method stub
    				if (( getCursor().getType() ==Cursor.N_RESIZE_CURSOR)||( getCursor().getType() ==Cursor.E_RESIZE_CURSOR)||( getCursor().getType() ==Cursor.S_RESIZE_CURSOR)||( getCursor().getType() ==Cursor.W_RESIZE_CURSOR)) {onResize=true;} else {onResize=false;}
     
    			}
     
    			@Override
    			public void mouseReleased(MouseEvent e) {
    				// TODO Auto-generated method stub
    				if (onResize) {
     
    					Image source = imori.getImage();
    					label.setSize(getWidth()-ps*2, getHeight()-ps*2);
    					Image trans = source.getScaledInstance(label.getWidth(), label.getHeight(), Image.SCALE_SMOOTH);
    					im.setImage(trans);
    		        	label.revalidate();
    		        	label.repaint();
    		        	setPreferredSize(new Dimension(label.getWidth()+ps*2, label.getHeight()+ps*2));
    		        	revalidate();
    		        	repaint();
    		        	onResize=false;
    		        	nResize= false;
    		        	sResize= false;
    		        	eResize= false;
    		        	wResize= false;
     
     
     
     
    					}
     
    			}}
    //-----------------------------------------------------------------------
     
    //-----------------------------------------------------------------------
     
    class MotionSouris implements MouseMotionListener{
     
    	@Override
    	public void mouseDragged(MouseEvent e) {
    		// TODO Auto-generated method stub
    		//System.out.println("je rentre");
     
    		if ((isSelected) && !( getCursor().getType() ==Cursor.MOVE_CURSOR)) {
     
    			if ( sResize) {
    																onResize=true;
    																setSize(getWidth(),e.getY());
    																repaint();
    																}
     
    			if (eResize) {
    																	onResize=true;
    																	setSize(e.getX(),getHeight());
    																	repaint();
    																	}
    			if (wResize) {
    				onResize=true;
     
    				Point point = getLocation();
    				setLocation(point.x+e.getX(),point.y);
    				setSize(getWidth()- e.getX(),getHeight());
    				repaint();
    				}
     
    			if (nResize) {
    				onResize=true;
    				Point point = getLocation();
    				setLocation(point.x,point.y+e.getY());
    				setSize(getWidth(),getHeight()-e.getY());
    				repaint();
    				}
     
    		}
     
    	}
     
    	@Override
    	public void mouseMoved(MouseEvent e) {
    		// TODO Auto-generated method stub
    	if (getCursor().getType() !=Cursor.MOVE_CURSOR)
    		if (isSelected) {
    			setCursor(new Cursor(0));
    			if (e.getY()>=(getHeight()-ps*4) ) {setCursor(new Cursor(Cursor.S_RESIZE_CURSOR));
    												nResize= false;
    												sResize= true;
    												eResize= false;
    												wResize= false;
    												}
    			if (e.getY()<=(ps*4) ) {setCursor(new Cursor(Cursor.N_RESIZE_CURSOR));
    									nResize=true;
    									sResize= false;
    						        	eResize= false;
    						        	wResize= false;
    									}
    			if (e.getX()>=(getWidth()-ps*4))  {setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
     
    												nResize= false;
    									        	sResize= false;
    									        	eResize= true;
    									        	wResize= false;
    												}
    			if (e.getX()<=(ps*4))  {setCursor(new Cursor(Cursor.W_RESIZE_CURSOR));
    									wResize=true;
    									nResize= false;
    						        	sResize= false;
    						        	eResize= false;
     
    									}
     
     
    		} else {setCursor(new Cursor(0));};
    		}
     
    	}
     
     
    //-----------------------------------------------------------------------
     
    		Souris souris = new Souris();
    		MotionSouris motionsouris = new MotionSouris();
     
    		label.addMouseListener(souris);
    		label.addMouseMotionListener(motionsouris); 
    		this.addMouseListener(souris);
    		this.addMouseMotionListener(motionsouris);
     
    	}
     
    	 public void paintComponent(Graphics g){    
     
    	     if (isSelected){
    		  g.setColor(Color.black);
    	      g.fillRect(0, 0, ps*2	, ps*2);
    	      g.fillRect(this.getWidth()-ps*2, 0, ps*2, ps*2);
    	      g.fillRect(0, this.getHeight()-ps*2, ps*2, ps*2);
    	      g.fillRect(this.getWidth()-ps*2, this.getHeight()-ps*2, ps*2	, ps*2);
    	      g.fillOval(0, this.getHeight()/2-ps, ps*2, ps*2);
    	      g.fillOval(this.getWidth()/2-ps, 0, ps*2, ps*2);
    	      g.fillOval(this.getWidth()-ps*2, this.getHeight()/2-ps*2, ps*2, ps*2);
    	      g.fillOval(this.getWidth()/2-ps, this.getHeight()-ps*2, ps*2, ps*2);
    	      g.drawRect(ps-1, ps-1, this.getWidth()-ps*2+1, this.getHeight()-ps*2+1);
    	   }       
    	     }
     
    	 public void setSelected(boolean b){isSelected=b; repaint();}
     
    	 public boolean getSelectedState(){return isSelected;}
     
    public void setHandleSize(int width, int height) {
     
    		 this.setSize(width+ps*2,height+ps*2);
    		 label.setSize(width, height);
    		 label.setLocation(ps, ps);
    		 this.repaint();
     
     
    	 }
     
     
    }

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Oui, il faut
    - mettre ta classe JLabelHandle dans un fichier jar
    - ajouter ce jar aux projets qui en ont besoin
    ça s'appelle créer une bibliothèque
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    Ok, merci bien, je vais tenter de faire ça quand le besoin s'en fera sentir.
    J'ai trouvé pas mal d'info dessus.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Poignée de redimensionnement pour un Userform
    Par mobiclick dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/10/2010, 23h58
  2. [ImageMagick] Problème dans le code pour redimensionner une image
    Par pierrot10 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 08/06/2007, 14h06
  3. [GD] Problème de boucle pour redimensionner plusieurs images ...
    Par jimmyneutron dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 10/04/2007, 17h46
  4. Réponses: 4
    Dernier message: 01/02/2007, 19h32
  5. [FLASH 8] Probleme de pour redimensionner une image
    Par julien.63 dans le forum Flash
    Réponses: 2
    Dernier message: 22/11/2006, 17h49

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