Не уверен, почему кнопки выровнены так, как они есть, но, вероятно, потому, что они пытаются выровнять поле над ним (я уверен, что кто-то лучше разбирающийся в Swing может дать вам лучший ответ на этот вопрос).Удобный способ отладки проблем компоновки - выделить компоненты цветными рамками, например, в текущем коде:
centerGUI.setBorder(BorderFactory.createLineBorder(Color.GREEN));
add(centerGUI);
bottomGUI.setBorder(BorderFactory.createLineBorder(Color.RED));
add(bottomGUI);
Однако, если бы у меня были эти требования, я бы использовал BorderLayout
, например, этот код свободно основан на вашем, я удалил ненужные биты, чтобы сосредоточиться на части макета (вы должны делать это при задании вопросов, это позволяет другим легче отвечать на вопросы)
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Tester {
private JPanel contentPanel;
private JTextArea leftTextArea = new JTextArea();
private JTextArea rightTextArea = new JTextArea();
private JMenuBar menuBar = new JMenuBar();
public Tester() {
initialisePanel();
initFileMenu();
}
public JPanel getContent() {
return contentPanel;
}
public JMenuBar getMenuBar() {
return menuBar;
}
private final void initialisePanel() {
contentPanel = new JPanel(new BorderLayout());
Box centreBox = new Box(BoxLayout.X_AXIS);
JScrollPane leftScrollPane = new JScrollPane(leftTextArea);
JScrollPane rightScrollPane = new JScrollPane(rightTextArea);
centreBox.add(leftScrollPane);
centreBox.add(rightScrollPane);
Box bottomBox = new Box(BoxLayout.X_AXIS);
bottomBox.add(new JButton(new SaveAction()));
bottomBox.add(new JButton(new ExitAction()));
contentPanel.add(centreBox, BorderLayout.CENTER);
contentPanel.add(bottomBox, BorderLayout.SOUTH);
}
private void initFileMenu() {
JMenu fileMenu = new JMenu("File");
fileMenu.add(new SaveAction());
fileMenu.add(new ExitAction());
menuBar.add(fileMenu);
}
class SaveAction extends AbstractAction {
public SaveAction() {
super("Save");
}
@Override
public void actionPerformed(ActionEvent e) {
handleSave();
}
}
void handleSave() {
System.out.println("Handle save");
}
class ExitAction extends AbstractAction {
public ExitAction() {
super("Exit");
}
@Override
public void actionPerformed(ActionEvent e) {
handleExit();
}
}
void handleExit() {
System.out.println("Exit selected");
System.exit(0);
}
public static void main(String[] args) {
Tester test = new Tester();
JFrame frame = new JFrame("Tester");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(test.getContent());
frame.setJMenuBar(test.getMenuBar());
frame.setPreferredSize(new Dimension(600, 400));
frame.pack();
frame.setVisible(true);
}
}