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 :

ImageIcon & Scintillement


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut ImageIcon & Scintillement
    Bonsoir, je teste un effet mouseEntered sur un Jlabel contenant une image.
    A l'entrée de la souris se déclenche un grossissement de l'image jusqu'à une valeur limite.
    Ce doit être très bref et limpide, lol.

    Or, je n'y arrive pas...
    J'ai lu pas mal de topics sur le double buffering, etc...
    Mais je ne pense pa que ce soit ce dont j'ai besoin...

    En fait j'ai remarqué que le scintillement apparait uniquement pour les images de plus grandes tailles (selon mes paramètres bien sur), et sur une cadence timer très faible...

    Je pense que si je trouve une façon pour déclencher repaint() de mon label uniquement si l'image est chargée, j'aurais gagné, car à mon avis c'est juste un problème de timing : quand l'image est trop grosse ou que le timer se déclenche à intervalle trop rapprochées, l'image n'a plus le temps de se charger avant de s'afficher...

    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
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingConstants;
    import javax.swing.SwingWorker;
    import javax.swing.Timer;
    import java.awt.image.BufferStrategy;
     
     
    public class main_frame extends JFrame {
     
    	private final JLabel label = new JLabel();
    	private ImageIcon dos2;
    	private BufferStrategy bs;
    	private int w,h;
    	private Timer time;
    	private boolean painted = true;
     
    	/**
             * Create the frame
             */
    	public main_frame() {
    		super();
    		this.setSize(800,600);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		try {
    			jbInit();
    		} catch (Throwable e) {
    			e.printStackTrace();
    		}
    	}
    	private void jbInit() throws Exception {
    		getContentPane().setLayout(null);
     
    		label.setHorizontalAlignment(SwingConstants.CENTER);
    		label.setBounds(0,0, 250, 250);
    		w = 50;
    		h = 50;
    		dos2 = new ImageIcon(Toolkit.getDefaultToolkit().getImage("table_1.png").getScaledInstance(w,h,Image.SCALE_DEFAULT));
    		label.setIcon(dos2);
    		getContentPane().add(label);
    		label.addMouseListener(new LabelMouseListener());
    		time = createTimer();
    	}
     
    private Timer createTimer (){
    		ActionListener action = new ActionListener (){
    			public void actionPerformed (ActionEvent event){
    				new SwingWorker<Integer, String>() {
    					public Integer doInBackground(){
     
    							if(h<250){
    								painted = false;
    								h+=4;
    								w+=4;
    								dos2.setImage(Toolkit.getDefaultToolkit().getImage("table_1.png").getScaledInstance(w,h,Image.SCALE_DEFAULT));
    								label.setIcon(dos2);
    								//label.updateUI();
    								label.repaint();								
    							}
    							else{
    								time.stop();
    							}
     
     
    						//repaint();
    						return 0;
    					}
     
    				}.execute();
    			}
    		};
    		return new Timer (30, action);
    	}
    	private class LabelMouseListener extends MouseAdapter {
    		public void mouseEntered(MouseEvent arg0) {
    			label_mouseEntered(arg0);
    		}
    		public void mouseExited(MouseEvent arg0) {
    			label_mouseExited(arg0);
    		}
    	}
    	protected void label_mouseEntered(MouseEvent arg0) {
    		//System.out.println("Entered");
    		time.start();
    	} 
    	protected void label_mouseExited(MouseEvent arg0) {
    		//System.out.println("Exited");
    		h = 50;
    		w = 50;
    		dos2.setImage(Toolkit.getDefaultToolkit().getImage("table_1.png").getScaledInstance(w,h,Image.SCALE_DEFAULT));
    		label.setIcon(dos2);
    		label.repaint();
    		painted = true;
    		if(time.isRunning()){
    			time.stop();
    		}
    		repaint();
    	}
     
     
    }
    Je suis vraiment curieux de savoir comment m'en sortir!
    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu dois construire une image une fois pour toute. Lire l'image en permanence sur disque est une très mauvaise idée, et c'est en plus du travail inutile.
    Il te faut surcharger "paintComponent" du JLabel que tu utilises.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut ok
    Suis je obligé de créer une classe extends JLabel pour faire ca?
    On peut redimensionner l'icon avec ca?
    Je trouve pas grand chose pour l'instant.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par donnadieujulien Voir le message
    Suis je obligé de créer une classe extends JLabel pour faire ca?
    Non, mais ce serait plus propre. C'est le Label qui gère ses animations. C'est à lui de savoir comment les animations sont à faire. Il faut penser objet !

    On peut redimensionner l'icon avec ca?
    Je trouve pas grand chose pour l'instant.
    Dans "paintComponent", du dessine l'image (qui a été chargée une fois pour toute dans le constructeur) grâce à Graphics#drawImage.
    En spécifiant la longueur et la largeur, le redimensionnement sera effectué.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Et le getScaledInstance est aussi une mauvaise idée car non accéléré au niveau hardware, donc très lent.

    Mieux vaut passer par un bon vieux drawImage des familles dans une surcharge de paintComponent

  6. #6
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut ok
    Ok, pensez vous que j'aurais besoin d'un double buffering, ou ca va aller? Sachant que l'interface globale sera assez chargée....

    Il faut penser objet !
    Tout à faity d'accord, ce qui n'empèche pas de ne pas crée des classes dans le simple but d'en créer!

  7. #7
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut ok
    nickel!
    Juste en surchargant paint() ca marche sans problème!
    c'est cool!
    merci bcp

  8. #8
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En général en Swing il vaut mieux surcharger paintComponent pour juste réaliser du dessin sur un composant. Paint ayant des responsabilités plus grande. En effet paint contient des appels à paintBorder et paintChildren en plus de paintComponent au minimum.

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

Discussions similaires

  1. [debutant] ajouter ImageIcon dans un Jbutton
    Par agugu dans le forum Composants
    Réponses: 4
    Dernier message: 25/04/2004, 22h40
  2. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  3. ImageIcon
    Par mohamed dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/12/2003, 15h52
  4. [appli][Java2D]Pb scintillement Animation
    Par ddams dans le forum 2D
    Réponses: 2
    Dernier message: 25/04/2003, 11h57

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