使用BorderLayout而不是BoxLayout 。
将文本区域放在BorderLayout.CENTER ,并使用GridLayout(0, 1)将文本字段和底部面板包装在另一个面板中。 将该面板添加到BorderLayout.PAGE_END 。 文本字段的大小与底部面板的大小相同
在旁边
应该在Event Dispatch Thread上运行/启动Swing应用程序。
有关布局管理器的一般信息,请参阅使用容器布局组件
也不确定为什么您的字段和文本不可编辑。
重构
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.*;
public class Test1{
//Should components be final? Should they be defined outside of the class?
private final JTextArea outputArea = new JTextArea();
private final JTextField errorReportField = new JTextField();
private final JPanel inputPanel = new JPanel();
private final JLabel nameLabel = new JLabel("Item Name");
private final JLabel numberLabel = new JLabel("Number of units (or Volume in L)");
private final JLabel priceLabel = new JLabel("Price per unit (or L) in pence");
private final JTextField nameField = new JTextField(10);
private final JTextField numberField = new JTextField(10);
private final JTextField priceField = new JTextField(10);
private final JButton addVolumeButton = new JButton("Add by Volume");
private final JButton addNumberButton = new JButton("Add by number of units");
public Test1() {
JFrame frame = new JFrame("Fuel station shop");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//outputArea.setEditable(false);
outputArea.setRows(30);
JScrollPane scrollPanel = new JScrollPane(outputArea);
scrollPanel.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
//errorReportField.setEditable(false);
//Better way of adding multiple components to panel?
inputPanel.setLayout(new FlowLayout());
inputPanel.add(nameLabel);
inputPanel.add(nameField);
inputPanel.add(numberLabel);
inputPanel.add(numberField);
inputPanel.add(priceLabel);
inputPanel.add(priceField);
inputPanel.add(addVolumeButton);
inputPanel.add(addNumberButton);
Container contentPane = frame.getContentPane();
//Why is it adding components from bottom to top?
contentPane.setLayout(new BorderLayout());
contentPane.add(scrollPanel);
JPanel wrapper = new JPanel(new GridLayout(0, 1));
wrapper.add(errorReportField);
wrapper.add(inputPanel);
contentPane.add(wrapper, BorderLayout.PAGE_END);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
Test1 test = new Test1();
}
});
}
}
注意
如果您希望字段更大(高度方向),则可以向inputPanel添加空边框,从而导致字段也展开。 但这意味着inputPanel也会更大(可能需要也可能不需要)。 但无论哪种方式,使用GridLayout,字段和inputPanel都将具有相同的大小。
inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
另一种选择是给wrapper面板一个BorderLayout并将该字段添加到中心,给它一个EmptyBorder来扩展它的大小。
contentPane.setLayout(new BorderLayout());
contentPane.add(scrollPanel);
JPanel wrapper = new JPanel(new BorderLayout());
wrapper.add(errorReportField);
wrapper.add(inputPanel, BorderLayout.PAGE_END);
Border border = errorReportField.getBorder();
CompoundBorder compound = BorderFactory.createCompoundBorder(
border,BorderFactory.createEmptyBorder(10, 10, 10, 10));
errorReportField.setBorder(compound);
contentPane.add(wrapper, BorderLayout.PAGE_END);
这将在场的左侧给出一个小的余量(这可能是也可能不是所希望的)。 如果您不想要它,只需更改空边框的值。
createEmptyBorder(top, left, bottom, right)