2015-02-26 4 views
0

dans une application Java J'ai un Jlabel dont je veux assigner une nouvelle image à chaque fois que je clique sur un bouton, en utilisant une boucle for je peux l'afficher la dernière image sautant tout entre les images, je sais qu'il y a une erreur dans ma logique ici peut-être que je ne devrais pas utiliser une boucle for ?? des conseilspour un problème de boucle lorsque vous parcourez les images pour Jlabel avec le bouton click

private String imageList[]; 
ImageIcon image; 
imageList = new String[] {"src\\Tour_Eiffel_Wikimedia_Commons.jpg","src\\Ben.jpg", "src\\Rio.jpg", "src\\Liberty.jpg", "src\\Pyramid.jpg"}; 

//constructor setting first image to display on load 
public GeographyGameGUI() { 
     image = new ImageIcon(imageList[0]); 
      imageLbl.setIcon(image); 
} 

    //button method 
    private void nextBtnActionPerformed(java.awt.event.ActionEvent evt) {           


     for (imgCount = 1; imgCount < imageList.length; imgCount++) { 
      image = new ImageIcon(imageList[imgCount]); 
      imageLbl.setIcon(image); 

    } 

si je n'utiliser une boucle et il suffit d'utiliser un compteur (affiché ci-dessous) que je déclare en dehors de la méthode de boutonner correctement les boucles affichage des images, mais se heurte à un ArrayIndexOutOfBoundsException. Quelle est la meilleure pratique ici? merci

image = new ImageIcon(imageList[imgCount]); 
    imageLbl.setIcon(image); 
    imgCount++; 

Répondre

1

Votre compteur atteint la fin du tableau de sorte que vous obtenez une exception hors des limites. Après chaque incrément vous devez vérifier si la fin du tableau a été atteinte, et si oui, mettre le compteur à 0.

Si vous voulez parcourir quelques images avec un retard en un seul clic, vous devez utiliser SwingWorker. L'utilisation de retards dans votre programme d'écoute d'action suspend le processus de répartition des événements, ce qui signifie qu'aucune autre mise à jour ou interaction avec les composants de swing ne sera disponible (il est probable que les actualisations ne seront pas effectuées correctement).

Si vous effectuez quelques mises à jour (setIcon) en très peu de temps, Swing actualise généralement le composant après la dernière d'entre elles, ce qui signifie que seule la dernière image sera visible.

Jetez un oeil ici: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

2

Vous êtes essentiellement bloquer le thread Dispatching de l'événement, l'empêcher de mettre à jour l'interface utilisateur. Voir Concurrency in Swing pour plus de détails

Au lieu de cela, vous devez utiliser un javax.swing.Timer à boucle sur les images, ce qui permet l'interface utilisateur de mettre à jour avant de passer à la suivante ...

Voir How to use Swing Timers pour plus de détails.

tableaux Java sont nuls indexés, cela signifie que le premier élément du tableau est une position 0, non 1

Ne pas faire référence src directement dans votre code, le répertoire src n'existera une fois l'application construit et emballé

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JLabel label; 
     private String[] imageList = new String[] {"/Tour_Eiffel_Wikimedia_Commons.jpg","/Ben.jpg", "/Rio.jpg", "/Liberty.jpg", "/Pyramid.jpg"}; 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      label = new JLabel(); 
      add(label); 

      JButton btn = new JButton("Play"); 
      btn.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        btn.setEnabled(false); 
        Timer timer = new Timer(1000, new ActionListener() { 
         private int count; 
         @Override 
         public void actionPerformed(ActionEvent e) { 
          if (count < imageList.length) { 
           try { 
            label.setIcon(
              new ImageIcon(
                ImageIO.read(
                  TestPane.this.getClass().getResource(imageList[count])))); 
           } catch (IOException exp) { 
            exp.printStackTrace(); 
           } 
           count++; 
          } else { 
           ((Timer)e.getSource()).stop(); 
          } 
         } 
        }); 
        timer.stop(); 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

}