Попытка понять BorderLayout и внутренние отступы - PullRequest
0 голосов
/ 23 февраля 2020

Назначение - добавить код для создания GUI, который позволяет пользователю заказывать пиццу и выбирать начинки. Я застрял на позиционировании кнопок расчета и выхода, которые должны go ниже JTextField.

Я также пытаюсь выяснить, как уменьшить внутреннее заполнение на панели JCheckBox, так как, похоже, GUI может потребоваться и для этого.

import java.awt.*;
import javax.swing.*;

public class PizzaOrderFrame extends JFrame {

    JRadioButton smallRadioButton, mediumRadioButton, largeRadioButton;
    JCheckBox sausageCheckBox, pepperoniCheckBox, salamiCheckBox, 
            olivesCheckBox, mushroomsCheckBox, anchoviesCheckBox;
    JTextField priceTextField;
    JButton calculateButton, exitButton;

    PizzaOrderFrame() {
        initComponents();
    }

    private void initComponents() {
        setTitle("Pizza Calculator");
        setLocationByPlatform(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        smallRadioButton = new JRadioButton("Small");
        mediumRadioButton = new JRadioButton("Medium");
        largeRadioButton = new JRadioButton("Large");
        ButtonGroup sizeGroup = new ButtonGroup();
        sizeGroup.add(smallRadioButton);
        sizeGroup.add(mediumRadioButton);
        sizeGroup.add(largeRadioButton);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setBorder(BorderFactory.createTitledBorder("Size"));
        buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        buttonPanel.add(smallRadioButton);
        buttonPanel.add(mediumRadioButton);
        buttonPanel.add(largeRadioButton);

        sausageCheckBox = new JCheckBox("Sausage");
        pepperoniCheckBox = new JCheckBox("Pepperoni");
        salamiCheckBox = new JCheckBox("Salami");
        olivesCheckBox = new JCheckBox("Olives");
        mushroomsCheckBox = new JCheckBox("Mushrooms");
        anchoviesCheckBox = new JCheckBox("Anchovies");

        JPanel chkBoxPanel = new JPanel();
        chkBoxPanel.setBorder(BorderFactory.createTitledBorder("Toppings"));
        chkBoxPanel.setLayout(new GridBagLayout());
        chkBoxPanel.add(sausageCheckBox, getConstraints(0, 0));
        chkBoxPanel.add(olivesCheckBox, getConstraints(1, 0));
        chkBoxPanel.add(pepperoniCheckBox, getConstraints(0, 1));
        chkBoxPanel.add(salamiCheckBox, getConstraints(0, 2));
        chkBoxPanel.add(mushroomsCheckBox, getConstraints(1, 1));
        chkBoxPanel.add(anchoviesCheckBox, getConstraints(1, 2));

        priceTextField = new JTextField(10);
        priceTextField.setEnabled(false);

        JPanel pricePanel = new JPanel();
        pricePanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        pricePanel.add(new JLabel("Price"));
        pricePanel.add(priceTextField);

        calculateButton = new JButton("Calculate");
        exitButton = new JButton("Exit");
        ButtonGroup bottomButtons = new ButtonGroup();
        bottomButtons.add(calculateButton);
        bottomButtons.add(exitButton);

        JPanel buttonPanel2 = new JPanel();
        buttonPanel2.setLayout(new FlowLayout(FlowLayout.LEFT));
        buttonPanel2.add(calculateButton);
        buttonPanel2.add(exitButton);

        add(buttonPanel, BorderLayout.NORTH);
        add(chkBoxPanel, BorderLayout.WEST);
        add(pricePanel, BorderLayout.SOUTH);
        add(buttonPanel2, BorderLayout.EAST);
        setSize(270, 280);
    }

    // helper method for getting a GridBagConstraints object
    private GridBagConstraints getConstraints(int x, int y) {
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.LINE_START;
        c.insets = new Insets(5, 5, 0, 5);
        c.gridx = x;
        c.gridy = y;
        c.ipadx = 0;
        c.ipady = 0;
        return c;
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(() -> {
            PizzaOrderFrame frame = new PizzaOrderFrame();
            frame.setVisible(true);
        });
    }
}

1 Ответ

1 голос
/ 24 февраля 2020

.. как уменьшить внутренние отступы на панели JCheckBox ..

Уменьшить размер вставок! EG

c.insets = new Insets(5, 5, 0, 5);

Может быть:

c.insets = new Insets(0, 0, 0, 0); // try other values

Я застрял на положении кнопок «Рассчитать» и «Выход», которые должны быть на go ниже JTextField.

Обратите внимание, что макеты могут быть комбинированными . Редко, когда полное представление GUI использует один макет.

В этом случае я мог бы создать JPanel с одним столбцом GridLayout, добавить к нему панель цены / текстового поля, а затем еще одну панель для кнопок. Затем добавьте панель макета сетки к SOUTH / PAGE_END макета границы.


Результат выполнения обоих этих действий (и вызова pack() вместо setSize(..), который является предположение) выглядит следующим образом:

enter image description here

...