我正在尝试向 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
}
}
我想帮助确定哪里出错了。
首先删除
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
}
}
}