Maison >Java >javaDidacticiel >Comment synchroniser la sélection du bouton bascule entre JToolBar et JMenu dans Swing ?

Comment synchroniser la sélection du bouton bascule entre JToolBar et JMenu dans Swing ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-20 08:05:14864parcourir

How to Synchronize Toggle Button Selection Between JToolBar and JMenu in Swing?

Swing : Lier des boutons à bascule avec un groupe de boutons et des éléments de menu

Dans le contexte d'une simple application de peinture avec des boutons de barre d'outils et des éléments de menu pour différentes formes, la question se pose : comment s'assurer que la sélection d'un bouton de la barre d'outils désélectionne les autres et sélectionne l'élément de menu correspondant, et vice-versa versa.

Bien que la classe ButtonGroup puisse gérer la sélection au sein d'un seul groupe de boutons, ce n'est peut-être pas la solution la plus appropriée pour gérer plusieurs groupes. De plus, cela introduit un risque de récursivité infinie si le menu modifie le bouton, et vice versa.

Une meilleure approche réside dans l'utilisation des Actions. L'interface Action permet à plusieurs composants, tels que des boutons et des éléments de menu, d'exécuter la même fonction. En utilisant la même action pour chaque groupe, vous pouvez garantir un comportement cohérent sans avoir besoin de gérer manuellement la sélection des boutons et le paramètre de forme.

Pour illustrer cela, l'extrait de code suivant montre comment partager des actions entre un JMenu et un JToolBar pour gérer les fichiers récents :

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JToolBar;

public class FileMenu {

    public void create() {
        File userDir = new File(System.getProperty("user.dir"));
        File[] files = userDir.listFiles();

        JMenu menu = new JMenu("Recent Files");
        JToolBar toolBar = new JToolBar(JToolBar.VERTICAL);
        JLabel label = new JLabel(" ", JLabel.CENTER);
        for (File f : files) {
            if (f.isFile() && !f.isHidden()) {
                RecentFile rf = new RecentFile(f, label);
                menu.add(new JMenuItem(rf.getAction()));
                toolBar.add(rf.getAction());
            }
        }
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(menu);

        JFrame f = new JFrame("FileMenu");
        f.setJMenuBar(menuBar);
        f.add(toolBar, BorderLayout.CENTER);
        f.add(label, BorderLayout.SOUTH);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    class RecentFile extends AbstractAction {

        private final File file;
        private final JLabel label;

        public RecentFile(final File file, final JLabel label) {
            this.file = file;
            this.label = label;
            this.putValue(Action.NAME, file.getName());
            this.putValue(Action.SHORT_DESCRIPTION, file.getAbsolutePath());
        }

        public void actionPerformed(ActionEvent e) {
            label.setText(file.getName());

        }

        public Action getAction() {
            return this;
        }
    }
}

En utilisant la même action pour les boutons de la barre d'outils et les éléments de menu, vous obtenez le comportement souhaité où la sélection d'un bouton désélectionne le autres et sélectionne l'élément de menu correspondant, et vice versa, sans aucune manipulation manuelle ni risque de récursion infinie.

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!

Déclaration:
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