IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Aide pour réaliser une interface graphique


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut Aide pour réaliser une interface graphique
    Bonjour,
    cela fait une semaine que je me débats avec divers layout manager pour réaliser l'affichage d'un JPanel et je n'arrive à rien. j'ai essayé boxlayout, flowlayout, gridBagLayout, formLayout, springLayout ...
    Voici donc le problème qui ne me parait pourtant pas si compliqué.
    • Un JScrollPane avec une largeur fixe (350 pixels pour être précis).
    • Dedans un JPanel (panneau) qui contient une succession de JPanel (pan_1 à pan_n, le nombre de panneau est déterminé dynamiquement) qui s'empilent de haut en bas.
    • La scrollBar vertical permet d'accéder aux pan qui débordent vers le bas (utilisation classique donc).

    Chaque panneau pan_i
    • a une bordure avec titre
    • contient des lignes composées d'un JLabel et d'un JTextArea.
    • Le JLabel est à gauche du JTextArea avec un alignement à droite.
    • La largeur des labels est égale à la plus grande largeur des labels du panneau.
    • Le JTextArea occupe le reste de l'espace à droite du JLabel, donc chaque ligne fait la même largeur (les 350 pixels de largeur du JScrollBar environ).
    • Les JTextArea peuvent être sur plusieurs lignes. Dans ce cas, au delà de cinq lignes, un ScrollBar permet de se déplacer dans le texte.
    • Dans le cas de plusieurs lignes j'aimerai que le JLabel soit centré verticalement sur la hauteur du JTextArea.
    • L'espace entre chanque pan_i est fixe.


    Je sais faire chaque contrainte indépendamment des autres avec le layout qui convient. Mais je n'arrive pas à trouver un layout permettant toutes ces contraintes et pourtant je suis à peu près sûr que c'est possible.

    Quelqu'un peut m'expliquer comment faire (et surtout la démarche pour choisir le bon layout pour cela) ? Bien entendu j'ai lu (et relu plusieurs fois les articles de Developpez. com sur les gestionnaires de placement ainsi que ceux d'autres sites d'ailleurs, ainsi que l'article de Oracle "Laying Out Components Within a Container".

    Je ne sais pas si cela a une quelconque utilité pour la résolution du problème mais j'utilise le L&F nimbus car le rendu du L&F metal avec Windows 10 me déplait vraiment.

    Je joins un exemple de ce que j'obtiens quand mes JTextArea n'ont qu'une ligne. C'est ce que je voudrai mais dés qu'un de mes JTextArea a plus de trois lignes, cette belle présentation est perdue et plus rien ne marche.

    Nom : Capture.PNG
Affichages : 140
Taille : 23,5 Ko

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut
    J'ai repris le problème tranquillement et pas à pas et j'ai fini par trouver.
    Donc reprenons le problème : je veux d'abord un panneau qui empile ses composants, il peut devenir plus grand que la hauteur de l'écran et donc il doit être dans un JScrollPane.
    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
     
    import java.awt.BorderLayout;
    import java.awt.Color;
     
    import javax.swing.BorderFactory;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
     
    public class Test 
    {
    	public static void main(String[] args) 
    	{
    		JFrame test = new JFrame("test");
    		//fermeture du programme
            test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //dimension en cas de redimensionnement
            test.setSize(500, 300);
     
            //le panneau qui va contenir d'autres panneaux
    		JPanel panneauPrincipal = new JPanel();
    		//la bordure du panneau
    		panneauPrincipal.setBorder(BorderFactory.createLineBorder(Color.RED));
    		//un BoxLayout vertical
    		panneauPrincipal.setLayout(new BoxLayout(panneauPrincipal, BoxLayout.PAGE_AXIS));
    		//ATTENTION : ne pas mettre de taille préférée au panneau car sinon le défilement
    		//ne se fait pas car quand on rajoutera des composants, la taille préférée du 
    		//panneau ne changera pas.
     
    		//le JScrollPane contenant le panneau
            JScrollPane jsp = new JScrollPane(panneauPrincipal, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
      		//ajouter des composants dans le panneau
    		init(panneauPrincipal);
    		//on ajoute le JScrollPane à droite
    		test.add(BorderLayout.EAST,jsp);
     
            //rendre la fenetre visible
            test.setVisible(true);
    	}
     
    	//on ajoute 3 panneaux au panneau principal
    	private static void init(JPanel panneau) 
    	{
    		for(int i= 0; i < 3; i++)
    		{
    			panneau.add(new Panneau2(i));
    		}
    	}
    }
    A l'intérieur du panneau principal, 3 panneaux secondaires qui s'empilent et dont la dimension dépendra de ce qu'ils contiennent : un nombre aléatoire d'autres panneaux.
    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
     
    import java.awt.Color;
    import javax.swing.BorderFactory;
    import javax.swing.BoxLayout;
    import javax.swing.JPanel;
     
    public class Panneau2 extends JPanel
    {
    	private Color couleur;
    	public Panneau2(int i)
    	{
    		super();
    		//le BoxLayout vertical pour empiler les composants
    		setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    		//une couleur pour les distinguer
    		switch (i)
    		{
    			case 0 : couleur = Color.CYAN;
    				break;
    			case 1 : couleur = Color.GREEN;
    				break;
    			case 2 : couleur = Color.MAGENTA;
    		}
    		//la bordure
    		setBorder(BorderFactory.createLineBorder(couleur,3));
    		//le nombre de composants
    		int nbLignes = 2 + (int) (5 * Math.random());
    		for(int j = 0; j < nbLignes ; j++)
    		{
    			add(new Panneau3(j));
    		}
    	}
    }
    Le panneau3 contient un JLabel à gauche et un JScrollPane contenant un JTextArea à droite. Le composant de droite doit prendre le maximum d'espace restant une fois le composant de gauche placé, donc on utilise tout naturellement un BorderLayout
    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
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import javax.swing.BorderFactory;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
     
    public class Panneau3 extends JPanel 
    {
    	Color couleur = Color.BLACK;
    	public Panneau3(int j)
    	{
    		setBorder(BorderFactory.createLineBorder(couleur,3));
    		setLayout(new BorderLayout(5,5));
     
    		JLabel label1 = new JLabel("Label " + j );
    		add(label1, BorderLayout.WEST);
    		String texte = label1.getSize().toString() + "\n" + label1.getMaximumSize().toString()
    				+ "\n" + label1.getMinimumSize().toString() + "\n" + label1.getPreferredSize().toString();
    		JTextArea jta = new JTextArea(texte,3,15);
    		jta.setLineWrap(true);
    		jta.setWrapStyleWord(true);
    		JScrollPane jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    		add(jsp, BorderLayout.CENTER);
    	}
    }
    Et voilà ... ça marche
    Le reste, bordure avec titre, label aligné à droite ... ne sont que des points de détail.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut
    Bon il reste un point de détail mais ennuyeux :
    S'il n'y a pas assez de panneaux2 dans le panneau principal, ceux-ci se partagent tout l'espace en hauteur, alors que je voudrai qu'ils conservent leur taille adaptée à leur contenu.

    Quelqu'un a une idée ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 25
    Dernier message: 11/06/2012, 16h39
  2. [IHM] Réaliser une interface graphique sur mac
    Par fjgaston dans le forum Développement OS X
    Réponses: 7
    Dernier message: 25/06/2007, 14h54
  3. Réponses: 2
    Dernier message: 09/08/2006, 14h02
  4. Réponses: 8
    Dernier message: 03/11/2005, 08h51
  5. [RECHERCHE] un module pour developer une interface graphique
    Par romtrash dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 10/03/2005, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo