Blog de G. MOKOLOMBOKA

Ingénieur J2EE, Flex, Intégration

Java Swing : Ajout dynamique des composants

Voici un code d’ajout dynamique de composants avec Swing.

J’utilise les GridBagLayout comme stratégie de placement. Il y a également une partie de fonctionnalités qui n’est pas terminée

par exemple la suppression d’une ligne etc. Mais bon c’est l’ajout dynamique qui était le plus important pour moi et

que je souhaite partager et vous pouvez le télécharger ici.

package test;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class AjoutDynamique implements ActionListener{

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new AjoutDynamique().createAndShowGUI();
            }
        });
    }

    private JFrame frame;
    private JPanel panel = new JPanel(new GridBagLayout());

    private Map<String, Component> dynamicButtons =
                        new HashMap<String, Component>();

    private GridBagConstraints constraints = new GridBagConstraints();

    private List<JComponent> fields = new ArrayList<JComponent>();

    private JButton button1 = new JButton("Ajouter");
    String files = null;
    int y=3;

    private JPanel btnAppliqueAnnuler() {
        //JPanel p = new JPanel(new GridLayout(3, 1));

        JPanel p1 = new JPanel();
        Box box1 = new Box(BoxLayout.X_AXIS);
        box1.add(Box.createHorizontalGlue());

        JButton btnAppliquer = new JButton("Appliquer");
        box1.add(btnAppliquer);

        /**
         * Lorsqu'on clique sur le bouton Appliquer
         */
        btnAppliquer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAppliquerActionPerformed(evt);
            }
        });

        box1.add(Box.createHorizontalStrut(15));

        JButton btnAnnuler = new JButton("Annuler");

        /**
         * Lorsque clique sur le bouton Annuler
         */
        btnAnnuler.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAnnulerActionPerformed(evt);
            }
        });

        box1.add(btnAnnuler);
        box1.add(Box.createHorizontalGlue());
        p1.add(box1);
        p1.setBorder(BorderFactory.createRaisedBevelBorder());

        return p1;
    }

    /**
     *
     */
    private void btnAppliquerActionPerformed(ActionEvent evt) {
        //JOptionPane.showInputDialog("Clique sur Appliquer");
        //JOptionPane.showMessageDialog(null," Clique sur Appliquer");
        if (nom.getText().isEmpty() || ext.getText().isEmpty() ||
                       !repertoire.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null," Clique sur Appliquer");
        }
    }

    /**
     *
     */
    private void btnAnnulerActionPerformed(ActionEvent evt) {
        JOptionPane.showMessageDialog(null," Clique sur Annuler");
    }

    private JPanel p = new JPanel();
    protected void createAndShowGUI() {
        try {
             UIManager.setLookAndFeel(
             "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        }

        createHeader();
        addRowBelow();
        constraints.gridx=4;
        constraints.gridy=0;
        panel.add(button1,constraints);

        JButton bouton2 = new JButton("Appliquer");
        constraints.gridx=4;
        constraints.gridy=1;
        panel.add(bouton2,constraints);

        p = btnAppliqueAnnuler();
        constraints.gridx=4;
        constraints.gridy=y+7;
        panel.add(p,constraints);

        frame = new JFrame("Add Button Dynamically");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(panel));
        frame.setLocationRelativeTo(null);
        frame.setResizable(true);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        button1.addActionListener(this);

        JRootPane root = frame.getRootPane();
        root.setDefaultButton(button1);
        frame.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent we){
                System.exit(0);
            }
        });
    }

    private void addColumn(String labelText) {
        constraints.gridx = fields.size();
        constraints.gridy = 1;
        panel.add(new JLabel(labelText), constraints);
        constraints.gridy=2;

        final JTextField field=new JTextField(40);
        field.setEditable(false);
        panel.add(field,constraints);
        fields.add(field);
    }

    private void createHeader() {
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.insets = new java.awt.Insets(10, 10, 10, 10);
        constraints.fill = GridBagConstraints.HORIZONTAL;

        final JLabel lblTitre = new JLabel("Cliquez sur Ajouter");
        lblTitre.setFont(new Font("Arial", 0, 18));
        panel.add(lblTitre, constraints);

        constraints.gridx=0;
        constraints.gridy=1;
        final JLabel lblNom = new JLabel("Nom");
        lblNom.setFont(new Font("Arial", 0, 11));
        panel.add(lblNom, constraints);

        constraints.gridx=1;
        constraints.gridy=1;
        final JLabel lblExt = new JLabel("Ext");
        lblExt.setFont(new Font("Arial", 0, 11));
        panel.add(lblExt, constraints);

        constraints.gridx=2;
        constraints.gridy=1;
        final JLabel lblRepertoire = new JLabel("Repertoire");
        lblRepertoire.setFont(new Font("Arial", 0, 11));
        panel.add(lblRepertoire, constraints);
        fields.add(panel);
    }

    private String chooseFolder(java.awt.event.ActionEvent evt) {
        String dirName = null;
        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fc.setMultiSelectionEnabled(false);
        fc.setDialogTitle("Select a Directory");
        fc.setApproveButtonText("Valider");
        fc.setForeground(new Color(0xFF, 0xFF, 0xFF));
        int result = fc.showOpenDialog(null);
        if (result == JFileChooser.APPROVE_OPTION) {
            dirName = fc.getSelectedFile()
                   .getAbsolutePath();
        } else {
            System.out.println("Op?©ration annulÔø?e");
        }
        return dirName;
    }

    private JTextField nom;

    private JTextField ext;

    private JTextField repertoire;

    private JButton folder;

    private JButton delete;

    private JLabel supprimer;

    private void addRowBelow() {
        int x = 0;
        y++;
        constraints.gridy=y;
        //System.out.println(fields.size());
        System.out.println("SIZE addRowBelow : " + fields.size());
        for (x=0;x < fields.size();x++) {
            constraints.gridx=x;

            constraints.insets = new java.awt.Insets(10, 10, 10, 10);
            constraints.fill = GridBagConstraints.HORIZONTAL;

            nom = new JTextField(10);
            nom.setName("nom"+y);
            nom.setEditable(true);
            panel.add(nom, constraints);
            constraints.gridx=x+1;
            addComponent(nom.getName(), nom);

            ext = new JTextField(6);
            ext.setName("ext"+y);
            addComponent(ext.getName(), ext);

            ext.setEditable(true);
            panel.add(ext, constraints);
            constraints.gridx=x+2;

            repertoire = new JTextField(30);
            repertoire.setName("repertoire"+y);
            addComponent(repertoire.getName(), repertoire);
            ext.setEditable(true);
            panel.add(repertoire, constraints);
            constraints.gridx=x+3;

            folder = new JButton("?");
            folder.setName("folder"+y);
            addComponent(folder.getName(), folder);
            folder.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    String dirName = null;
                    JFileChooser fc = new JFileChooser();
                    fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                    fc.setMultiSelectionEnabled(false);
                    fc.setDialogTitle("Select a Directory");
                    fc.setApproveButtonText("Valider");
                    fc.setForeground(new Color(0xFF, 0xFF, 0xFF));
                    int result = fc.showOpenDialog(null);
                    if (result == JFileChooser.APPROVE_OPTION) {
                         repertoire.setText(
                         fc.getSelectedFile().getAbsolutePath());
                    } else {
                        System.out.println("Op?©ration annulÔø?e");
                    }
                }
            });
            panel.add(folder, constraints);
            constraints.gridx=x+4;

            delete = new JButton("?");
            addComponent(delete.getName(), delete);
            delete.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    System.out.println("Nom " + delete.getName());
                    //removeComponent(getY(delete.getName()));
                    if (!repertoire.equals("") || !repertoire.equals(null)) {
                        JOptionPane.showMessageDialog(null,delete.getName(),"Error",
                             JOptionPane.ERROR_MESSAGE);
                    }
                    else{
                        JOptionPane.showMessageDialog(null, delete.getName());
                    }
                }
            });
            panel.add(delete, constraints);
            constraints.gridx=x+5;

            supprimer = new JLabel("Supprimer");
            supprimer.setName("supprimer"+y);
            addComponent(supprimer.getName(), supprimer);

            panel.add(supprimer, constraints);
            constraints.gridx=x;
            constraints.gridy=y;
            panel.add(new JSeparator(), constraints);
        }
    }

    public void addComponent(String name, Component comp) {
        dynamicButtons.put(name, comp);
        panel.invalidate();
    }

    public void actionPerformed(ActionEvent ae){
        if("Ajouter".equals(ae.getActionCommand())) {
            addRowBelow();
            frame.pack();
            frame.setLocationRelativeTo(null);
        }
    }
}

Comment utiliser votre projet NetBeans dans Eclipse

Vous voulez construire votre application avec Netbeans en utilisant les composants graphiques Swing et  l’utiliser par la suite dans Eclipse.

Voici la démarche à suivre en supposant que votre espace de travail est dans:

c:\dev\projects\netbeans_workspace

I – NETBEANS 7.x

1) Ouvrir NebBeans.
2) Créer un nouveau projet java que vous appeler “PourEclipse”.
3) Lancer le build “click droit, Build”.

Netbeans va créer beaucoup de fichiers et répertoires.
Les fichiers qui nous intéressent sont:

"c:\dev\projects\netbeans_workspace\PourEclipse\dist"

et

"c:\dev\projects\netbeans_workspace\PourEclipse\src"

II – ECLIPSE

1) Allez dans Eclipse.
2) Créer un projet java dans Eclipse et nommer le “PourEclipse”.

Netbeans va créer beaucoup de fichiers et répertoires.
Les fichiers qui nous interessent sont:

"c:\dev\projects\eclipse_workspace\PourEclipse\bin"

et

"c:\dev\projects\eclipse_workspace\PourEclipse\src"

III – EXPLORATEUR DE DOSSIERS

1) Allez dans l’explorateur de Windows.
2) Copier le fichier

"c:\dev\projects\netbeans_workspace\PourEclipse\dist\PourEclipse.jar"

3) Collez dans

"c:\dev\projects\eclipse_workspace\PourEclipse\bin"

4) Copier le répertoire poureclipse depuis

"c:\dev\projects\netbeans_workspace\PourEclipse\src"

5) Coller dans

"c:\dev\projects\eclipse_workspace\PourEclipse\src".

IV – ECLIPSE

1) Allez dans Eclipse.
2) Appuyer sur F3 ou rafraichir votre projet.
3) Vérifier que le projet est bien dans le répertoire

"c:\dev\projects\eclipse_workspace\PourEclipse\src\poureclipse"

4) Voila tout doit marcher maintenant.
5) Tester votre projet.

NOTA: Si vous avez des problèmes ou des erreurs dans eclipse:
 1. Clique droit sur le projet
 2. Build Path
 3. Add a external jar (chargez le jar depuis
"c:\dev\projects\netbeans_workspace\PourEclipse\dist\poureclipse.jar")