3 votes

Veuillez traduire ceci en conservant les mêmes balises HTML si elles existent de l'anglais au français: Java choisir la mise en page

J'ai besoin de la mise en page suivante en Java :

Layout

Cependant, je devrais trouver qu'aucun gestionnaire de mise en page ne peut simplement résoudre ce problème pour moi. J'ai besoin de cette mise en page dans un JFrame.

Y a-t-il un moyen assez simple que je pourrais faire cela?

Merci d'avance!

EDIT: Merci à vous tous, j'ai enfin réussi!

C'est ce que j'ai fait (comme vous l'avez proposé)

  • BorderLayout pour la fenêtre
  • leftPanel, GridLayout(1,1) /* pour étirer */, ajouter le Composant 1, OUEST dans la fenêtre
  • rightPanel, BorderLayout, CENTRE dans la fenêtre
  • rightTop (ajouté à rightPanel comme CENTRE) Panel, ajouter le Composant 2
  • rightBottom (ajouté à rightPanel comme SUD) Panel, GridLayout(1,1) (aussi pour l'étirement), ajouter le Composant 3

Merci à vous tous, dont les conseils que j'ai mélangés ^^

3voto

Basil Bourque Points 8938

Je sais que vous avez résolu votre problème avec un mélange de JPanels placés dans un gestionnaire de mise en page BorderLayout. Si cela fonctionne, tant mieux.

Pour ceux qui sont curieux d'utiliser un GridBagLayout comme solution, je présente cette classe comme exemple. Il vous suffit de copier-coller, compiler et exécuter. Faites glisser le coin de la fenêtre de cette petite application pour voir les effets du redimensionnement de la fenêtre.

Capture d'écran du code de mise en page exempledescription de l'image

// Code d'exemple montrant la flexibilité de GridBagLayout.

// Code source généré par WindowBuilder 1.0.0r37 dans Eclipse (Indigo Release) sur Mac OS X 10.6.7.

// © 2011 Basil Bourque.   http://www.GridsGoneWild.com/
// Ce code source peut être utilisé librement pour toujours par toute personne prenant l'entière responsabilité de le faire.

// Chaque gestionnaire de mise en page inclus dans Java est assez différent des autres. Ils ont tous des forces et des faiblesses,
// chacun conçu pour différents buts et effets.

// GridBagLayout est le plus puissant et flexible, mais nécessite un certain apprentissage pour être compris.
// Drôle de commentaire vidéo animé par un programmeur GridBagLayout : http://madbean.com/anim/totallygridbag/
// Coder manuellement GridBagLayout est certainement fastidieux, et presque impossible pour des formulaires complexes. Je recommande donc l'utilisation
// d'un constructeur GUI visuel tel que WindowBuilder dans Eclipse, JFormDesigner de FormDev.com, ou Matisse dans NetBeans.

// Idées clés, "grow" et "fill" :
// • Dans la vue de conception de WindowBuilder, sélectionnez un widget, puis utilisez les icônes "Étendre horizontalement" et "Étendre verticalement" trouvées dans la barre d'outils supérieure.
// • Utilisez la propriété "fill" des "Contraintes" du widget (libellé, bouton) dans la feuille de propriétés de WindowBuilder.

// Idées supplémentaires :
// • Pour contenir plusieurs widgets dans chaque zone, utilisez des objets JPanel là où j'ai utilisé des objets JLabel et JButton individuels. 
//   L'emboîtement de JPanels à l'intérieur de JPanels (ou dans le contentPane de JFrame) est considéré comme normal en Swing. Chaque JPanel a son propre gestionnaire de mise en page.
// • Si nécessaire, vous pouvez définir la taille minimale, maximale et/ou préférée d'un widget ou d'un JPanel.
// • Si vous voulez que certains widgets ou JPanels obtiennent de manière disproportionnée plus ou moins de l'espace gagné ou perdu lors du redimensionnement d'une fenêtre, 
//   utilisez les propriétés "weightx" et "weighty".

// Conseils pour WindowBuilder :
// • Si c'est votre première fois : Ouvrez le fichier .java, puis cliquez sur le bouton "Design" en bas pour voir l'éditeur visuel.
// • Cliquez sur l'icône "Afficher les propriétés avancées" en haut de la feuille de propriétés d'un widget pour voir de nombreuses propriétés cachées.

// package com.votre.package.ici;  // Décommentez cette ligne et modifiez-la en fonction de votre propre package.

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import java.awt.GridBagConstraints;
import java.awt.Color;
import java.awt.Insets;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class GridBagLayout_Example extends JFrame {
    private JPanel contentPane;
    private JLabel lblVariableXVariableY;
    private JButton btnVariableXFixedY;
    private JLabel lblFixedXVariableY;

    /**
     * Lance l'application.
     */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
        try {
            GridBagLayout_Example frame = new GridBagLayout_Example();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    });
    }

    /**
     * Constructeur
     */
    public GridBagLayout_Example() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    this.contentPane = new JPanel();
    this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(this.contentPane);
    GridBagLayout gbl_contentPane = new GridBagLayout();
    gbl_contentPane.columnWidths = new int[]{0, 0, 0};
    gbl_contentPane.rowHeights = new int[]{0, 0, 0};
    gbl_contentPane.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
    gbl_contentPane.rowWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
    this.contentPane.setLayout(gbl_contentPane);

    this.lblFixedXVariableY = new JLabel("Fixe x, Variable y");
    this.lblFixedXVariableY.setOpaque(true);
    this.lblFixedXVariableY.setBackground(new Color(233, 150, 122));
    GridBagConstraints gbc_lblFixedXVariableY = new GridBagConstraints();
    gbc_lblFixedXVariableY.fill = GridBagConstraints.VERTICAL;
    gbc_lblFixedXVariableY.gridheight = 2;
    gbc_lblFixedXVariableY.insets = new Insets(0, 0, 5, 5);
    gbc_lblFixedXVariableY.gridx = 0;
    gbc_lblFixedXVariableY.gridy = 0;
    this.contentPane.add(this.lblFixedXVariableY, gbc_lblFixedXVariableY);

    this.lblVariableXVariableY = new JLabel("Variable x & y");
    this.lblVariableXVariableY.setBackground(new Color(147, 112, 219));
    this.lblVariableXVariableY.setOpaque(true);
    GridBagConstraints gbc_lblVariableXVariableY = new GridBagConstraints();
    gbc_lblVariableXVariableY.fill = GridBagConstraints.BOTH;
    gbc_lblVariableXVariableY.insets = new Insets(0, 0, 5, 0);
    gbc_lblVariableXVariableY.gridx = 1;
    gbc_lblVariableXVariableY.gridy = 0;
    this.contentPane.add(this.lblVariableXVariableY, gbc_lblVariableXVariableY);

    this.btnVariableXFixedY = new JButton("Variable x, Fixe y");
    this.btnVariableXFixedY.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) { 
        }
    });
    this.btnVariableXFixedY.setOpaque(true);
    GridBagConstraints gbc_btnVariableXFixedY = new GridBagConstraints();
    gbc_btnVariableXFixedY.fill = GridBagConstraints.HORIZONTAL;
    gbc_btnVariableXFixedY.gridx = 1;
    gbc_btnVariableXFixedY.gridy = 1;
    this.contentPane.add(this.btnVariableXFixedY, gbc_btnVariableXFixedY);
    }

}

2voto

extraneon Points 13362

Un borderlayout avec 2 panneaux, un à l'OUEST et un au CENTRE. Sur le panneau CENTRAL, un borderLayout avec à la fois des composants Center et Nrth pourrait fonctionner.

1voto

KyleM Points 1934

Ce n'est pas particulièrement simple mais je pense que vous devez utiliser GridBagLayout. http://download.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

1voto

extraneon Points 13362

Une alternative à ma réponse précédente est MigLayout.

C'est une dépendance externe (ce n'est pas dans le JDK) mais c'est l'un des layouts les plus puissants disponibles. Et avec un générateur d'interface graphique comme Google's WindowBuilder, c'est aussi très facile à utiliser (ou à manipuler).

Même si vous ne voulez pas créer votre GUI avec WindowBuilder, cela peut vraiment vous aider à démarrer.

0voto

LouwHopley Points 2388

J'ai réussi à faire fonctionner cela avec un simple BorderLayout avec un JPanel à l'ouest et un à l'est.

Mon code

...
inGameFrame.getContentPane().setLayout(new BorderLayout());
inGameFrame.getContentPane().add("East", pnlRight);
inGameFrame.getContentPane().add("South", pnlBottom);
inGameFrame.getContentPane().add("Center", pnlGameBoard);
...

Si cela ne fonctionne pas, essayez de définir la taille des panneaux ou des composants.
(Même si je redimensionne le JFrame, seul le panneau centré change de taille)

ÉDITER
Ce que vous pouvez essayer, c'est d'ajouter le panneau à l'ouest et d'ajouter un nouveau panneau au centre (également un BorderLayout). Ensuite, sur le nouveau panneau, ajoutez vos deux autres panneaux, un au centre et un au bas. Cela donnera l'effet désiré.

...
JPanel pnlNew = new JPanel();
frame.getContentPane().setLayout(new BorderLayout());
pnlNew.setLayout(new BorderLayout());
pnlNew.add("Center", pnlMiddle);
pnlNew.add("South", pnlBottom);
frame.getContentPane().add("West", pnlLeft);
frame.getContentPane().add("Center", pnlNew);
...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X