JPanel 在带有 BorderLayout 的 JFrame 中不工作

问题描述 投票:0回答:1

我正在尝试向 Jframe 添加 4 个面板,每个面板包含一些组件。面板在 flowlayout 中工作,但不会出现在 borderlayout 中。我错过了什么吗?我有//南北面板,因为它们还没有任何东西,我只是想让西部和中心至少出现。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class Lab3 extends JFrame implements ActionListener {
    private static final long serialVersionUID = 1L;

    public JPanel Westpanel, Centerpanel, Northpanel, Southpanel;
    public ButtonGroup size, ingredients;
    public JRadioButton small, medium, large;
    public JCheckBox let, kal, tom, on, bac, egg, che, can;
    public JButton BS, reset;
    public TitledBorder sizeborder, ingborder;
    public TextField bottom;

    public static void main(String args[]) {

        new Lab3();

    }

    public Lab3() {

        Westpanel = new JPanel();
        Centerpanel = new JPanel();
        Northpanel = new JPanel();
        Southpanel = new JPanel();
        size = new ButtonGroup();
        ingredients = new ButtonGroup();
        small = new JRadioButton("Small");
        medium = new JRadioButton("Medium");
        large = new JRadioButton("Large");
        let = new JCheckBox("Lettuce");
        kal = new JCheckBox("Kale");
        tom = new JCheckBox("Tomato");
        on = new JCheckBox("Onion");
        bac = new JCheckBox("Bacon");
        egg = new JCheckBox("Egg");
        che = new JCheckBox("Cheese");
        can = new JCheckBox("Candied");
        bottom = new TextField(10);
        BS = new JButton("Build My Salad!");
        reset = new JButton("Reset");

        sizeborder = new TitledBorder(BorderFactory.createTitledBorder("Size"));
        ingborder = new TitledBorder(BorderFactory.createTitledBorder("Ingredients"));

        Westpanel.setLayout(new GridLayout(0, 1));
        Westpanel.setBorder(sizeborder);
        Westpanel.add(small);
        Westpanel.add(medium);
        Westpanel.add(large);
        Centerpanel.setLayout(new GridLayout(3, 3));
        Centerpanel.setBorder(ingborder);
        Centerpanel.add(tom);
        Centerpanel.add(bac);
        Centerpanel.add(let);
        Centerpanel.add(kal);
        Centerpanel.add(che);
        Centerpanel.add(egg);
        Centerpanel.add(can);
        Centerpanel.add(on);
        
    
        add(Westpanel,BorderLayout.WEST);
        // add(Northpanel,BorderLayout.NORTH);
        add(Centerpanel,BorderLayout.CENTER);
        // add(Southpanel,BorderLayout.SOUTH);

        setBounds(50, 50, 400, 400);
        setLayout(new BorderLayout());
        setTitle("My Salad Store");
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    }
}

我想帮助确定哪里出错了。

java swing jframe jpanel
1个回答
0
投票

首先删除

setLayout(new BorderLayout());
JFrame
无论如何默认为
BorderLayout
,但是在添加组件之后调用它会重置所有布局约束信息。

我建议删除

setBounds(50, 50, 400, 400);
并改用
pack

作为一般规则,您不应该从

JFrame
进行扩展,您不会向该类添加任何新功能,并且它会将您锁定在一个用例中。

例如...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.TitledBorder;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new Lab3());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Lab3 extends JPanel implements ActionListener {
        private static final long serialVersionUID = 1L;

        public JPanel Westpanel, Centerpanel, Northpanel, Southpanel;
        public ButtonGroup size, ingredients;
        public JRadioButton small, medium, large;
        public JCheckBox let, kal, tom, on, bac, egg, che, can;
        public JButton BS, reset;
        public TitledBorder sizeborder, ingborder;
        public TextField bottom;

        public Lab3() {

            Westpanel = new JPanel();
            Centerpanel = new JPanel();
            Northpanel = new JPanel();
            Southpanel = new JPanel();
            size = new ButtonGroup();
            ingredients = new ButtonGroup();
            small = new JRadioButton("Small");
            medium = new JRadioButton("Medium");
            large = new JRadioButton("Large");
            let = new JCheckBox("Lettuce");
            kal = new JCheckBox("Kale");
            tom = new JCheckBox("Tomato");
            on = new JCheckBox("Onion");
            bac = new JCheckBox("Bacon");
            egg = new JCheckBox("Egg");
            che = new JCheckBox("Cheese");
            can = new JCheckBox("Candied");
            bottom = new TextField(10);
            BS = new JButton("Build My Salad!");
            reset = new JButton("Reset");

            sizeborder = new TitledBorder(BorderFactory.createTitledBorder("Size"));
            ingborder = new TitledBorder(BorderFactory.createTitledBorder("Ingredients"));

            Westpanel.setLayout(new GridLayout(0, 1));
            Westpanel.setBorder(sizeborder);
            Westpanel.add(small);
            Westpanel.add(medium);
            Westpanel.add(large);
            Centerpanel.setLayout(new GridLayout(3, 3));
            Centerpanel.setBorder(ingborder);
            Centerpanel.add(tom);
            Centerpanel.add(bac);
            Centerpanel.add(let);
            Centerpanel.add(kal);
            Centerpanel.add(che);
            Centerpanel.add(egg);
            Centerpanel.add(can);
            Centerpanel.add(on);

            add(Westpanel, BorderLayout.WEST);
            // add(Northpanel,BorderLayout.NORTH);
            add(Centerpanel, BorderLayout.CENTER);
            // add(Southpanel,BorderLayout.SOUTH);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub

        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.