I would recommend creating a custom LayoutManager.
Here is a basic one that does just what you asked for:
import java.awt.*;
import java.util.ArrayList;
public class MyLayoutManager implements LayoutManager {
private final int TOOLBAR_HEIGHT = 30;
private final int WINDOW_WIDTH = 800;
private final int WINDOW_HEIGHT = 600;
// CONSTRAINTS //
public static final String TOOLBAR = "TOOLBAR";
public static final String BODY = "BODY";
private ArrayList<Component> toolbarComponents = new ArrayList<>();
private ArrayList<Component> bodyComponents = new ArrayList<>();
@Override // Called when JFrame.add() is used //
public void addLayoutComponent(String constraints, Component component) {
switch(constraints) {
case "TOOLBAR": toolbarComponents.add(component); break;
case "BODY": bodyComponents.add(component); break;
}
}
@Override // Sets the bounds for each component //
public void layoutContainer(Container parent) {
// Toolbar //
int currentWidth = 0;
for(Component c : toolbarComponents) {
int width = c.getPreferredSize().width;
c.setBounds(currentWidth, 0, width, TOOLBAR_HEIGHT);
currentWidth += width;
}
// Body //
int currentHeight = TOOLBAR_HEIGHT;
for(Component c : bodyComponents) {
int height = (parent.getHeight()-TOOLBAR_HEIGHT)/bodyComponents.size();
c.setBounds(0, currentHeight, parent.getWidth(), height);
currentHeight += height;
}
}
@Override
public Dimension minimumLayoutSize(Container parent) {
return preferredLayoutSize(parent);
}
@Override // Called when JFrame.pack() is called //
public Dimension preferredLayoutSize(Container parent) {
return new Dimension(WINDOW_WIDTH,WINDOW_HEIGHT);
}
@Override
public void removeLayoutComponent(Component comp) {}
}
Then Implement it like so:
JFrame frame = new JFrame("Interface");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new MyLayoutManager());
frame.add(new JButton("Menu"), MyLayoutManager.TOOLBAR);
frame.add(new JButton("File"), MyLayoutManager.TOOLBAR);
frame.add(new JButton("Settings"), MyLayoutManager.TOOLBAR);
JTextArea area1 = new JTextArea();
area1.setBorder(new TitledBorder("title 1"));
JTextArea area2 = new JTextArea();
area2.setBorder(new TitledBorder("title 2"));
frame.add(area1, MyLayoutManager.BODY);
frame.add(area2, MyLayoutManager.BODY);
frame.pack();
frame.setVisible(true);