Bonjour,
je m’essaie aux interfaces graphiques un peu plus complexes et je dois avouer que c'est pas tout à fait simple dans la pratique les Layout quand ont veut "fixer" l'aspect de la fenêtre.

Alors voilà le petit projet d'interface graphique qui en principe est plutôt simple.

Je voudrais faire en gros une sorte de petit analyseur d'expressions régulières. C'est un autre problème dont il n'est pas question ici mais dans ce but je vois mon interface comme suit :

Tout en haut se trouve une zone de saisie allant de 1 à 8 lignes en fonction de la taille de la fenêtre (ou du texte saisi) et qui prend toute la largeur.
En dessous il y a 2 colonnes :
A gauche une zone de texte (JTextField) qui ne prend qu'une ligne de hauteur pour y écrire l'adresse vers un fichier et à son côté un bouton qui affichera un JFileChooser. En dessous un JTextArea.
A droite un autre JTextArea pour le moment mais la colonne pourrait évoluer pour ressembler à la colonne de gauche.

Les colonnes de gauche et de droite partagent équitablement la largeur de la fenêtre et disposent du reste de la hauteur.
Aussi comment faire pour pouvoir redimensionner l'espace entre ces 2 colonnes selon son bon vouloir ?

Pour ce que j'ai essayé. Pour l'histoire des colonnes j'ai d'abord pensé utiliser un BorderLayout avec les constantes BorderLayout.WEST et BorderLayout.EAST mais ça n'a pas trop marché. Ensuite un FlowLayout mais on ne voyait d'une zone de texte, puis j'ai voulu me tourner vers un GridBagLayout et j'ai trouvé ça fastidieux... xD ... d'autant plus que ça semblait aussi imposer un redimensionnement des contrôles vu que les lignes et les colonnes se distribuent équitablement l'espace.
J'ai finalement opté pour un lot de BoxLayout et l'agencement des contrôle est bon mais par contre les tailles sont chaotiques. Il y a bien des méthodes comme setMaximumSize mais elles sont définies en pixel ce qui me pose problème sachant qu'on ne sait pas à quelle taille la fenêtre va être redimensionnée.
En somme, comment pourrais-je réordonner les tailles de mes contrôles pour qu'ils ne bavent pas entre eux ?

Merci...


[Addendum]
Vous remarquerez sans doute que tout ce qui est affiché pour le moment apparaît en faire depuis la case centrale d'un BorderLayout.
L'idée que j'ai eu c'est que si je voulais ajouter un JMenu je pourrais alors utiliser la partie nord et de même pour des volets latéraux je pourrais utiliser les cases ouest et est. Est-ce que mon raisonnement est juste où la création de certaines ressources comme un menu ou une barre d'état gardent une place qui leur est dédiée dans la fenêtre ?

Je vous met un lien vers une image pour vous montrer l'étendue des dégâts et aussi le code source.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 
import javax.swing.*;
import java.awt.*;
import java.util.regex.*;
 
public class RegExp extends JFrame{
    //Constructeur
    public RegExp(){
        setTitle("Expression rationnelles");
        Dimension prefDim = new Dimension(800,600);
        //setPreferredSize(prefDim);
        setSize(800,600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // Conteneur principal
        Container cont = getContentPane();
        JPanel mainPanel = new JPanel();
        cont.add(mainPanel);
        mainPanel.setLayout(new BorderLayout());
        Box bxVertical = Box.createVerticalBox();
 
        //mainPanel.add(, BorderLayout.NORTH);
        //mainPanel.add(, BorderLayout.SOUTH);
        //mainPanel.add(, BorderLayout.EAST);
        //mainPanel.add(, BorderLayout.WEST);
        mainPanel.add(bxVertical, BorderLayout.CENTER);
 
            // Configuration du Box Vertical
            JTextArea exp = new JTextArea("exp");    // Zone de texte pour la RegExp.        
            bxVertical.add(exp);
            Dimension dimexp = new Dimension(300,16);
            exp.setMaximumSize(dimexp);
            Box bxHorizontale = Box.createHorizontalBox();
            bxVertical.add(bxHorizontale);
                // Configuration de bxHorizontale
                Box bxColGauche = Box.createVerticalBox();
                bxHorizontale.add(bxColGauche);
                    // Configuration de bxColgauche
                    Box bxSelFic = Box.createHorizontalBox();
                    JTextArea src = new JTextArea("src");    // Zone de texte pour le texte source.
                    bxColGauche.add(bxSelFic);
                    bxColGauche.add(src);
                        // Configuration de bxSelFic
                        JTextField jtfSelFic = new JTextField(20);
                        JButton btnSelFic = new JButton("...");
                        bxSelFic.add(jtfSelFic);
                        bxSelFic.add(btnSelFic);
 
                JTextArea res = new JTextArea("res");    // Zone de texte pour le résultat.
                bxHorizontale.add(res);
        //pack();        
        setVisible(true);
    }
 
    //Main
    public static void main(String args[]){
        //TODO
        RegExp re = new RegExp();
        // ([0-9]{2}-){2}[0-9]{4}
        // (\d{2}-){2}\d{4}
        //re.evalRegexp("\\Ga*b*","aaaaabaaaaabaaaaabaaaaabbaaaaabaaaaab aaaaabaaaaab");
        re.evalRegexp("(\\d{2}-){2}\\d{4}","Ceci est une date : 16-11-2010 et en voici une autre 24-11-2010");
        System.out.println("Fin du main");
    }
 
    // Pour le moment le type de sortie est mis à void mais la fonction
    // devra clairement renvoyer un tableau dont le type sera probablement
    // déterminé par le type renvoyé par matcher.
    public void evalRegexp (String expr, String src){
        Pattern motif;
        Matcher crsp;
        Boolean bIsRes;
 
        motif = Pattern.compile(expr);
        crsp = motif.matcher(src);
        bIsRes = crsp.matches();
 
        System.out.println(expr);
        System.out.println(src);
        System.out.println("Suspens !");
        //*
        if (bIsRes) {
        System.out.println("Trouvé !");
            for (int i=0; i <= crsp.groupCount(); i++){
                // Remplissage d'un tableau mais pr le moment affichage
                System.out.println(crsp.group(i));
            }
        }//DEBUG*/
        while (crsp.find()){
            System.out.println(crsp.group() +" Positions: ("+ crsp.start() + ", "+ crsp.end() + ")");
        }
 
        //return [tableau de sortie]
    }
}