2017-09-09 8 views
0

J'essaye de créer une interface de menu simple avec 4 rangées de divers boutons et étiquettes utilisant GridLayout avec FlowLayout dans chaque grille pour organiser les éléments. Cependant, l'espace pour les boutons et les étiquettes qui ne devraient prendre qu'une seule ligne occupe énormément d'espace.Est-il possible de changer la hauteur de chaque grille dans un GridLayout?

C'est ce que mon interface ressemble réduite au minimum:

C'est ce qu'il ressemble à maximisé:

Je cherche à définir la taille maximale des étiquettes panneaux/grille de sorte qu'il ne prend qu'une petite quantité d'espace.

Je suis en train de faire tous les éléments visibles sans que rien ne soit caché avec une taille aussi petite fenêtre possible comme ceci:

Ceci est mon code:

public class Window extends JFrame{ 
public Window() { 
    super("TastyThai Menu Ordering"); 
} 

public static void main(String[] args) { 
    Window w = new Window(); 
    w.setSize(500, 500); 
    w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JLabel title = new JLabel("TastyThai Menu Order", SwingConstants.CENTER); 
    title.setFont(title.getFont().deriveFont(32f)); 

    //generate page title 
    Container titlePanel = new JPanel(); // used as a container 
    titlePanel.setBackground(Color.WHITE); 
    FlowLayout flow = new FlowLayout(); // Create a layout manager 
    titlePanel.setLayout(flow);// assign flow layout to panel 
    titlePanel.add(title); // add label to panel 
    w.getContentPane().add(BorderLayout.NORTH,titlePanel); 

    //generate row containers 
    Container r1 = new JPanel(new FlowLayout()); 
    Container r2 = new JPanel(new FlowLayout()); 
    Container r3 = new JPanel(new FlowLayout()); 
    Container r4 = new JPanel(new FlowLayout()); 

    //generate mains radio buttons 
    Container mains = new JPanel(new GridLayout(7, 0)); 
    mains.setBackground(Color.RED); 
    JLabel mainsHeader = new JLabel("Mains"); 
    mains.add(mainsHeader); 
    String[] mainsChoices = {"Vegetarian", "Chicken", "Beef", "Pork", "Duck", "Seafood Mix"}; 
    JRadioButton[] mainsRadioButton = new JRadioButton[6]; 
    ButtonGroup mainsButtons = new ButtonGroup(); 
    for(int i = 0; i < mainsChoices.length; i++) { 
     mainsRadioButton[i] = new JRadioButton(mainsChoices[i]); 
     mains.add(mainsRadioButton[i]); 
     mainsButtons.add(mainsRadioButton[i]); 
    } 

    //generate noodles radio buttons 
    Container noodles = new JPanel(new GridLayout(7, 0)); 
    noodles.setBackground(Color.GREEN); 
    JLabel noodlesHeader = new JLabel("Noodles"); 
    noodlesHeader.setFont(noodlesHeader.getFont().deriveFont(24f)); 
    noodles.add(noodlesHeader); 
    String[] noodlesChoices = {"Pad Thai", "Pad Siew", "Ba Mee"}; 
    JRadioButton[] noodlesRadioButton = new JRadioButton[3]; 
    ButtonGroup noodlesButtons = new ButtonGroup(); 
    for(int i = 0; i < noodlesChoices.length; i++) { 
     noodlesRadioButton[i] = new JRadioButton(noodlesChoices[i]); 
     noodles.add(noodlesRadioButton[i]); 
     noodlesButtons.add(noodlesRadioButton[i]); 
    } 

    //generate sauces radio buttons 
    Container sauces = new JPanel(new GridLayout(7, 0)); 
    sauces.setBackground(Color.BLUE); 
    JLabel saucesHeader = new JLabel("Sauce"); 
    saucesHeader.setFont(saucesHeader.getFont().deriveFont(24f)); 
    sauces.add(saucesHeader); 
    String[] saucesChoices = {"Soy Sauce", "Tamarind Sauce"}; 
    JRadioButton[] saucesRadioButton = new JRadioButton[2]; 
    ButtonGroup saucesButtons = new ButtonGroup(); 
    for(int i = 0; i < saucesChoices.length; i++) { 
     saucesRadioButton[i] = new JRadioButton(saucesChoices[i]); 
     sauces.add(saucesRadioButton[i]); 
     saucesButtons.add(saucesRadioButton[i]); 
    } 

    //generate extras check boxes 
    Container extras = new JPanel(new GridLayout(7, 0)); 
    extras.setBackground(Color.YELLOW); 
    JLabel extrasHeader = new JLabel("Extra"); 
    extrasHeader.setFont(extrasHeader.getFont().deriveFont(24f)); 
    extras.add(extrasHeader); 
    String[] extrasChoices = {"Mushroom", "Egg", "Broccoli", "Beansrpout", "Tofu"}; 
    JCheckBox[] extrasBoxes = new JCheckBox[5]; 
    for(int i = 0; i < extrasChoices.length; i++) { 
     extrasBoxes[i] = new JCheckBox(extrasChoices[i]); 
     extras.add(extrasBoxes[i]); 
    } 

    JLabel selectionPrice = new JLabel("Selection Price: $ "); 
    JLabel selectionPriceVal = new JLabel("_______________"); 
    JButton addToOrder = new JButton("Add to Order"); 

    JLabel totalPrice = new JLabel("Total Price: $ "); 
    JLabel totalPriceVal = new JLabel("_______________"); 
    JButton clearOrder = new JButton("Clear Order"); 

    JRadioButton pickUp = new JRadioButton("Pick Up"); 
    JRadioButton delivery = new JRadioButton("Delivery"); 
    ButtonGroup pickupDelivery = new ButtonGroup(); 
    pickupDelivery.add(pickUp); 
    pickupDelivery.add(delivery); 
    JButton completeOrder = new JButton("Complete Order"); 

    Container menuSelection = new JPanel(new GridLayout(4,0)); 
    menuSelection.add(r1); 
    r1.add(mains); 
    r1.add(noodles); 
    r1.add(sauces); 
    r1.add(extras); 
    menuSelection.add(r2); 
    r2.add(selectionPrice); 
    r2.add(selectionPriceVal); 
    r2.add(addToOrder); 
    menuSelection.add(r3); 
    r3.add(totalPrice); 
    r3.add(totalPriceVal); 
    r3.add(clearOrder); 
    menuSelection.add(r4); 
    r4.add(pickUp); 
    r4.add(delivery); 
    r4.add(completeOrder); 

    w.getContentPane().add(BorderLayout.CENTER, menuSelection); 

    w.setVisible(true); 
} 
} 
+0

Cela n'a rien à voir avec la taille maximale de vos composants. Le javadoc GridLayout dit: * La classe GridLayout est un gestionnaire de disposition qui dispose les composants d'un conteneur dans une grille rectangulaire. Le conteneur est divisé en rectangles de taille égale et un composant est placé dans chaque rectangle *. Donc, si cela n'est pas souhaitable, n'utilisez pas cette disposition, et choisissez celle qui permet de faire ce que vous voulez (ce qui n'est pas clair). –

+0

@JBNizet J'essaie de rendre tous les éléments visibles sans que rien ne soit caché avec une taille de fenêtre aussi petite que possible comme ceci: https://imgur.com/4zBhQaf mais avec 1 ligne chacun pour le prix de la sélection et ajouter au bouton de commande alors dans un nouveau prix total de la ligne et le bouton de commande claire et dans une nouvelle ligne bouton de ramassage/livraison radio et bouton de commande complète. J'ai pu réaliser celui-ci avec juste la disposition de flux mais je ne sais pas comment faire de nouvelles lignes dans la disposition de flux. Donc je pense que je vais imbriquer la disposition de flux dans une disposition de la grille – nanj

+0

Vous pouvez utiliser un 'BoxLayout' pour empiler les 4 sections de l'interface graphique. –

Répondre

2

GridLayout ne supporte pas cela. Tous les rectangles ont la même taille.

Jetez un oeil à la GridBagLayout, qui prend en charge le redimensionnement dynamique et bien plus encore.