Maison > Java > javaDidacticiel > Comment implémenter une navigation arrière et avant efficace dans une application Swing ?

Comment implémenter une navigation arrière et avant efficace dans une application Swing ?

Barbara Streisand
Libérer: 2024-12-26 15:24:10
original
516 Les gens l'ont consulté

How to Implement Effective Back and Forward Navigation in a Swing Application?

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);
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal