// -*- Coding: utf-8 -*- // Time-stamp: <Layouts.java 14 déc 2015 08:37:56> import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * Application pour tester les gestionnaires de disposition * @author O. Carton * @version 1.0 */ class Layouts extends JFrame { public Layouts () { // Titre setTitle("Gestionnaires de disposition"); // Action à faire lorsque la fenêtre est fermée. setDefaultCloseOperation(EXIT_ON_CLOSE); // Panneau principal JPanel mainPanel = new JPanel(new BorderLayout()); // Panneau pour les boutons et le menu JPanel buttonPanel = new JPanel(); // Ajout du panneau de boutons en haut du panneau principal mainPanel.add(buttonPanel, BorderLayout.NORTH); // Panneau dynamique // Cette variable de classe est finale car elle est utilisée // dans les classes anonymes implémentant l'interface // ActionListener. final DynamicPanel dynamicPanel = new DynamicPanel(); // Ajout d'un bord au panneau dynamique dynamicPanel.setBorder(BorderFactory.createLineBorder(Color.black)); // Panneau vertical JPanel columnPanel = new JPanel(); // Postionnement vertical columnPanel.setLayout(new BoxLayout(columnPanel, BoxLayout.Y_AXIS)); // Glue pour le haut columnPanel.add(Box.createVerticalGlue()); // Panneau horizontal JPanel linePanel = new JPanel(); linePanel.setLayout(new BoxLayout(linePanel, BoxLayout.X_AXIS)); // Glue pour la gauche linePanel.add(Box.createHorizontalGlue()); // Ajout du panneau dynamique au panneau horizontal linePanel.add(dynamicPanel); // Glue pour la droite linePanel.add(Box.createHorizontalGlue()); // Ajout du panneau horizontal au panneau vertical columnPanel.add(linePanel); // Glue pour le bas columnPanel.add(Box.createVerticalGlue()); // Ajout du panneau vertical au panneau principal mainPanel.add(columnPanel, BorderLayout.CENTER); // Bouton d'ajout JButton addButton = new JButton("Add"); // Ajout du bouton dans le panneau de boutons buttonPanel.add(addButton); // Partie contrôleur du bouton addButton.addActionListener(new ActionListener () { public void actionPerformed(ActionEvent e) { dynamicPanel.add(); } }); // Bouton de Reset JButton resetButton = new JButton("Reset"); // Ajout du bouton dans le panneau de boutons buttonPanel.add(resetButton); // Partie contrôleur du bouton resetButton.addActionListener(new ActionListener () { public void actionPerformed(ActionEvent e) { dynamicPanel.reset(); } }); // Menu pour choisir le gestionnaire de disposition // Chaînes pour le menu String[] layoutStrings = {"FlowLayout (left)", "FlowLayout (center)", "FlowLayout (right)", "BorderLayout", "GridLayout (3 lines)", "GridLayout (3 columns)", "BoxLayout (line)", "BoxLayout (column)" }; // Implémentation du menu par une Combo-Box final JComboBox comboBox = new JComboBox(layoutStrings); comboBox.setSelectedIndex(1); // FlowLayout (centre) // Ajout du menu dans le panneau de boutons buttonPanel.add(comboBox); // Partie contrôleur du menu comboBox.addActionListener(new ActionListener () { // Cette méthode change le gestionnaire de disposition du // panneau dynamique en fonction du choix de l'utilisateur // dans le menu. // Un nouveau gestionnaire est créé à chaque fois que // le menu est utilisé. public void actionPerformed(ActionEvent event) { LayoutManager layout = null; // Layout sélectionné switch (comboBox.getSelectedIndex()) { case 0: // FlowLayout (gauche) layout = new FlowLayout(FlowLayout.LEFT); break; case 1: // FlowLayout (centre) layout = new FlowLayout(FlowLayout.CENTER); break; case 2: // FlowLayout (droite) layout = new FlowLayout(FlowLayout.RIGHT); break; case 3: // BorderLayout layout = new BorderLayout(); break; case 4: // GridLayout (3 lignes) layout = new GridLayout(3,0,5,3); break; case 5: // GridLayout (3 colonnes) layout = new GridLayout(0,3,5,3); break; case 6: // BoxLayout (ligne) layout = new BoxLayout(dynamicPanel, BoxLayout.X_AXIS); break; case 7: // BoxLayout (colonne) layout = new BoxLayout(dynamicPanel, BoxLayout.Y_AXIS); break; } // Force le panneau à repositionner les boutons. dynamicPanel.setLayout(layout); dynamicPanel.doLayout(); dynamicPanel.revalidate(); } }); // Mise en place du panneau principal dans la fenêtre setContentPane(mainPanel); } public static void main(String [] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { // Création de la fenêtre Layouts ly = new Layouts(); // Affichage de la fenêtre ly.pack(); ly.setVisible(true); } }); } } /** Panneau dynamique */ class DynamicPanel extends JPanel implements ActionListener { final int width = 300; // Largeur souhaitée du panneau final int height = 200; // Hauteur souhaitée du panneau int buttonsNumber = 0; // Compteur de boutons dans le panneau JPopupMenu popup; // Popup Menu des boutons // Actions possibles sur les boutons du panneau dynamique final String ENLARGE = "ENLARGE"; // Augmenter la taille d'un bouton final String REDUCE = "REDUCE"; // Diminuer la taille d'un bouton final String REMOVE = "REMOVE"; // Supprimer un bouton // Constructeur public DynamicPanel() { // Dimensions souhaitées du panneau setPreferredSize(new Dimension(width, height)); // Création du popup menu et des entrées popup = new JPopupMenu(); JMenuItem enlargeItem = new JMenuItem("Enlarge"); enlargeItem.setActionCommand(ENLARGE); enlargeItem.addActionListener(this); popup.add(enlargeItem); JMenuItem reduceItem = new JMenuItem("Reduce"); reduceItem.setActionCommand(REDUCE); reduceItem.addActionListener(this); popup.add(reduceItem); JMenuItem removeItem = new JMenuItem("Remove"); removeItem.setActionCommand(REMOVE); removeItem.addActionListener(this); popup.add(removeItem); } // Ajout d'un nouveau bouton au panneau void add() { // Création d'un bouton JButton button = new JButton(Integer.toString(buttonsNumber)); // Le panneau dynamique reçoit les événements de ce bouton // button.addActionListener(this); button.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { popup.show(e.getComponent(), e.getX(), e.getY()); } public void mouseReleased(MouseEvent e) { popup.show(e.getComponent(), e.getX(), e.getY()); } }); // Ajout du bouton au panneau dynamique // Les cinq premiers boutons sont ajoutés avec les contraintes // NORTH, WEST, CENTER, EAST et SOUTH pour qu'ils se placent // correctement lorsque le gestionnaire est un BorderLayout. // Sinon, ces contraintes n'ont aucun effet. switch(buttonsNumber) { case 0: add(button, BorderLayout.NORTH); break; case 1: add(button, BorderLayout.WEST); break; case 2: add(button, BorderLayout.CENTER); break; case 3: add(button, BorderLayout.EAST); break; case 4: add(button, BorderLayout.SOUTH); break; default: // Ajout sans contrainte par défaut add(button); } // Incrémentation du compteur de boutons buttonsNumber++; // Redessin du panneau revalidate(); repaint(); } /* Multiplication par 2 des dimensions */ private void multiplyBy2(Dimension from, Dimension to) { to.height = from.height * 2; to.width = from.width * 2; } /* Division par 2 des dimensions */ private void divideBy2(Dimension from, Dimension to) { to.height = from.height / 2; to.width = from.width / 2; } // Dimensions multipliées par 2 private void enlarge(JComponent c) { // Dimension actuelle Dimension dim = c.getPreferredSize(); // Dimension minimum Dimension min = c.isMinimumSizeSet() ? c.getMinimumSize() : new Dimension(); // Dimension preférée Dimension pre = c.isPreferredSizeSet() ? c.getPreferredSize() : new Dimension(); // Dimension maximum Dimension max = c.isMaximumSizeSet() ? c.getMaximumSize() : new Dimension(); // Calcul min.setSize(dim); multiplyBy2(dim, pre); multiplyBy2(pre, max); // Mise en place c.setPreferredSize(pre); c.setMinimumSize(min); c.setMaximumSize(max); } // Dimensions divisées par 2 private void reduce(JComponent c) { // Dimension actuelle Dimension dim = c.getPreferredSize(); // Dimension preférée Dimension pre = c.isPreferredSizeSet() ? c.getPreferredSize() : new Dimension(); // Dimension minimum Dimension min = c.isMinimumSizeSet() ? c.getMinimumSize() : new Dimension(); // Dimension maximum Dimension max = c.isMaximumSizeSet() ? c.getMaximumSize() : new Dimension(); // Calculs max.setSize(dim); divideBy2(dim, pre); divideBy2(pre, min); // Mise en place c.setPreferredSize(pre); c.setMinimumSize(min); c.setMaximumSize(max); } // Supression de tous les boutons du panneau public void reset() { // Suppression de tous les boutons removeAll(); buttonsNumber = 0; // Redessin du panneau revalidate(); repaint(); } // Écoute des entrées du popup menu public void actionPerformed(ActionEvent event) { // Bouton source du popup menu JButton source = (JButton) popup.getInvoker(); // Action à effectuer sur le bouton String action = event.getActionCommand(); // Action effectuée if (action == ENLARGE) enlarge(source); else if (action == REDUCE) reduce(source); else if (action == REMOVE) remove(source); // Redessin du panneau revalidate(); repaint(); } }