2017-01-30 28 views
0

Je souhaite avoir un JFrame simple avec un JLabel (pour afficher les images en tant qu'icône) et un JSlider (pour basculer entre 40 images).Précharger les images à utiliser comme icône JLabel

Lorsque je charge les nouvelles images sur un événement StateChange du curseur, le programme devient très lent, surtout lorsque je glisse rapidement. Je pensais donc à précharger les 40 images et à les remplacer par le curseur. Est-ce intelligent et possible?

+2

Oui, il est possible. Nous ne pouvons pas vous aider avec des détails à ce stade parce que vous n'en avez pas donné. Pourquoi ne pas simplement l'essayer d'abord? Si vous ne le faites pas, comment saurons-nous quels problèmes vous pourriez avoir? –

+0

jeter un oeil à la classe 'java.awt.MediaTracker' et' ImageIcon' utilise aussi 'MediaTracker' si je ne me trompe pas - il est donc assez simple de précharger les images –

+1

Ne chargez pas les icônes directement dans l'écouteur d'événement. Utilisez 'javax.swing.Timer' avec un délai à la place. Ainsi, vous pouvez éviter le chargement des images non requises, lorsque l'utilisateur glisse rapidement (il suffit d'annuler l'ancienne et d'en démarrer une nouvelle). –

Répondre

2

Je suppose, vous avez quelque chose comme ceci:

public class MyClass { 
    // other declarations 
    private JLabel label; 
    // other methods 
    public void stateChange(ChangeEvent e) { 
     label.setIcon(new ImageIcon(...)); // here is code to determine name of the icon to load. 
       timer = null; 
    } 
} 

Qu'est-ce que vous avez besoin est de changer votre code comme suit:

public class MyClass { 
    // other declarations 
    private JLabel label; 
    private Timer timer; // javax.swing.Timer 
    // other methods 
    public void stateChange(ChangeEvent e) { 
     if (timer != null) { 
      timer.stop(); 
     } 
     timer = new Timer(250, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       label.setIcon(new ImageIcon(...)); // here is code to determine name of the icon to load. 
       timer = null; 
      } 
     }); 
     timer.setRepeats(false); 
     timer.start(); 
    } 
}