Я создаю базовый пользовательский интерфейс в Swing и надеялся на некоторую помощь. Ниже приведен скриншот того, что я пытаюсь достичь:Java Swing UI Layout
Мой код в настоящее время выглядит следующим образом:
package testui;
import java.awt.Container;
import javax.swing.*;
public class TestUI{
private JTextField outputArea = new JTextField();
private JTextField errorReportArea = new JTextField();
private JPanel inputPanel = new JPanel();
private JLabel nameLabel = new JLabel("Item Name");
private JLabel numberLabel = new JLabel("Number of units (or Volume in L)");
private JLabel priceLabel = new JLabel("Price per unit (Or L) in pence");
private JTextField nameField = new JTextField(10);
private JTextField numberField = new JTextField(10);
private JTextField priceField = new JTextField(10);
private JButton addVolumeButton = new JButton("Add by Volume");
private JButton addNumberButton = new JButton("Add by number of units");
public TestUI() {
JFrame frame = new JFrame("Fuel Station");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
outputArea.setEditable(false);
errorReportArea.setEditable(false);
inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.X_AXIS));
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();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
contentPane.add(outputArea);
contentPane.add(errorReportArea);
contentPane.add(inputPanel);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
TestUI test1 = new TestUI();
}
}
который выглядит следующим образом:
Так то, что я хотел бы сделать, это установить определенный размер для двух верхних JTextFields, поскольку верхний будет содержать несколько строк текст, а один ниже будет содержать только одну строку текста. Я не уверен, как это сделать, не используя setSize, так как мне сказали, что это неправильная практика кодирования, чтобы использовать это.
Я также хотел бы добавить некоторые дополнения между JLabels, JTextFields и JButtons в нижней JPanel.
Если кто-то может дать мне некоторые предложения по изменения размера этих компонентов я был бы весьма признателен
+1 для области текста. Но, пожалуйста, вытащите _ "remove frame.pack()" _. Рамка должна быть упакована. Использование BorderLayout вместе с подсказками в строке/столбце текстовой области должно обеспечить OP то, что они хотят –
* исправлено. Я думаю, что в большинстве случаев вы должны использовать 'frame.pack()' просто так, чтобы у вас не было пустой комнаты. – Luminous
Спасибо за ваш совет, я изменил первое текстовое поле на текстовое поле и использовал outputArea.setRows (30), чтобы установить его размер. Посмотрев на менеджеров компоновки, я также изменил boxlayout моей нижней панели на FlowLayout, который хорошо работает и также включает посылку по 5 пикселей по компонентам по умолчанию – user3371750