【问题标题】:Java: Layout Button/Label PlacementJava:布局按钮/标签放置
【发布时间】:2023-03-24 18:51:01
【问题描述】:

我正在尝试制作一个 GUI 披萨菜单,但我在放置按钮/标签时遇到了问题

public class PizzaGUI extends JFrame {

private JRadioButton rdoSmall;
private JRadioButton rdoMedium;
private JRadioButton rdoLarge;
private JRadioButton rdoExtraLarge;
private JLabel lblSize;
private ButtonGroup grpSize; 
JPanel panelSize;

private JCheckBox chkPepperoni;
private JCheckBox chkMushrooms;
private JCheckBox chkOlives;
private JCheckBox chkPineapple;
private JLabel lblToppings;
JPanel panelToppings;

private JRadioButton rdoSoda;
private JRadioButton rdoTea;
private JRadioButton rdoBottledWater;
private JRadioButton rdoTapWater;
private JLabel lblDrinks;
private ButtonGroup grpDrinks;
JPanel panelDrinks;

JPanel container;
JButton calculateTotal;
JLabel order;


PizzaGUI()
{
    super("Pizza Menu");

    setSize(600,500);

    setDefaultCloseOperation(EXIT_ON_CLOSE);

    createPanel();

    add(container);

    setVisible(true);

}



public void createPanel()
{

    panelSize = new JPanel(new GridLayout(5, 1));
    panelToppings = new JPanel(new GridLayout(5, 1));
    panelDrinks = new JPanel(new GridLayout(5, 1));

    container = new JPanel();

    //Calculate Total
    calculateTotal = new JButton("Calculate");
    calculateTotal.setPreferredSize(new Dimension(95,45));


    order = new JLabel("Your Order:");


    //Pizza Sizes
    lblSize = new JLabel("Choose a size:");
    rdoSmall = new JRadioButton("Small ($7)");
    rdoMedium = new JRadioButton("Medium ($9)");
    rdoLarge = new JRadioButton("Large ($11)");
    rdoExtraLarge = new JRadioButton("Extra Large ($14)");

    //Toppings
    lblToppings = new JLabel("Choose toppings ($1 Each):");
    chkPepperoni = new JCheckBox("Pepperoni");
    chkMushrooms = new JCheckBox("Mushrooms");
    chkOlives = new JCheckBox("Olives");
    chkPineapple = new JCheckBox("Pineapple");

    //Drinks
    lblDrinks = new JLabel("Choose a drink:");
    rdoSoda = new JRadioButton("Soda ($2.00)");
    rdoTea = new JRadioButton("Tea ($1.50)");
    rdoBottledWater = new JRadioButton("Bottled Water ($1.25)");
    rdoTapWater = new JRadioButton("Tap Water (No charge)");


    //Add pizza sizes to button group
    grpSize = new ButtonGroup();
    grpSize.add(rdoSmall);
    grpSize.add(rdoMedium);
    grpSize.add(rdoLarge);
    grpSize.add(rdoExtraLarge);

    //Add drinks to button group
    grpDrinks = new ButtonGroup();
    grpDrinks.add(rdoSoda);
    grpDrinks.add(rdoTea);
    grpDrinks.add(rdoBottledWater);
    grpDrinks.add(rdoTapWater);

    //Add to panel
    panelSize.add(lblSize);
    panelSize.add(rdoSmall);
    panelSize.add(rdoMedium);
    panelSize.add(rdoLarge);
    panelSize.add(rdoExtraLarge);

    panelToppings.add(lblToppings);
    panelToppings.add(chkPepperoni);
    panelToppings.add(chkMushrooms);
    panelToppings.add(chkOlives);
    panelToppings.add(chkPineapple);

    panelDrinks.add(lblDrinks);
    panelDrinks.add(rdoSoda);
    panelDrinks.add(rdoTea);
    panelDrinks.add(rdoBottledWater);
    panelDrinks.add(rdoTapWater);

    container.add(panelSize);
    container.add(Box.createHorizontalStrut(40));
    container.add(panelToppings);
    container.add(Box.createHorizontalStrut(40));
    container.add(panelDrinks);
    container.add(calculateTotal);
    container.add(Box.createVerticalStrut(100));
    container.add(order);


}





}

这是输出 Menu

我为每种类型的菜单设置了三个独立的网格布局面板,然后我将其添加到一个主面板中,该主面板将添加到框架中。我想将“您的订单:”放在左中间,就像图像中显示的红色一样。我知道我可以将布局设置为 null,这将允许我输入坐标并解决我的问题,但是我读到这样做是不好的做法,我正在尝试有效地学习如何正确使用布局。我什至不知道我是否走在正确的轨道上,任何例子都会有所帮助。谢谢

【问题讨论】:

  • 您还没有在container 上设置布局管理器,因此它可能默认设置为FlowLayout。选择一个不同的布局,让你有更多的控制权。 IRead here 了解有关您可用的布局管理器中的一些精细选择的信息。我个人最喜欢的是GridBadLayout;它可能是最灵活但不是最容易学习的。

标签: java swing layout


【解决方案1】:

也许这可以帮助你。 您可以添加一个单独的面板,然后为该面板创建一个空边框。

container.add(panelSize);
container.add(Box.createHorizontalStrut(40));
container.add(panelToppings);
container.add(Box.createHorizontalStrut(40));
container.add(panelDrinks);
container.add(calculateTotal);


JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(10, 200, 10, 700));
panel.add(order, BorderLayout.EAST);
container.add(panel); 

【讨论】:

    【解决方案2】:

    你修改后的代码可以做你想做的事:

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    
    import javax.swing.Box;
    import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    
    public class PizzaGUI extends JFrame {
    
    private JRadioButton rdoSmall;
    private JRadioButton rdoMedium;
    private JRadioButton rdoLarge;
    private JRadioButton rdoExtraLarge;
    private JLabel lblSize;
    private ButtonGroup grpSize; 
    JPanel panelSize;
    
    private JCheckBox chkPepperoni;
    private JCheckBox chkMushrooms;
    private JCheckBox chkOlives;
    private JCheckBox chkPineapple;
    private JLabel lblToppings;
    JPanel panelToppings;
    
    private JRadioButton rdoSoda;
    private JRadioButton rdoTea;
    private JRadioButton rdoBottledWater;
    private JRadioButton rdoTapWater;
    private JLabel lblDrinks;
    private ButtonGroup grpDrinks;
    JPanel panelDrinks;
    
    JPanel container;
    JButton calculateTotal;
    JLabel order;
    
    
    PizzaGUI()
    {
        super("Pizza Menu");
    
        setSize(600,500);
    
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    
        createPanel();
    
        add(container);
    
        setVisible(true);
    
    }
    
    public void createPanel()
    {
    
        panelSize = new JPanel(new GridLayout(5, 1));
        panelToppings = new JPanel(new GridLayout(5, 1));
        panelDrinks = new JPanel(new GridLayout(5, 1));
    
        container = new JPanel(new GridLayout(2,1));
        JPanel container2 = new JPanel();
        JPanel placedOrderPanel =  new JPanel(new FlowLayout(FlowLayout.LEFT));
    
        //Calculate Total
        calculateTotal = new JButton("Calculate");
        calculateTotal.setPreferredSize(new Dimension(95,45));
    
    
        order = new JLabel("Your Order:");
    
        placedOrderPanel.add(new JLabel("Your Order placed"));
    
        //Pizza Sizes
        lblSize = new JLabel("Choose a size:");
        rdoSmall = new JRadioButton("Small ($7)");
        rdoMedium = new JRadioButton("Medium ($9)");
        rdoLarge = new JRadioButton("Large ($11)");
        rdoExtraLarge = new JRadioButton("Extra Large ($14)");
    
        //Toppings
        lblToppings = new JLabel("Choose toppings ($1 Each):");
        chkPepperoni = new JCheckBox("Pepperoni");
        chkMushrooms = new JCheckBox("Mushrooms");
        chkOlives = new JCheckBox("Olives");
        chkPineapple = new JCheckBox("Pineapple");
    
        //Drinks
        lblDrinks = new JLabel("Choose a drink:");
        rdoSoda = new JRadioButton("Soda ($2.00)");
        rdoTea = new JRadioButton("Tea ($1.50)");
        rdoBottledWater = new JRadioButton("Bottled Water ($1.25)");
        rdoTapWater = new JRadioButton("Tap Water (No charge)");
    
    
        //Add pizza sizes to button group
        grpSize = new ButtonGroup();
        grpSize.add(rdoSmall);
        grpSize.add(rdoMedium);
        grpSize.add(rdoLarge);
        grpSize.add(rdoExtraLarge);
    
        //Add drinks to button group
        grpDrinks = new ButtonGroup();
        grpDrinks.add(rdoSoda);
        grpDrinks.add(rdoTea);
        grpDrinks.add(rdoBottledWater);
        grpDrinks.add(rdoTapWater);
    
        //Add to panel
        panelSize.add(lblSize);
        panelSize.add(rdoSmall);
        panelSize.add(rdoMedium);
        panelSize.add(rdoLarge);
        panelSize.add(rdoExtraLarge);
    
        panelToppings.add(lblToppings);
        panelToppings.add(chkPepperoni);
        panelToppings.add(chkMushrooms);
        panelToppings.add(chkOlives);
        panelToppings.add(chkPineapple);
    
        panelDrinks.add(lblDrinks);
        panelDrinks.add(rdoSoda);
        panelDrinks.add(rdoTea);
        panelDrinks.add(rdoBottledWater);
        panelDrinks.add(rdoTapWater);
    
        container2.add(panelSize);
        container2.add(Box.createHorizontalStrut(40));
        container2.add(panelToppings);
        container2.add(Box.createHorizontalStrut(40));
        container2.add(panelDrinks);
        container2.add(calculateTotal);
        container2.add(Box.createVerticalStrut(100));
        container2.add(order);
        container.add(container2);
        container.add(placedOrderPanel);
    }
    
    public static void main(String args[]) {
      new PizzaGUI();
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 2012-04-20
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 2012-09-29
      • 1970-01-01
      相关资源
      最近更新 更多