Implémentation des boutons Précédent/Avant dans Swing
Approche initiale
Le code fourni utilise des piles pour gérer la navigation à l'écran. Cependant, il nécessite du raffinement pour fonctionner correctement. Le problème réside dans l’implémentation de la méthode change_display. Plus précisément, il existe un potentiel de boucle de pile infinie lors de la navigation entre les écrans. En cliquant sur « Retour », le panneau actuel est poussé sur la pile previousPanels et récupéré de la pile forwardPanels lorsque vous cliquez sur « Suivant ». Cependant, il est possible que le même panneau soit poussé et retiré à plusieurs reprises sur et depuis les deux piles. Ce scénario peut se produire lors de la visite d'écrans de manière non linéaire.
Approche alternative utilisant CardLayout
Pour résoudre les problèmes liés à l'approche basée sur la pile, une solution alternative l'utilisation de CardLayout est proposée. CardLayout permet la gestion efficace de plusieurs panneaux dans un seul conteneur. Chaque panneau se voit attribuer un identifiant unique qui fait office de nom. Lors de la navigation entre les panneaux, le CardLayout peut être utilisé pour basculer vers le panneau souhaité en utilisant son nom comme clé.
Voici une implémentation utilisant CardLayout :
import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.util.Random; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; /** @see http://stackoverflow.com/questions/5654926 */ public class CardPanel extends JPanel { private static final Random random = new Random(); private static final JPanel cards = new JPanel(new CardLayout()); private final String name; public CardPanel(String name) { this.name = name; this.setPreferredSize(new Dimension(320, 240)); this.setBackground(new Color(random.nextInt())); this.add(new JLabel(name)); } @Override public String toString() { return name; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { create(); } }); } private static void create() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); for (int i = 1; i < 9; i++) { CardPanel p = new CardPanel("Panel " + String.valueOf(i)); cards.add(p, p.toString()); } JPanel control = new JPanel(); control.add(new JButton(new AbstractAction("\u22b2Prev") { @Override public void actionPerformed(ActionEvent e) { CardLayout cl = (CardLayout) cards.getLayout(); cl.previous(cards); } })); control.add(new JButton(new AbstractAction("Next\u22b3") { @Override public void actionPerformed(ActionEvent e) { CardLayout cl = (CardLayout) cards.getLayout(); cl.next(cards); } })); f.add(cards, BorderLayout.CENTER); f.add(control, BorderLayout.SOUTH); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } }
Dans cette implémentation, le La classe CardPanel représente des écrans individuels. Chaque écran a un nom unique qui correspond à sa clé dans le CardLayout. Le panneau des cartes utilise le CardLayout et affiche l'écran correspondant à la carte actuelle.
Les boutons de navigation (étiquetés "Précédent" et "Suivant") sont situés dans le panneau de commande. Ces boutons invoquent des actions pour avancer ou régresser dans la séquence de cartes.
Cette approche offre une expérience de navigation plus intuitive et plus stable, éliminant les problèmes potentiels associés à la mise en œuvre basée sur la pile.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!